经过和坛子里的朋友友好讨论以后,我决定还是把样本按照时间序列切除一下,把最后 100~228 行数据拿出来不放在训练和测试集里分割,做一个样本外测试集来 score 一下比较比较模型效果,看看这样做了以后,我们 3 个模型的表现。
先来三发帖子回顾:
使用 SVM 预测大盘涨跌:
https://uqer.io/community/share/584f652f6740ec004f2bd542使用决策树预测大盘涨跌:
https://uqer.io/community/share/5853f6bd954fa20047b771e3使用 Adaboost 预测大盘涨跌:
https://uqer.io/community/share/58541c566a5e6d0051dc33f5测试模型稳健性的结果发现,只剩下决策树这个最简单的模型表现得还稳健一些了(果然简简单单才是真吗?),然而对样本外测试的准确率也从对样本内测试的 0.9 跌到了 0.8 左右。而 adaboost 和 SVM 的预测准确率就在那里上下波动,上下波动……一点都不听话。
为啥 adaboost 和 SVM 在那里光波动不听话呢?它光不听话也就算了。它不光不听话,预测准确率还很有规律地要么高,要么低,也不是单纯地上下摆动。而且预测准确率极低的时候吧,和决策树对比,准确率相加恰好为 1 ,为毛相加以后准确率恰好为 1 呢?这到底是为什么呢?我怎么想都想不明白。
哎呀好气啊。:(
查看完整源代码请戳:
https://uqer.io/community/share/58557c8a954fa20050b77496根据论坛里朋友的建议,我按照时间周期重新生成了 3 个数据集,训练集,测试集,周期后测试集,来共同判断准确率。
我选用前 1900 个数据分割训练集和测试集, 1900 个数据的时间点以后的 328 来个数据预留出来,用来做时间周期后测试。
接下来先来比较 adaboost 的,然后是决策树的,最后是 SVM 的。
神奇的事情发生了……在时间点以后的数据的预测上,决策树的准确率是 0.21 ,与其他两个模型形成了鲜明对比……
啊不对, 0.21+0.79 = 1 ,有可能, SVM 的预测在时间点的最后 300 来个数据上,恰好和另外两个模型相反了。
看来我又得调用参数重要性图了……
不对! SVM 哪来的参数重要性图啊?
adaboost 和决策树的确有参数重要性这一说, SVM 是投射到高维平面上进行切割,何来参数重要性一说呢?生成 SVM 的参数重要性这件事,臣妾做不到啊……
只能过猜了, SVM 的预测,在最后这 300 来个样本外数据上,加起来得 1 ,有很大的可能,是因为与另外两个模型的预测恰好相反,也有可能,只是凑巧了,这个准确率次为 0.21 只是瞎猫碰到死耗子了。为了验证,咱这次稍微改改数据集,把时间参数点的位置稍微调一下,重新跑一下模型再测测吧……
这次又是样本外数据相加为 1 了……但是……等一下!现在不站队的是 adaboost 了! SVM 和决策树预测准确率比样本内还高了!这不科学……
看来这是逼我画图啊,好吧。
对 AdaBoost 画图了以后,发现以下几个现象:
1 、准确率随着训练集数量的增加趋于稳定。
2 、准确率要么很高,要么很低,几乎不在中间停留。
3 、准确率在对最后一个数据的预测为 0
为了进一步猜测,接下来我把 3 个模型的预测准确率图都画出来吧……
横坐标数量表示目前我们样本内数据是前多少个数据。
发现一个有趣的事,对于时间点以后的数据, SVM (绿线)和决策树表现的曲线差不多,中间有微小波动,其中 SVM 线一直是平滑变动,在样本内数据达到 2100 个(样本外数据只剩最后 28 个)时, SVM 的预测能力开始缓慢下降,渐渐达到了接近 0.2 这个极低的准确率,然后又在最后一个数据的时候准确率变动到了 100%……我认为这时候应该是大盘指数的表现恰好和 30 天前的数值上下波动,由于我们的判断就是简单的 30 个交易日以后的收盘指数是否大于今天的收盘指数,所以当指数小幅波动,一会儿超过 30 天前的,一下又大于 30 天前的时候,模型预测就没啥意义了。更改方式很简单,在预测的时候,定一个阈值,必须超过之前指数加上这个阈值,设定 True ,低于这个指数减去阈值,设定 False ,否则设定 None 就好。
顺便说一下……鉴于上面说的哪个没有加阈值的,脑残的 True , False 设定,所以单独测试一天的准确率是毫无意义的。必须测定一段周期内的准确率,所以可以认为最后那几个突然变动的线可以抹去了。
既然这样的话,那我就设定预留至少 100 个数据,这样增加计算准确率的可靠性,以防最后的因为数据太小准确率突变,再生成一次图。
这次我们发现:
1 、对于样本外数据,决策树的表现持续不错,最低也有 0.78 ,没有剧烈震动。甚至随着数据集的增加,对样本外数据的预测还略微增加了。
2 、 SVM 和 AdaBoost_score 就不行了,震动很剧烈。
3 、 SVM 和 AdaBoost_score 在每次变化两个数据的情况下, score 的变化是要么和决策树的判断相同,要么相反。希望有兴趣的朋友可以讨论一下这到底是为什么。
4 、目前来看,要预测大盘指数是可行的,在比较的 3 个模型中,决策树还是更靠谱点的。
5 、使用的样本外数据是分割的样本时间点以后, 100~228 个数据进行的 score 。有兴趣的朋友可以切割得更久远一些,也就是说模型不光预测未来短期内的数据,试试预测未来长时间的涨跌准确率。个人倾向于认为市场上的重要性因子会随着时间变化,需要定期更新模型,当然,也不排除有一些重要性因子是始终辣么重要的……有兴趣的朋友可以在数据提取的时候,选择一个更长周期的数据,中间切割个几百天,让样本外数据距离测试数据的距离更远,然后再试试不同模型的预测准确率。本人这里只试验了 3 个模型,当抛砖引玉吧。
最后我又按照周期, 100 天为单位,预测准确率,发现随着时间节点的改变,准确率的变化如图所示。
看来预测大盘这事跟时间周期确实有很大的关系啊。
查看完整源代码请戳:
https://uqer.io/community/share/58557c8a954fa20050b77496
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/328906
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.