实战量化投资大赛之二 _GBDT 模型

1. 说明

  对股票预测这种典型的时序问题,使用梯度下降决策树,确实是有点生搬硬套.主要思路是想使用提供的特征值 f1-f87,看看哪些特征更加重要.

  具体方法是把历史数据用计算趋势和移动平均线的方式添加到特征之中,此时记录的前后顺序就不再重要,用 122 天(半年)后的价格作为结果Y,随机将所有记录分成训练集和测试集,做回归模型.线上最高得分 47 左右.

2. 特征工程

  用 GBDT 模型主要是特征工程和调参,一开始我只是加了一些趋势和与均线关系的特征,预测后取前 20,线上得分 34 左右.觉得这个模型几乎没法用.然后分析了取出的 top20 是怎样一些股票,发现其中多一半都包含停牌或者高送转.预测不成功的原因是:没做数据清洗,这里确实需要一些行业背景知识.

  不只是 GBDT 模型,用统计模型也一样,这些特殊值都会成为干扰项.在去掉了高送转,次新股,停牌之后,同样的模型,RMSE 误差不到之前的 1/3,比之前靠谱多了.

  具体工作如下:

(1) 合并数据

  把数据合成一个大文件,用 pickle 格式保存,pickle 是 python 的序列化格式,它并不比 csv 节约空间,但读取速度快.

(2) 提取统计特征

  这里是将第一赛段的 900 多支股票,每天的数据计算均值,得出类似大盘指数,以代表整体趋势,同时还计算了每天的各股价格与指数之比,从而可以统计出各股一段时间之内的趋势比大盘强还是比大盘弱.

(3) 缺失值和标准化

  对所有脱敏的特征 f* 做标准化,并将其缺失值设为0,即均值.

(4) 计算序列特征

  计算当前值与 20,60,122,244 日均线之间的涨跌关系,同时生成 Y,将各股当日数据之后第 122 天的数据做为目标 Y,加入数据集,供监督学习使用.

(5) 计算斜率

  根据各股某日以及前所有日期数据,用直线拟合,计算其斜率,作为该日斜率,这和之前计算的"与 N 日均线之间的涨跌关系"类似.

(6) 标注特殊数据

  由于高送转会影响影响超势,均线等数据,像送转,次新又都具有其自身的规则.暂时标注,短期不处理.

  计算各支股票数据的开始日期,以判断是否为次新股,计算每支股票数据各有多少天的数据,以判断停牌时长.

3. 关于模型

  前篇分享的纯趋势模型.它是先计算出整体趋势,在各股趋势中除去了整体趋势,然后做线性拟合,选出斜率最大的 20 支股票.线上分数 48.5.

  本篇分析的阶度下降决策树,具体用的是 lightgbm 模型做回归.线上分数 47.

  对比两种模型各选出前 20 支,只有两支相同,但分数都高于平均水平.值得注意的是:很多用决策树算出要涨的股票,作图后看着趋势是向下的,但是模型整体评分还是不错.也就是说从特征中可以提取到趋势以外的东西.这可能是基于基本面的预测(由于 f* 特征做了脱敏处理,不能确定它们具体是什么).