天天看點

Python量化交易學習筆記(16)——政策篩股

在完成名額計算之後,我們就可以寫程式周遊所有股票資料,來篩選出滿足條件股票了。

在筆記(14)中,我們看到在幾組回測實驗中,選取5日線及60日線的金叉買入、死叉賣出政策,最終能擷取最高(僅限于幾組實驗資料)的資産。本文将嘗試選取出前一日5日線金叉60日線的股票。

實驗資料截止至2020年3月20日,即我們的政策要選取截止至2020年3月20日,最新的兩根K線出現5日線金叉60日線的股票,相關代碼為:

# 判斷金叉
def golden_crossover(df, fast, slow):
    # K線數目不足,次新股
    if df.shape[0] < slow:
        return False
    # 技術名額名稱    
    fast_indicator = 'ma_%d' % fast
    slow_indicator = 'ma_%d' % slow
    # 最後一日短期均線在長期均線上方,且倒數第二日短期均線在長期均線下方
    return 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]
           

如果股票資料滿足金叉條件,代碼傳回True,否則傳回False。代碼先判斷目前股票的K線是否能計算出長期均線的值,來排除一些次新股K線數目不足的幹擾。然後通過比較最後兩日短期均線和長期均線的關系來判斷是否金叉。

通過周遊股票資料,共篩選出滿足條件股票25隻:000150,000720,…,603633,603955。

我們來抽兩隻看下K線圖,觀察最後兩根K線及均線情況,白色均線為5日線,黃色均線為60日線。

000150:

Python量化交易學習筆記(16)——政策篩股

603633:

Python量化交易學習筆記(16)——政策篩股

可以看到,兩隻股票在3月20日均出現5日線與60日線的金叉,驗證了我們程式的正确性。

友情提示:本系列學習筆記隻做資料分析,記錄個人學習過程,不作為交易依據,盈虧自負。

政策篩股代碼:

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
import datetime  # 用于datetime對象操作
import os.path  # 用于管理路徑
import sys  # 用于在argvTo[0]中找到腳本名稱
import pandas as pd

# 判斷金叉
def golden_crossover(df, fast, slow):
    # K線數目不足,次新股
    if df.shape[0] < slow:
        return False
    # 技術名額名稱    
    fast_indicator = 'ma_%d' % fast
    slow_indicator = 'ma_%d' % slow
    # 最後一日短期均線在長期均線上方,且倒數第二日短期均線在長期均線下方
    return 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/TQDown2020v1/data/stock_code_update.csv'
stk_pools = pd.read_csv(stk_code_file, encoding = 'gbk')
out_df = pd.DataFrame(columns=['code'], dtype = str)
# 對每個股票進行判斷
for stk_code in 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')
           

為了便于互相交流學習,建立了微信群,感興趣的讀者請加微信。

Python量化交易學習筆記(16)——政策篩股