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*特征做了脱敏处理,不能确定它们具体是什么).