在完成指标计算之后,我们就可以写程序遍历所有股票数据,来筛选出满足条件股票了。
在笔记(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:
603633:
可以看到,两只股票在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')
为了便于相互交流学习,新建了微信群,感兴趣的读者请加微信。