凤凰金融量化投资比赛-预赛总结

文章目录
  1. 1. 写在最前
  2. 2. 比赛感想
  3. 3. 技术总结
    1. 3.1. 股票剔除
    2. 3.2. 因子筛选
      1. 3.2.1. 因子处理
      2. 3.2.2. 相关性计算
    3. 3.3. 预测
  4. 4. 写在最后

写在最前

这是第一次参加金融数据类型的比赛,最后能进入决赛真的特别开心,非常感谢团队里老师和队友的支持和帮助~
然后说一下比赛最刺激的就是距离截止今天(最后一天)还有半小时左右的时候开始疯狂刷新页面,当时名次卡在20名,要是再掉下去一名就没有机会了,几乎就是刚刚十点钟上课铃响的时候还是稳在第20,可以说是很幸运了,最后,放一张截图留念一下。

比赛感想

凤凰金融总的比赛分为A榜和B榜,A榜一共四轮,B榜前20进入决赛。

最早接触这个比赛的时候刚好四月份左右,A榜的前两轮方向不太对,这个比赛和传统的投资选股策略不一样,没有每天的收盘价,最高价,最低价,换手率,以及明确的因子信息,我们手上仅有的只有上百(后面第四轮和B榜数据达到上千)支股票两年的收盘价和87个没有明确的指标。
最初的问题就是有以下3个:
1.股票剔除;
2.因子筛选;
3.预测。

具体的技术细节我会在第三部分记叙,最初的时候我们花一周左右的时间完成了股票剔除这个部分,但是一开始没有明确最后想进决赛这一点,所以我尝试了布林带这个东西,不过这个就涉及到技术指标选股,这个在选股中恰恰是比较忌讳的一点。

第三周的时候我把之前写过的剔除股票,布林带等等这些功能都模块化,最后实现直接运行后自动剔股保存并绘制图片,然而这个还是和因子没什么关系,我之前选取因子的时候算法没想好,导致收集分类完每只股票单独对应的因子几乎就是十几二十分钟左右,导致我一度放弃过这个方法。

团队里的老师们给过我们一周的时间去做一些相关的调研,那个时候我刚好看到了一本书叫做《华尔街45年》,不过对这次比赛没有起到实质作用,倒是我学了一点投资相关的简单的知识。

后来第五周我又花了一周时间学习了SVM相关的一些原理,发现还是比较偏分类使用,第六周最终明确下来要进决赛,我开始思考怎么预测的问题,最本质的问题依旧是怎么预测,但是仅有的只有87个因子,我重新查了一些资料,然后找到了多因子选股建模这个模型,里面确实涉及到SVM预测这一块,但是这里又确实需要对因子数据进行处理,应了那句话,“道路是曲折的,结果是不变的”,最终,我还是必须解决因子筛选这个问题,也幸好某天上课的时候我刚好来灵感想到了现在这个方法(见后面技术介绍),把时间压缩到了5-13s,最终完成建模。

预测效果最好的是在第三轮,因为当时数据量只有第四轮的1/3,失真还不是很严重,但是第四轮的时候分数就相对降低,直到B榜给出了更特殊的数据,导致这个预测算法的值再次降低(全部参赛队伍的分数均下降),由此可见,模型确实存在诸多问题需要改进,团队里的一个老师说过,我在参考文献的时候是抱着看SVM预测的目的去看,但是写文献的人又存在一定技术选股的方法,而我并没有发现这一点,这个观点我是认同的,第一次参加金融类型的比赛我确实存在很多方面的欠缺,对重点问题缺乏把握,也很感谢团队的老师每次都能给我们指出问题,提供我们改进的思路,也才会有最后的结果!

技术总结

这个框架是在Windows平台下使用Python3.6进行开发的,主要依托于Python下面的numpy,pandas,sklearn,scipy这几个库,同时第二版代码我做改进的时候摒弃了第一版过度追求自动化的心态,加入了一点人工的成分,同时也提高时间效率。

股票剔除

股票剔除是建立在把所有股票的收盘价汇总的情况下进行剔除的,对收盘价进行处理后汇成一张总表后面直接调用。
剔除的股票遵循以下两个原则:
1.剔除两年内不定期停盘超过61天(三个月)的股票;
2.剔除连续涨停20天的股票。
但是这样处理后股票的数目下降接近一半,这里有一个需要注意的点就是可能删除股票的过程中也删除了得分较高的股票。

因子筛选

因子这里分为两部分:因子处理与相关性计算。

因子处理

先说一下之前比较差的版本,我抽取了所有的股票名生成一个list,通过读取对应的股票名在488张表里面来分别读取每个因子,最后再单独汇总,这样确实很慢。
改进的版本就是,每次直接读取一行,也就是一天内87个因子所有的数据,这样就能提高效率。

相关性计算

这个比较容易,直接调库函数计算即可,保留相关性大于0.6或者小于-0.6(负相关)的因子(这里可以不用做归一化处理)。
最后使用Python的字典存储每支股票对应的因子数。

预测

根据因子筛选中筛选出来的因子,使用sklearn下面的svm预测模型,以最后半年的数据来预测未来半年的走势,这里的参数用的是因子,但是存在一个问题,如果预测时间太长或者数据太大,数据容易失真。

写在最后

金融类型的比赛需要更多知识储备,同时需要学习更多的预测模型,下一次比赛之前可以进行更多的学习,可以通过多模型交叉的方式来获取最优解。