这是一篇对前面部分内容的一个总结,利用机器学习从0到1开发量化选股策略。本篇文章没有代码,只是从文字角度叙述策略开发的流程。
目前有很多量化回测的平台可以供大家开发策略,但使用这些回测平台有个弊端。其弊端在于若需要构造一些复杂的策略,那些平台就无法满足我们的要求,因为1)当我们训练的策略模型比较复杂时,比如训练深度学习模型,可能需要好一点的机器,而这些机器平台可能无法提供或代价昂贵;2)平台很多东西都是封装好的,你无法添加自己想要的操作。
因此本篇文章将从0到1利用机器学习构造自己的中期股票选取的量化策略。利用机器学习构建策略的流程图如下:
Step 1:获取数据存入本地。
Step 2:对原始数据进行预处理及标签制作。
Step 3:特征工程:提取特征。
Step 4:选择机器学习模型并进行模型训练。
Step 5:利用训练好的模型进行回测。
Step 6:模型超参调整,重复step 4、step 5、及step 6。选择较优的超参组合。
对于模型的超参调整后文不作介绍,基本方法就是单独调整某一超参观察效果的改变情况再决定超参的设置。
1 数据获取
数据获取是进行一个机器学习项目研究中的第一个步骤。tushare提供了一个很好的数据获取接口。如下图我们可以通过tushare获取一些股票数据。
[图片上传失败...(image-25f808-1583048696087)]
这里我们获取的数据主要有:
1) 股票基础信息,包括股票代码、名称、上市日期、退市日期等。
2) 每支股票日线信息,包括股票的开盘价、收盘价、最高价、最低价、换手率、成交量等。
3) 每日涨停跌停的统计。
4) 个股资金流向(大中小单流量)
详细的数据获取步骤可以见下面链接或直接看代码,代码在文章末尾。
数据获取教程:https://blog.csdn.net/qq_31611005/article/details/103788527
2 数据处理及标签制作
1)数据处理
股市中经常会有一些利好利空,而这些利好利空都会造成股价突然大幅上涨或下跌。所以经常会剔除一些这种异常数据。但因为剔除数据比较耗费时间,在这里我并未剔除数据。但在模型训练之前我仅剔除了特征中存在nan值的数据。
2)标签制作
机器学习可以分为有监督学习、无监督学习以及强化学习三个类别。在这里我们将其转化为有监督学习。而有监督学习也可以分为回归问题与分类问题。下文我们将选股问题转化为分类问题。
那如何给数据标标签呢?首先我认为仅仅使用K线数据很难选取一些短线股,短线股还要考虑一些消息面啥的。所以在标标签的时候我也是从中线股的选取角度进行标标签的。假设未来时间最高收益在12%以上,最高损失在7%以上,则label为1,否则为0。(注意一下,如果先达到最高12%的收益,即使最后损失在7%以上我们仍标记label为1,因为此时我们已经止盈卖出了,我的止盈点设置为12%。)
3 特征工程
在机器学习领域有一句话叫,特征决定模型的上限,而模型的选择或优化只是去逼近这个上限。由此可见,特征的挖掘是非常重要的。
本文一共构造了29个特征,所有构造的特征如下:
1) 所在星期及月份信息,通常而言股票的涨跌都有是有周期性的,总会在业绩好的那个月份上涨。
2) 每日涨跌停统计,如果某天涨停数远远多于跌停数,则说明市场赚钱效应显著
3) 经处理后的当日的开盘价、收盘价、最低价、最高价。不同股票的价格肯定都不一样,如果直接把开盘价等当做特征输入显然是不合适的,需要将这些价格进行一定处理。这里我们的处理方式为: (价格-10日线股价)/10日线股价。价格表示开盘价、收盘价等,而10日线价格也是随每天变动的。
4) 处理后的历史前5天的收盘价,处理方式与3)相同。
5) 处理后的成交量特征,处理方式与3)相同。
6) 大盘近5日处理后的收盘指数,处理方式与3)类似。
7) 换手率特征。
4 模型训练
1) 模型选择
对于模型的选择,我这边选择了lightGBM模型,下面简称为lgb模型。Lgb模型是一种优秀的集成树模型。在传统的特征挖掘的数据竞赛中,LGB、xgboost、catboost号称三大杀器。对于一个数据量巨大的任务中,我个人认为lgb不仅在运行速度上而且在效果上也会好于另外两种模型。因此在模型上我选择了lgb模型。
2) 数据集划分
训练集时间跨度:20160101->20181231
回测时间:20190101->20191218
3) 模型超参设置
以下参数设置为个人多次数据竞赛的经验参数。
num_leaves:31
min_data_in_leaf:20
objective:binary
boosting:gbdt
4) 特征重要性分析
Lgb有自带的特征重要性查看借口,以下为特征的重要性排序(截取了部分重要特征)。
特征解释:
turnover_rate:换手率
pre_close_index_000001_shift_:指数历史收盘价,最后的数字表示历史前多少天(与当前偏移的天数)。
Pre_close_shift_:个股收盘价,后面的数字与前面相同。
amount_index_000001_shift_:大盘成交量,后面的数字意思与前面相同
amount shift:个股成交量,后面的数字意思与前面相同
U-D:涨停数-跌停数
High_transform:转换后的当日最高价。Low_transform类似。
Vol:转换后的成交量
Month: 月份
从排序中可以发现,换手率、近几天上证指数及涨跌停情况是比较重要的特征。看上证指数和涨跌停情况说明还是需要看大盘的,大盘好赚钱效应才高。除此之外月份也是比较重要的特征,说明还是有一定周期性的。
5 回测
在模型训练完成之后,输入个股的特征,模型会根据特征计算符合我们选股要求的概率(未来20天收益率在12%以上)。设置阈值为0.5,如果大于0.5则表示满足我们的选股要求,否则不满足。
我们的投资策略为:每天根据计算得到概率依概率大小依次买入(这个概率必须大于0.5),每支股票买入当前总市值的20%,也就是1/5仓位。股票的买入价格为当天收盘价,个股的最大持股周期为20天。个股的止盈点为12%,个股的止损点为7%。(对于买入的股票已经剔除了涨停票)
对于回测函数的编写这里不作介绍,可见源代码或链接。(源代码在末尾的github链接中,回测系统教程链接为:https://blog.csdn.net/qq_31611005/article/details/103834578
5.1 回测结果
回测初始资金为10w。
部分股票交易情况:
表中各个参数指标都比较好理解,这里不作说明。
一些指标统计:
账户盈利远远超过上证指数,交易胜率也较高。
账户市值变动曲线:
从市值变化曲线看,虽然前期还稍微落后大盘,但到后面则遥遥领先大盘。
5.2 模型合理性分析
对于模型设计的是否合理,仅仅看收益率等指标是不合理的,还需要看模型具体挑了什么买点。这点非常重要!!!通过观察模型选出来的买点,如果买点匪夷所思则可能是代码写错或是其他原因。
当模型的回测数据良好并且买点合适,才可以上模拟盘再实验一段时间。等模拟盘表现良好时才可以上实盘。
总结
本篇文章介绍了从0到1搭建一个中期选股策略。模型仍有许多不足之处,如风险控制扔不合理,仅用止损点是不合适的,除此之外特征也需要进一步挖掘。
本文的所有代码均已上传至github:
https://github.com/wbbhcb/stock_market
代码运行顺序为:
DataDownload.py->CountLimit.py->MakeLabel.py->中线股选股策略1.ipynb
有关代码的一些说明介绍:
DataDownload.py: https://mp.weixin.qq.com/s/SjTHqyxjsi7izP5XG_lUkg
回测类: https://mp.weixin.qq.com/s/0QyljyQRcB9PRTSu_XUoGw
中线股选股策略1.ipynb: https://mp.weixin.qq.com/s/L0p2Z71vorV39qSucQIlFg