python N天擇時選股策略

  • 2019 年 11 月 1 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_44580977/article/details/102317978

《海龜交易法則》中介紹了一種趨勢類的擇時策略——N日突破策略。策略的核心思想為:當天收盤價超過N1天內最高價認為上升趨勢成立,作為買入訊號;當天收盤價低於N2天內最低價格認為下跌趨勢成立,作為賣出訊號。也就是說,N日趨勢突破買入即為N日創新高買入,股價創出階段性新高或歷史新高後,一方面說明該股有資金在運作,相對比較強勢,更容易順勢而上,另一方面創新高後近期買入的投資者都有獲利,上檔的套牢盤比較少,股價上沖的阻力也較小,更容易繼續上漲。反之,N日趨勢跌破時賣出的邏輯思維一樣成立。

實現常式

# N日突破擇時策略  import pandas_datareader.data as web  import pandas as pd  import numpy as np  import datetime  import matplotlib.pyplot as plt      #股票數據獲取及處理介面  def GetStockDatApi(stockName=None,stockTimeS=None,stockTimeE=None, N1=15,N2=5):        stockdata = web.DataReader(stockName, "yahoo", stockTimeS, stockTimeE)        stockdata['N1_High'] = stockdata.High.rolling(window=N1).max()#計算最近N1個交易日最高價      expan_max = stockdata.Close.expanding().max()      stockdata['N1_High'].fillna(value=expan_max,inplace=True)#目前出現過的最大值填充前N1個nan        stockdata['N2_Low'] = stockdata.Low.rolling(window=N2).min()#計算最近N2個交易日最低價      expan_min = stockdata.Close.expanding().min()      stockdata['N2_Low'].fillna(value=expan_min,inplace=True)#目前出現過的最小值填充前N2個nan        #收盤價超過N1最高價 買入股票持有      buy_index = stockdata[stockdata.Close > stockdata.N1_High.shift(1)].index      stockdata.loc[buy_index,'signal'] = 1      #收盤價超過N2最低價 賣出股票持有      sell_index = stockdata[stockdata.Close < stockdata.N2_Low.shift(1)].index      stockdata.loc[sell_index,'signal'] = 0      stockdata['signal'].fillna(method = 'ffill',inplace = True)      stockdata['signal'] = stockdata.signal.shift(1)      stockdata['signal'].fillna(method = 'bfill',inplace = True)        return stockdata    # N日突破買賣訊號區間顯示  skip_days = 0    df_stockload = GetStockDatApi("600410.SS",datetime.datetime(2018, 10, 1), datetime.datetime(2019, 4, 1))    print(df_stockload)  df_stockload.Close.plot()    for kl_index, today in df_stockload.iterrows():      if today.signal == 1 and skip_days == 0:  # 買入          skip_days = -1          start = df_stockload.index.get_loc(kl_index)          plt.annotate('買入',xy=(kl_index,df_stockload.Close.asof(kl_index)),xytext=(kl_index, df_stockload.Close.asof(kl_index)+2),arrowprops=dict(facecolor='r',shrink=0.1),horizontalalignment='left',verticalalignment='top')          print("buy:",kl_index)      elif today.signal == 0 and skip_days == -1:  # 賣出          skip_days = 0          end = df_stockload.index.get_loc(kl_index)          if df_stockload.Close[end] < df_stockload.Close[start]:  # 賠錢顯示綠色              plt.fill_between(df_stockload.index[start:end], 0, df_stockload.Close[start:end], color='green', alpha=0.38)          else:  # 賺錢顯示紅色              plt.fill_between(df_stockload.index[start:end], 0, df_stockload.Close[start:end], color='red', alpha=0.38)          plt.annotate('賣出',xy=(kl_index,df_stockload.Close.asof(kl_index)),xytext=(kl_index+datetime.timedelta(days=5), df_stockload.Close.asof(kl_index)+2),arrowprops=dict(facecolor='g',shrink=0.1),horizontalalignment='left',verticalalignment='top')          print("sell:",kl_index)  plt.legend(loc='best')  plt.title(u"華勝天成 N日突破擇時")  plt.show()    """  #買/賣時間  buy: 2018-11-07 00:00:00  sell: 2018-11-26 00:00:00  buy: 2019-01-17 00:00:00  sell: 2019-01-22 00:00:00  buy: 2019-02-19 00:00:00  """

輸出

總結

介紹了N日突破擇時策略的實現,需要說明的是該策略中並未考慮風險因素、設定止損機制、倉位分配機制,並且也忽略了手續費,僅作為入門研究參考