在完成指標計算之後,我們就可以寫程序遍歷所有股票數據,來篩選出滿足條件股票了。
在筆記(十四)中,我們看到在幾組回測實驗中,選取5日線及60日線的金叉買入、死叉賣出策略,最終能獲取最高(僅限於幾組實驗數據)的資產。本文將嘗試選取出前一日5日線金叉60日線的股票。
實驗數據截止至2020年3月3日,即我們的策略要選取截止至2020年3月3日,最新的兩根K線出現5日線金叉60日線的股票,相關代碼為:
<code>def
golden_crossover
(df, fast, slow)
:if
df.shape[0
] < slow:return
False
fast_indicator ='ma_%d'
% fast slow_indicator ='ma_%d'
% slowreturn
df[fast_indicator][df.index[0
]] > df[slow_indicator][df.index[0
]] \and
df[fast_indicator][df.index[1
]] < df[slow_indicator][df.index[1
]]/<code>
如果股票數據滿足金叉條件,代碼返回True,否則返回False。代碼先判斷當前股票的K線是否能計算出長期均線的值,來排除一些次新股K線數目不足的干擾。然後通過比較最後兩日短期均線和長期均線的關係來判斷是否金叉。
通過遍歷股票數據,共篩選出滿足條件股票46只(當前數據集未包含近期的次新股):000301、000509……601800、603699。
我們來抽兩隻看下K線圖,K線圖截取自2020年3月4日,包含了該日的K線,我們需要看的是3月2日及3月3日的K線,即觀察倒數第二、三根的K線及均線情況,白色均線為5日線,黃色均線為60日線。
000509:
603699:
可以看到,兩隻股票在3月3日均出現5日線與60日線的金叉,驗證了我們程序的正確性。
友情提示:本系列學習筆記只做數據分析,記錄個人學習過程,不作為交易依據,盈虧自負。按照5日線60日線金叉策略,000509在金叉後的一天在下跌,603699則是上漲。
策略篩股代碼:
<code>from
__future__import
(absolute_import, division, print_function, unicode_literals)import
datetimeimport
os.pathimport
sysimport
pandasas
pddef
golden_crossover
(df, fast, slow)
:if
df.shape[0
] < slow:return
False
fast_indicator ='ma_%d'
% fast slow_indicator ='ma_%d'
% slowreturn
df[fast_indicator][df.index[0
]] > df[slow_indicator][df.index[0
]] \and
df[fast_indicator][df.index[1
]] < df[slow_indicator][df.index[1
]] stk_code_file ='../TQDat/data/tq_stock_code.csv'
stk_pools = pd.read_csv(stk_code_file, encoding ='gbk'
) out_df = pd.DataFrame(columns=['code'
], dtype = str)for
stk_codein
stk_pools['code'
]: stk_code ='%06d'
% stk_code input_file ='./tmp/'
+ stk_code +'.csv'
df = pd.read_csv(input_file, index_col =0
) df = df.sort_index(ascending =False
)if
golden_crossover(df,5
,60
): out_df = out_df.append({'code'
: stk_code}, ignore_index =True
) print(stk_code) out_df.to_csv('./output/stock_picking.csv'
)/<code>