做者在自学机器学习的过程当中,尝试开发了一个基于机器学习的A股选股工具。本文是在赤兔的“数据挖掘”小组分享的这次开发过程和心得体会的整理。python
股票价格的可预测性——工具的意义git
关于股票价格的可预测性,我想引入有效市场假说(EMH)。大体的意思就是像股市这样的系统,全部的信息都应该反映在价格变化里面了。github
基于此,由于基本面、政策面信息已经囊括在价格变化里面了,单纯从技术面作分析理论上是可行的。不过目前确实尚未任何一种工具或者技术能彻底预测和打败市场。算法
就选股工具而言,由于股票的数目众多,天天都有新的变化,其目的主要是替代一部分人工重复劳动,节约成本。没有“砖家”能够彻底预测股价,虽然工具也不太可能,可是只要作到和人同样好,甚至更好,就有价值。数据库
A股选股器开发过程微信
数据来源网络
就财经类的数据而言,如今各大门户网站都有专门的频道,信息不少,若是对实时要求高,经过爬虫取其中有用的部分应该是一个办法。
机器学习
另外,经过搜索引擎,能够发现前辈们总结出的一些public的接口,也能够取到一些数据。我在开发这个工具的时候用的是叫作tushare的一个python接口。它是免费的,提供结构化的数据,感受天天更新也挺快。函数
预处理工具
拿到数据后第一步是作预处理。我认为股票的数据主要是作归一化,使得不一样股票具备可比性。好比涨幅百分比,复权等等。
“复权”的意思是:股票除权、除息以后,股价会发生较大幅度的跃变,这种看似价格变化,实际持股成本并不变化。复权就是对股价和成交量进行权息修复。
数据拿到后,由于只会有1张表,所以选择了一个NoSQL数据库来存储。大概8年2000多只股票,有300万条数据左右。
传统算法建模
建模的第一步尝试是基于传统的算法。首先是选取和计算特征值,涨幅,交易量,boll指标,横盘状态等等。关于这些指标的含义,有兴趣的朋友能够去搜索一下,都不太难,用基本的统计学知识就能够计算。
这些特征值都有之后,能够基于人为经验设计一些基本的过滤器,好比PPT中的图片就描述了一种可能的筛选条件。
我相信证券专业人士必定有更好的基于经验的筛选条件,但愿也能够分享出来我学习下。可是在个人实验中,基于人的经验来设计过滤器,准确率并不高,50%多一点,也就是比随机的选股稍微好一点。
机器学习建模
接下来考虑选取合适的机器学习算法。机器学习的算法不少,对于算法选取,个人考虑主要是这样的。
线性回归模型偏简单,而股市不该该是线性的。
由于非线性,支持向量机(SVM)的核函数和参数的选取也会比较难。
对于神经网络,确实是在财经领域用的不少的算法,当初没有选择由于本身的计算资源有限,担忧训练的难度较大。
最终选择用决策树的缘由是模型算法都比较成熟,训练的计算复杂度也在本身可接受范围内。
对算法有研究的朋友欢迎评论本文,一块儿探讨下。
决策树建模
对决策树算法,我沿用了传统算法的特征值,也就是对于描述模型的数据指标,和传统算法是同样的。
样本训练用了WEKA这个工具,具体算法选择的是C4.5。决策树的算法确实也有多种选择,C4.5是其中一种比较成熟的算法。
上面截图里面是训练出的其中一棵决策树,python描述的,代码有60000多行。
验证模型
先说准确率。某一个交易日的准确率等于,工具预测的股票在下一个交易日确实上涨的个数占总的推荐股票个数的比例。对若干个交易日的准确率取一个平均,能够获得模型的准确率。
而召回率在这里是工具预测的股票在下一个交易日确实上涨的个数占整个股市中股票上涨个数的比例。应该不难理解,对于选股工具咱们应该更关心准确率。
改进模型
为了提升准确率,在开发过程当中,我作了下面这些改进尝试:
一个是扩大样本。最初是用了最近3年的数据,后来考虑到A股从2007年到2015年刚好走过了一个上涨到降低再到上涨的完整周期,所以扩大到了8年的数据。
再是对算法的改进,我尝试引入了“推荐指数”的概念。由于原本决策树只作分类,而利用推荐指数能够看得出来哪些更好,哪些是通常好。
还有是考虑对样本进行分类训练,好比按照板块,行业等等,由于有理由认为同一类股票的价格变化规律会更为接近。
请你们先看看上图右边的表格的黑色字体部分。大部分交易日的准确率在80%以上。所以相比于传统算法,效果确实好了一些。
而后能够注意一下表格红色字体的日期。其实这些红色的日期,有至关一部分是股灾日。股灾日常常是“千股跌停”,上涨的股票太少了…能够看出在这些“股灾日”的时候,模型也不太准确,出现了失真。
总结与心得
选股工具利用机器学习算法,通常状况下比传统的算法(或者人为经验)的准确率高。
推荐的股票虽然不必定都会上涨,可是其实人工再去看的话,也会发现他们的曲线和指标看起来是确实不错的(尽管谁都不肯定下一个交易日是涨仍是跌)。
因此我认为,本工具帮助人天天去海量的筛选股票应该是可行的,短线操做人员能够基于本工具的推荐再作进一步的综合决策。
最后是一些心得体会分享给你们:
第一,我以为建模的特征值选取其实挺关键的,若是之后要作进一步的改进或者开发别的系统,我会花更多时间来作这个。
第二,股灾日的模型失真与数据颗粒度的关系。本工具旨在作短线推荐,即推荐下一交易日上涨几率较大的股票。
个人数据都是以交易日为单位的,因此很难体现较短期内的信号变化,好比忽然的跟风抛售会形成放量下跌。若是提升颗粒度到小时或者分钟,也许会更好些,不过那样数据量也会multiply。
第三,股票天天都有新的数据进来,如何使用这些增量数据而不用从新训练,这个多是将来须要考虑的问题。
我之前看到过有增量的决策树以及增量学习的神经网络,有可能更加适用。
第四,开发过程当中碰到了python的解析器的局限,读取决策树的时候程序crash,后来想办法绕开了。
因为是工做之余作的,我可以花在整个项目的时间仍是颇有限。边学边写,比较仓促。
你们能够去 https://github.com/josephzhong/stock 获取源码。
本文分享自微信公众号 - 悦思悦读(yuesiyuedu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。