所用到的数据:
1、上市公司信息数据
可用tushare的 stock_basic接口获取
2、股票每日信息(开、收、最高、最低价,换手率,成交量等)
可用tushare的pro_bar接口获取
3、大盘指数每日信息
可用tushare的 index_daily 接口获取
4、每日涨跌停统计
可用tushare的 limit_list接口获取
完整数据获取代码可以见github,github链接在末尾。
这里先说一些模型搭建思路。首先我们的策略是选取的是中期股(未来20天涨幅在12%以上并且这20天里最大损失在7%以内)。当某一天收盘结束时,我们先计算不同股票各个特征的值,然后给出判断是否满足我们的选股要求,若满足则在第二天以开盘价买入(买入1/5仓位)。在持股期间不加仓不减仓,若到止盈点(12%)卖出,若到止损点(7%)卖出,若达到最大持股周期(20天),则在当天收盘价卖出。
策略搭建代码
废话不说,直接上代码。
跟之前代码有些不同,这里我们先生成label,方便后面策略模型搭建(不用每次都重新生成一次label)。
核心代码如下:
首先通过平移将未来20天的最高与最低价通过pandas的merge函数merge在一起。
计算未来最高最低价与当天开盘价的涨幅比
通过循环判断,若在未来20天里,涨幅先达到12%(在跌幅达到6%之前),则标记为1.其他情况标记为0. 这里用6%跌幅是为了让我们尽量少亏一点。
制作标签的代码(MakeLabel.py)会传入github中,后续所有代码也会传入github中。
一些包导入及定义
上市公司信息获取:
读取大盘信息:
将大盘的日期提取出来生成一个dict,这么做的目的是为了给交易日编一个码,后期方便处理,因为有些股票会有停牌日导致信息丢失。
读取上市公司每日的涨跌的基本信息:
特征工程
获取星期及月份信息:
获取每日涨跌停统计,如果某天涨停数远远多于跌停数,则说明市场赚钱效应显著。
将每日成交量做一些处理,利用10天成交量均线换算成比例,开盘价等也是如此。
将大盘近五日相对于当天大盘情况换算成比例。
此时我们做的特征都是在当天收盘之后得到的特征,进行与标签merge的时候,我们需要把特征往前平移一天。因为我们的策略是在第二天的开盘价买入,制作label时是以第二天的开盘价为基准制作label的(可能讲的不太清楚)。
制作这种策略在未来策略成熟时,可以在当日收盘之后为大家推荐股票。
标签读取
模型训练
训练时间:20160101->20190101
测试时间:20190101->20191218
使用的特征:
星期;月份;当日涨停数-当日跌停数;转换后的开盘、收盘等价;近五日的收盘价、成交量(换成比例的);
一共有29个特征
模型训练,利用lgb模型训练。这里不用验证集验证,直接训练1000轮。
观察特征重要性:
从特征重要性可以发现,换手率、近几天上证指数及涨跌停情况是比较重要的特征。看上证指数和涨跌停情况说明还是需要看大盘的,大盘好赚钱效应才高。
回测
买入策略:第二日开盘价买入,持股周期20天,止盈12个点,止损7个点。
先剔除一部分涨停无法买入的股票(利用最高价是否等于收盘价判断,暂且这么判断)
回测结果:初始资金为10w,Account为自己定义的一个类,可见github看源代码
部分股票交易信息:
盈利情况:
虽然账户远远跑赢上证指数,但最大回撤有20%,有待提高。
账户市值信息:
部分股票买入卖出情况:
可以发现我们买入的股票基本都是均线走势良好的股票。
总结与感触
1、低频交易想在中期股票选取上还是非常有潜力的,短期的市场震荡情况很难捕捉,但中期市场震荡情况相当而言判断容易。
2、机器学习特别依赖训练集(数据驱动)。我曾更改训练集时间范围(还是包含了牛熊市),但模型最后的结果还是比较好的,可见选中期股票相对于短期股票而言,稳定性更强一些。
改进方向
1、首先我们的回撤还是比较大的,实盘交易时容易怀疑自己的模型。从账户市值变化图中可以发现,我们模型在大盘崩的时候没有及时抛出股票,这是因为我们的策略设置问题(只根据止盈止损和持股时间来抛股票)。对于这个问题我们可以人为设置当满足一个条件时抛出股票,或者就是让模型自己训练决定何时抛出。其实这也就是个股的交易策略,这个个股交易策略会在未来开发。
2、然后就是我的特征都是一些均线特征,还有其他一些特征可以加入,比如说上涨时的成交量与下跌时的成交量(可以判断主力洗盘还是吸货等)。
代码 github: https://github.com/wbbhcb/stock_market
对量化、数据挖掘、深度学习感兴趣的可以关注公众号,本人不定期分享有关这些方面的研究。
个人知乎:
https://www.zhihu.com/people/e-zhe-shi-wo/activities