(PyTorch)使用 LSTM 预测时间序列(股票)

目标

学习使用 LSTM 来预测时间序列,本文中使用上证指数的收盘价。

运行环境

Python 3.5+, PyTorch 1.1.0, tushare

数据获取与处理

首先用 tushare 下载上证指数的K线数据,然后作标准化处理。

原始数据:上证指数从2018-01-01到2019-05-24的收盘价(未标准化处理)

把K线数据进行分割,每 DAYS_FOR_TRAIN 个收盘价对应 1 个未来的收盘价。例如K线为 [1,2,3,4,5], DAYS_FOR_TRAIN=3,那么将会生成2组数据:
第1组的输入是 [1,2,3],对应输出 4;
第2组的输入是 [2,3,4],对应输出 5。

然后只使用前70%的数据用于训练,剩下的不用,用来与实际数据进行对比。

定义网络、优化器、loss函数

训练

测试

结果与总结

结果,绿色虚线右边的是预测结果

本文的代码是参考网上的文章写的,没有专门调超参数。左边的红线在一开始都是0,是因为输入到模型的经过预处理的数据比原数据要短DAYS_FOR_TRAIN,网上的一些实现没有进行补全( 如文末的“相关参考1、2” ),会导致红线和蓝线有水平偏移。在我简单地修复了水平偏移后,可以发现在绿色线左边的训练集部分,拟合效果是非常的好。这是正常的,因为在训练集中过拟合很正常。但是,在绿线右侧,效果也相当好(在“相关参考3”中,甚至靠前几年的数据“预测”到了最近两年的数据),这似乎不太正常——真有这样的准确率,还需要上学/上班吗?

我觉得,这应该是模型在eval的时候,数据输入的问题。在pred_test = model(dataset_x) 这里,把全量的数据喂给了模型——这已经把真正的价格给了模型了,这应该是错误的。

我可以随便给一个模型,用今天的价格预测明天的价格,具体实现就是明天的价格=今天的价格(再加上一点微小的偏离?),放在这样一个这样的一个scale里面,保证看起来也很精确。但这对实际操作是没有指导价值的。

回到刚才的 LSTM 模型,它是根据前 n 天的价格预测下一天的价格。在这么多个“下一天的价格”里面,有多少是准确的(只考虑涨/跌),有多少的偏离,还需要进一步的探索。

相关参考

  1. https://github.com/L1aoXingyu/code-of-learn-deep-learning-with-pytorch/tree/master/chapter5_RNN/time-series
  2. https://blog.csdn.net/baidu_36669549/article/details/85595807
  3. https://blog.csdn.net/a19990412/article/details/85139058

最后附完整代码

发表评论

验证码 *