完整文章:
https://blog.zmcx16.moe/2021/11/fb-prophet.html
Github程式码:
https://github.com/zmcx16/stock-forecast
最近觉得自己美股转换标的的时机都不是很好, 抄底常抄在半山腰, 就想说来研究一下预
测趋势好了, 虽然知道要预测市场趋势基本上不可能, 变因变量太多, 不过就当作小参考
也好, 至少能大概知道从过去来看目前大致的趋势是向上或向下也不错~。
Note:
以下的内容只是实验用, 行情预测要考虑的变因变量太多, 也没有绝对永远适用的方法,
建议把以下内容当做一种类似均线的参考就好。
FB Prophet时序模型公式:
y(t) = g(t) + s(t) + h(t) + e(t)
g(t) 代表趋势,直接透过线性模型来回归出大致上的趋势
s(t) 代表周期的变化,日周期,周周期,年周期等
h(t) 代表假日的变化,假日周期可能会影响到持有股价的意愿。
e(t) 包含了模型没有涵盖的错误或者是变化
从公式看可以知道主要是以趋势跟周期的变化去拟合未来的预测结果。 基本上单针对行
情预测这件事来说, 最重要的就是趋势的预测, 年周期的部分则是对淡旺季有所帮助, 节
假日的部分或许也或多或少有帮助 (e.g. 感恩节, 黑色星期五等?)。
接着就来测试看看模型的效果如何, 测试资料就先选AT&T的近一年股价资料, 首先把近一
年的资料拆成9:1, 前10.8个月当训练资料, 后1.2个月当测试资料, 再来评估模型的效
果:
https://i.imgur.com/7SssPt4.png
上面黑色的点是真实资料的点价位, 蓝色的线则是模型训练完后模拟出的结果, 浅蓝色的
区块则是预测线的上限及下限, 可以当成模型认为可能的最大误差, 至于Y轴的值为什么
跟股价不一样, 是因为有先对资料做对数转换, 把资料变得更平稳并且预测的趋势能更趋
于线性。
https://i.imgur.com/hbIMXHK.png
第二张图则是Prophet其他component的图, 上面那张是趋势预测图, 基本上前大半部分会
跟这一年的股价差不多拟合, 而最后面那一段有淡蓝色区块的则是实际预测的部分。 而
下面那张图是用每周循环的预测, 基本上意义不大就不看了~。
https://i.imgur.com/vusifta.png
最后第三张图则是在把资料做对数反转换, 还原回原本的股价资料, 光从AT&T本身的股价
趋势就觉得会继续往下跌, 模型预测出的结果也就是符合他近期的下跌趋势, 在加一些怪
怪的小循环震荡...。
比较有意思的地方是, 预测的股价下限趋势差不多是维持一样的斜率, 可是上限则是往上
持平, 应该可以想成模型认为股价之后可能会继续用差不多的速度往下跌, 或是转为盘整
趋势。 再来最后我们可以用测试资料跟预测资料算一下平均误差跟均方误差:
MSE: 1.2798056068411054
MAE: 1.0764610288441487
单纯用平均误差看, 跟真实股价平均差一块钱左右, 以25块的股价算差不多是4%, 1.8个
月的预测资料跟真实资料落差4%价格, 这样的结果是好或不好, 其实我也不太能把握, 毕
竟AT&T的beta本来就小, 如果是波动大的个股, 只落差4%的话我是会觉得很厉害...。
跑完上面的模型, 在来重新思考一下, 上面的模型只是单纯用近10.2个月的收盘价, 去预
测后面1.8个月的收盘价, 就只是个单变量的模型, 可是股票市场的变量何其多, 单用收
盘价就去预测未来资讯太少了, 能准确预测反而才奇怪。
关于这点, Prophet本身是可以接受添加附加的回归量来训练模型的, 只不过必须在训练
资料跟预测资料上都有想加的回归量才行, 可是未来的资料不可能会有, 只能用某些方法
才能生成出来。 这边选的简单作法就是, 先把你想加的回归量都做一遍预测, 然后拿这
些预测的回归量当作你真正要预测的模型的附加回归量, 这样就可以只依靠训练资料做多
变量预测模型了, 在这边我额外加入了Open High Low Volume作为附加的回归量, 并来预
测未来收盘价的结果:
https://i.imgur.com/YBnW6CM.png
https://i.imgur.com/8TE693C.png
https://i.imgur.com/K6jYUiR.png
恩....看第一张图跟第三张图, 可以发现预测线跟上下限极度贴合实际的股价, 其实这结
果不太意外, 因为附加的回归量有开盘价跟最高价以及最低价, 而这三种资料跟收盘价本
来就是极度相近的, 所以画出来会长这样我倒是不太意外...。
再来看最后一段预测的结果, 趋势来说还是一样的, 只是上下限的部分也极度贴合, 这通
常就两种情况, 一是真的精准度很高, 预测神准, 不过想也知道不太可能; 而第二种情况
是最有可能的, 就是overfitting过度学习了, 来看看最终测试资料的平均误差跟均方误
差结果:
MSE: 1.1426736398003121
MAE: 0.9865404828745983
结果还真的比只用收盘价的模型好了近10%, 我是觉得只是运气好啦... 关于这个问题就
先放一边, 因为上面的预测模型看起来就太overfitting了, 这次附加回归量我去掉Open
High Low, 只用Volume试试看, 因为Volume本身跟价格无关, 应该不会在有上面那种极度
拟合的预测图, 下面是跑完的结果:
https://i.imgur.com/R2grNEn.png
https://i.imgur.com/I4tQS7L.png
https://i.imgur.com/aEZVm04.png
MSE: 1.3153719245816298
MAE: 1.0991889378931168
看起来跟只用收盘价预测差不多, 不过均方差跟平均差反而更大了, 其实要说不意外也是
不意外, 毕竟交易量大增有可能大涨也有可能大跌, 至于到底往上走还是往下走都是概率
的问题, 猜错方向就是大错...。
上面部落格完整文章另外有用AAPL实验的结果, 碍于篇幅就不写在这了, 有兴趣的话可以
在到blogger上看。