当前位置:   article > 正文

使用Pytorch实现简单的LSTM股票预测框架_lstm 数值预测 pytorch 知乎

lstm 数值预测 pytorch 知乎

1.数据获取

使用TuShare获取数据(需要在tushare网站申请账号,获取token号)

取1-4月数据作为训练集,5月数据作为测试集(测试集数据提取代码同训练集)

  1. ts.set_token('208cf0f7e03acf9024568071ab959d8cf3d1908385a7009906dc66d5')
  2. pro = ts.pro_api()
  3. time_temp = datetime.datetime.now() - datetime.timedelta(days=1)
  4. end_dt = time_temp.strftime('%Y%m%d')
  5. #准备训练集数据
  6. df = ts.pro_bar(ts_code='603912.SH', start_date='20210101', end_date='20210501', freq='D')
  7. df.head() #用 df.head() 可以查看一下下载下来的股票价格数据,显示数据如下:
  8. #把数据按时间调转顺序,最新的放后面
  9. df = df.iloc[::-1]
  10. df.reset_index(inplace=True)
  11. # print(df)
  12. training_set = df.loc[:, ['close']]
  13. #只取价格数据,不要表头等内容
  14. training_set = training_set.values
  15. #数据归一化
  16. sc = MinMaxScaler(feature_range = (0, 1))
  17. training_set_scaled = sc.fit_transform(training_set)
  18. # print(training_set_scaled)
  19. X_train = []
  20. y_train = []
  21. devia=10
  22. for i in range(devia, len(training_set_scaled)):
  23. X_train.append(training_set_scaled[i-devia:i])
  24. y_train.append(training_set_scaled[i, training_set_scaled.shape[1] - 1])
  25. X_train, y_train = np.array(X_train), np.array(y_train)
  26. print(X_train.shape)
  27. print(y_train.shape)

2.构建简单LSTM模型


  • 原理部分

参考博客:人人都能看懂的LSTM - 知乎 (zhihu.com)

                LSTM细节分析理解(pytorch版) - 知乎 (zhihu.com)

容易出现问题的地方是LSTM输入和输出以及他们之间的关系,下面借这张图来说明一下:

我们要做的是通过对被预测序列(在此为时序序列)的学习 ,来预测该序列后面最新一天的数值。

输入即被预测序列,输入大小为batch_size*seq_len*input_size(每个时序的特征数量)——具体介绍可以看pytorch的官方文档(见下文代码部分)

我们要获取的输出是最新一天的数据,大小为batch_size*1。

明白了这些之后我们来看lstm网络的结构(下图),input和output已经清楚了,假设input的时间序列长度为t,每个时间对应的数据都进入一个蓝色方块,这样的蓝色方块一共有n层,是lstm的隐藏层。然后我们再横着看,在每一层蓝色方块中,左边的蓝色方块的值会作用于右边的蓝色方块,也就是前一天的数据对后面的数据造成的影响。

这样最右上角蓝色方块(t,n)的输出,就经历了所有隐藏层的输出,也经历了所有之前时间序列的作用,就是我们想得到的预测值。


  • 代码部分

API文档:LSTM — PyTorch 1.9.0 documentation

将LSTM模型构建为一个类,需要初始化init()函数和forward()函数。

  1. class LSTMNET(nn.Module):
  2. def __init__(self, input_size=1, hidden_layer_size=160, output_size=1,num_layers=8):
  3. super(LSTMNET,self).__init__()
  4. self.lstm_layer=nn.LSTM(input_size, hidden_layer_size, num_layers, batch_first=True)
  5. self.out_layer1 = nn.Linear(hidden_layer_size,output_size,bias=True)
  6. self.out_layer2 = nn.Linear(num_layers,output_size,bias=True)
  7. def forward(self,share):
  8. out,(h,c)=self.lstm_layer(share.to(torch.float32))
  9. out=h
  10. a,b,c=out.shape
  11. out=out.reshape(b,a)
  12. out=self.out_layer2(out)
  13. return out

3.训练模型

采用RMSE(均方根误差)作为损失函数对模型进行优化

  1. for i in range(epochs):
  2. for shares, labels in train_loader:
  3. train = Variable(shares, requires_grad=True)
  4. labels = Variable(labels, requires_grad=True)
  5. outputs= model(train)
  6. loss_mse = loss_MSE(outputs.float(), labels.float())
  7. loss_rmse = torch.sqrt(loss_mse)
  8. loss_mae = loss_MAE(outputs.float(), labels.float())
  9. optimizer.zero_grad()
  10. loss_rmse.backward()
  11. optimizer.step()
  12. count=count+1
  13. if count%100==0:
  14. rmse.append(loss_rmse.data)
  15. mae.append(loss_mae.data)
  16. if i==epochs*bs-1:
  17. a,_=outputs.shape
  18. for j in range(a):
  19. pred.append(outputs[j])
  20. actl.append(labels[j])
  21. print("epoch:{} Train: RMSE:{:.8f} MAE:{:.8f} ".format(i, loss_rmse.data, loss_mae.data))

 4.画图

画出原始股票价格和预测股票价格的对比图像,同时绘制损失函数在训练过程中的图像

  1. plt.figure()
  2. plt.plot(pred,"r-")
  3. plt.plot(actl,"b-")
  4. plt.figure()
  5. plt.plot(rmse,"r-")
  6. plt.plot(mae,"b--")

预测结果: 

 

 完整代码:(将在项目结束后公开,敬请期待)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/168000
推荐阅读
相关标签
  

闽ICP备14008679号