LSTM 股价预测pytorch

1.查看数据

 

2. 结果

        

 

 

 

3.代码

#!/usr/bin/env python
# coding: utf-8

# In[1]:


get_ipython().run_line_magic('config', 'Completer.use_jedi = False')


# In[2]:


import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
from torch.utils.data import Dataset,DataLoader
from sklearn.preprocessing import MinMaxScaler


# In[3]:


filePath = './000001SH_index.csv'
seq_len = 8
batch_size = 64
input_size = 1
hidden_size = 8
num_layers = 1


# In[4]:


sc = MinMaxScaler(feature_range=(-1,1))


# In[5]:


raw_data = pd.read_csv(filePath)
data = raw_data.loc[:,['close']]
data = pd.DataFrame(sc.fit_transform(data))
X = []
Y = []
for i in range(data.shape[0]-seq_len):
    X.append(np.array(data.iloc[i:i+seq_len,:].values,dtype=np.float32))
    Y.append(np.array(data.iloc[i+seq_len,0],dtype=np.float32))

x_train,x_test = X[:int(len(Y)*0.9)],X[int(len(Y)*0.9):]
y_train,y_test = Y[:int(len(Y)*0.9)],Y[int(len(Y)*0.9):]

print(np.array(x_test).shape)
print(np.array(x_train).shape)


# In[6]:


raw_data.close[:int(len(Y)*0.9)].plot(figsize=(16,4))
raw_data.close[int(len(Y)*0.9):].plot(figsize=(16,4))
plt.show()


# In[7]:


class MyDataSet(Dataset):
    def __init__(self,X,Y):
        super().__init__()
        self.xx,self.yy = X,Y
    
    def __getitem__(self,index):
        return self.xx[index],self.yy[index]
    
    def __len__(self):
        return len(self.yy)
    
    
    
trainDataSet = MyDataSet(x_train,y_train)
testDataSet = MyDataSet(x_test,y_test)
trainLoader = DataLoader(dataset=trainDataSet, batch_size=batch_size,shuffle=True)
testLoader = DataLoader(dataset=testDataSet, batch_size=batch_size,shuffle=True)


# In[8]:


class LSTM(nn.Module):
    def __init__(self,input_size,hidden_size,num_layers):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        
        self.lstm = nn.LSTM(input_size = self.input_size,hidden_size = self.hidden_size,num_layers=self.num_layers,batch_first=True)
        self.liner = nn.Linear(in_features=self.hidden_size,out_features=1)
        
    def forward(self, x):
        _, (hidden, cell) = self.lstm(x)
        out = self.liner(hidden)
        return out.reshape(-1,1)
    
model = LSTM(input_size,hidden_size,num_layers)


# In[9]:


optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
loss_function = nn.MSELoss()


# In[10]:


epochs = 200
"""
data_x  batch_size, seq_size, input_size=1
data_y  batch_size, 1

"""
for epoch in range(epochs):
    for i,(data_x,data_y) in enumerate(trainLoader):
        pred = model(data_x)
        pred = pred.reshape(-1)
        loss = loss_function(pred, data_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    if epoch % 10 ==0:
        print("epoch:{},loss========{}".format(epoch+10,loss.item()))


# In[11]:


y_pred = []
y_label = []
with torch.no_grad():
    pred = model(torch.from_numpy(np.array(X)))
    y_pred.extend(sc.inverse_transform(pred))
    
    
    
y_label = np.array(Y).reshape(-1,1)
y_label = sc.inverse_transform(y_label)


plt.figure(figsize=(16,4))
plt.plot(y_label)
plt.plot(y_pred)
plt.show()


plt.figure(figsize=(16,4))
plt.plot(y_label[0:100],label='raw data')
plt.plot(y_pred[0:100], label='pred data')
plt.legend()
plt.show()

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Pytorch是一种深度学习框架,可以用来构建神经网络模型。股票预测是金融领域的研究热点,支持向量机(SVM)、随机森林(RF)以及循环神经网络(RNN)等都可以用来做股票预测。其中LSTM(Long Short-Term Memory)是一种特殊的循环神经网络,能够解决传统RNN存在的梯度消失或梯度爆炸的问题,能够更好地处理长期依赖关系。 针对股票预测问题,可以通过Pytorch搭建LSTM模型进行预测。模型的输入是历史股价的时间序列数据,输出是未来一段时间(比如一天或一周)的股价预测。具体步骤包括数据预处理、数据划分、模型搭建、模型训练和预测等。 对于数据预处理,应该先对原始数据进行清理和处理,去除异常值和缺失值,然后对数据进行归一化处理,以便使得数据尺度一致,便于训练。对于数据划分,将历史数据划分为训练集和测试集,通常采用80%的数据作为训练集、20%的数据作为测试集,并采用滚动窗口的方式将数据进行重叠,以增加数据量和模型的准确性。 接着,搭建LSTM模型。可以使用PyTorch中预定义好的LSTM模型,也可以自定义LSTM模型进行训练。要注意设定好模型中的超参数,如隐藏层的大小、激活函数、学习率等等。进行模型训练时,使用训练集进行反向传播和优化,以降低损失函数的值,提高模型的预测准确率。最后,使用测试集对模型进行预测,并计算预测值与真实值之间的误差。 总之,利用pytorch构建的LSTM模型可以对股票价格进行预测。具体问题需要根据不同需求进行实际操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值