1. 说明
昨天在群里看到了:凤凰金融量化投资大赛,详情见: http://www.dcjingsai.com/common/cmpt/%E5%87%A4%E5%87%B0%E9%87%91%E8%9E%8D%E9%87%8F%E5%8C%96%E6%8A%95%E8%B5%84%E5%A4%A7%E8%B5%9B_%E7%AB%9E%E8%B5%9B%E4%BF%A1%E6%81%AF.html 看了一下数据,大概是利用过去两年N支股票的数据,预测未来半年的走势,然后再从这N支股票里选出20-50支作为组合,看谁的组合半年后收益最大,以此排名.数据包含股票代码,收盘价,和八十多个脱敏后的特征.
2. 一些想法
我关注的一支股票,昨天跌停了,今天该买还是该卖?单看涨跌和趋势线是没法判断.涨跌和很多因素有关,比如跌停日的交易量,消息面,基本面,外盘,大盘涨跌,近期趋势.一般跌停次日的涨跌的概率等等,人基本是通过这些因素综合判断.
估计上述的很多成分被包含在比赛提供的80多个特征之中(毕竟是专业人士给出的数据).于是特征工程就简单了很多,可以更多地关注模型.当然像标准化,移动平均线这些特征还是需要做.
再看模型,预测未来半年走势,是时序问题,提供的多个特征,可以使用决策树分类或回归.提交的结果又用到排序.最近时序和特征的比赛特别多,前一段的盐城上牌,汽车销售,正在进行中的阿里妈妈转化率都是.
此题是对股票数据的一种呈现方式,以此类推,只要我们有基本面,技术面,消息面的大量数据,也可以构造类似的问题.比如说,把涨跌看成二分类问题,用历史数据训练,可能将命中率从0.5提高到0.6,看起来提升不大,但是如果机构有大量资金,可以购买几十上百支股票组合,并且有一个较长的交易时间段,那么算法的提升对应的就是收益,这也是大数定律的含义.
3. 一种简单的方案
今天做了一种非常简单的方案,线上得分48左右,下面介绍一下原理.
(1) 数据
每个CSV代表一天的数据,按照从1-488的从小到大的时间序列顺序排列.文件中,第一列是股票代码,第二列是收盘价,后面是脱敏特征.
首先是把所有数据都放在一起,如果还存成csv的话,大概185M,总共有934支股票,取每天各股的均值,作为大盘指数看待,整体走势如下:
这种情况不太常见,股票在三个月内涨了一倍,又迅速跌回原位.看了其中几支股票,和大盘走势都比较相似.
(2) 分析
先分析一下,争取最大程度地简化问题.因为不能空仓,无论大盘是涨是跌,手里必须拿着至少20支股票.就算未来半年暴跌,大家也必须持有.所以这个题的目标是不一定能赢利,但需要跑赢大盘,跑赢其他人,可以看作各股和大盘之间的关系.
当然大盘的趋势对选股也有影响,比如在下降趋势中就趋向更保守的操作.选股个数在20-50之间,预测的股票个数越多,算法越保守,因为排在后面的趋势没那么明显. 本次的具体解决方案是:取出大盘指数,然后挑选和大盘相比走势最强的20支股票,整个过程中只用了线性拟合,也没拆分训练测试集,只是最最简单的方法.
(3) 去掉大盘趋势
实验证明,去掉大趋势时,除法比减法效果更好.因为对不同股票作归一化不太容易,这里选择了除法.下面四条曲线中,红色是大盘走势,蓝色为某股走势,黄色为该股减大盘,绿色为该股除大盘,相对的,绿色曲线更能表征该个股的特征,去除大盘的因素,绿线趋势向上,其斜率即紫色线.
计算周期不一定是两年,可以是一年,半年等等,计算出它的斜率,再比较出斜率最大的前20,就是该模型的结果. 这个模型也有些问题,比如,选出来的很多是次新股,另外,还要考虑当前的价格是不是太贵了,如果最终价格离直线太远,是不是趋势已改变.这些在后期做模型的时候,都需要抽象成特征.目前,这些我都通过图观察出来的,并且在程序里直接加了判断.
话说,这比赛奖金不高.要是真能搞出几个靠谱的模型,谁还在意奖金?有时候一开始玩就不由自主地看得重排名.这个比赛争取用开放的心态来做,不用别人的baseline,自己的东西也不藏着掖着,边做边写文档.比赛的官方交流是QQ群,貌似还不是只针对这个比赛的,看看有没有也想玩的,咱们建个钉钉群?