天天看点

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)——策略筛股