基于LSTM的股票价格预测

本文通过PyTorch实现了一个LSTM模型来预测股票价格,利用tushare获取平安银行的历史数据,经过数据处理,构建训练和测试集。模型训练200轮后,观察到损失在50轮左右收敛。最后,模型对未来7天的股票价格进行了预测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言 

本文通过LSTM来对股票未来价格进行预测,并介绍一下数据获取、处理,pytorch的模型搭建和训练等等。

数据获取

这里我使用tushare的接口来获取平安银行(000001.SZ)股票的历史10年的数据

import tushare as ts

pro = ts.pro_api('your token')
df = pro.daily(ts_code='000001.SZ', start_date='20130711', end_date='20220711')

由于本文只用到股票的开盘价、收盘价、最高价、最低价,所以只用到了一个接口,tushare除了这个接口以外还有许多数据接口,感兴趣的读者可以去Tushare大数据社区查询。

用mplfinance库绘制一下获取的数据

import pandas as pd
import mplfinance as mpf
df.index=pd.to_datetime(df.trade_date)#索引转为日期
df = df.iloc[::-1]#由于获取的数据是倒序的,需要将其调整为正序
mpf.plot(df[-50:],type='candle')#绘制最近50天的数据

绘制结果如下

 数据处理

我们需要使用历史200天的数据来预测未来7天的数据,所以接下来需要对获取到的数据进行处理

dataX=[]#属性
dataY=[]#标签
k=0
tempX=[]#储存某个历史200天数据
tempY=[]#储存某个未来7天数据
for index, rows in df.iterrows():
    if k<200:
        k+=1
        tempX.append([rows['open'],rows['close'],rows['high'],rows['low']])
        continue
    if k<207:
        k+=1
        tempY.append([rows['open'],rows['close'],rows['high'],rows['low']])
        continue
    dataX.append(tempX[:])
    dataY.append(tempY[:])

    tempX=tempX[1:]+tempY[:1]

    tempY=tempY[1:]
    tempY.append([rows['open'],rows['close'],rows['high'],rows['low']])
dataX.append(tempX[:])#加上最后一项
dataY.append(tempY[:])#加上最后一项

这样我们就得到两个一一对应的列表,dataX对应某个时间节点的历史200天数据,dataY则是该时间节点的未来7天数据,接下来将他们划分为训练集和测试集,并转化为DataLoader

import torch
import torch.utils.data as Data

dataX=torch.tensor(dataX)#列表转Tensor
dataY=torch.tensor(dataY)#列表转Tensor

dataset=Data.TensorDataset(dataX,dataY)
train_size=int(0.8*len(dataset))
test_size=len(dataset)-train_size
train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])#以8:2比例划分训练集和测试集

train_loader = Data.DataLoader(
            dataset=train_dataset,
            batch_size=64,
            shuffle=True
        )
test_loader = Data.DataLoader(
            dataset=test_dataset,
            batch_size=64,
            shuffle=True
        )

模型搭建

我们使用torch.nn中的LSTM来作为预测模型

LSTM参数介绍如下

  • input_size:输入x的特征数量
  • hidden_size:隐藏层h的特征数量
  • num_layers:隐藏层层数
  • bias:是否使用偏置,默认为:True
  • batch_first:若为True,则输入形状为(batch, seq, feature),否则为(seq, batch,feature),默认为False
  • dropout: 如果非零,则在除最后一层之外的每个LSTM层的输出上引入Dropout层,概率等于dropout
  • bidirectional:若为True,则表示该LSTM为双向的
  • proj_size:若大于0,将使用具有相应大小的投影的LSTM,默认为0

搭建的模型如下

from torch.nn import LSTM,Module,Linear
class MyModel(Module):
    def __init__(self):
        super(MyModel,self).__init__()
        self.lstm=LSTM(input_size=4,hidden_size=4,num_layers=2,batch_first=True)
        self.linear=Linear(800,28)#将结果映射到7天的数据
    def forward(self,x):
        return self.linear(self.lstm(x)[0].reshape(-1,800))

模型训练

使用均方误差作为损失函数,Adam为优化器训练200轮

import torch.nn.functional as F
model=MyModel()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
lossList=[]#记录训练loss
lossListTest=[]#记录测试loss
for epoch in range(200):
    loss_nowEpoch=[]
    model.train()
    for step, (batch_x, batch_y) in enumerate(train_loader):
        out=model(batch_x)#模型输入
        Loss = F.mse_loss(out,batch_y.view(-1,28))#loss计算,将batch_y从(64,7,4)变形为(64,28)
        optimizer.zero_grad()#当前batch的梯度不会再用到,所以清除梯度
        Loss.backward()#反向传播计算梯度
        optimizer.step()#更新参数
        loss_nowEpoch.append(Loss.item())
        break
    lossList.append(sum(loss_nowEpoch)/len(loss_nowEpoch))

    loss_nowEpochTest = []
    model.eval()
    for step, (batch_x, batch_y) in enumerate(test_loader):
        out = model(batch_x)
        Loss = F.mse_loss(out, batch_y.view(-1, 28))  # 将batch_y从(64,7,4)变形为(64,28)
        loss_nowEpochTest.append(Loss.item())
        break
    lossListTest.append(sum(loss_nowEpochTest)/len(loss_nowEpochTest))

    print(">>> EPOCH{} averTrainLoss:{:.3f} averTestLoss:{:.3f}".format(epoch+1, lossList[-1],lossListTest[-1]))

绘制loss的下降图


import matplotlib.pyplot as plt
plt.plot(list(range(200)),lossList,label='Train')
plt.plot(list(range(200)),lossListTest,label='Test')
plt.legend()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

loss下降图如下

可以看到在50轮左右其实就收敛了

再根据最近200天来预测未来7天的数据

X=torch.tensor(df[['open','close','high','low']][-200:].to_numpy())
Y=model(X.view(1,200,4).float()).reshape(7,4)
result=pd.DataFrame(torch.vstack((X,Y)).detach().numpy())
result.index=list(df.index[-200:])+[pd.Timestamp('2022-07-12 00:00:00'),pd.Timestamp('2022-07-13 00:00:00'),
                              pd.Timestamp('2022-07-14 00:00:00'),pd.Timestamp('2022-07-15 00:00:00'),
                              pd.Timestamp('2022-07-18 00:00:00'),pd.Timestamp('2022-07-19 00:00:00'),
                              pd.Timestamp('2022-07-20 00:00:00')]
result.columns=['open','close','high','low']
mpf.plot(result[-21:],type='candle')

 

后七天即为未来七天的预测结果 

### 基于 LSTM股票价格预测所需 Python 第三方库 为了实现基于长短期记忆网络(LSTM)的股票价格预测模型,需要依赖多个 Python 第三方库。以下是主要涉及的库及其功能: #### 1. **TensorFlow 和 Keras** TensorFlow 是一种广泛应用于深度学习任务的强大框架,而 Keras 则是一个高级神经网络 API,能够运行在 TensorFlow 上方[^1]。Keras 提供了简洁易用的接口来构建复杂的神经网络结构,包括 LSTM 层。通过这两个库可以轻松定义、编译和训练 LSTM 模型。 #### 2. **Pandas** Pandas 是一个强大的数据分析工具包,特别适用于处理时间序列数据。它可以用来加载、清洗和转换金融数据集中的历史股价记录,便于后续建模使用[^3]。 #### 3. **NumPy** NumPy 是科学计算的基础库,在矩阵运算方面表现优异。由于深度学习本质上涉及到大量的数值操作,因此 NumPy 经常被用于准备输入特征张量或将预测结果转化为可解释的形式。 #### 4. **Matplotlib 或 Seaborn** 这些可视化库可以帮助绘制股价走势图表或者展示模型性能指标曲线图,从而更直观地理解数据模式及验证算法效果。 #### 5. **Scikit-learn** 尽管 Scikit-learn 更侧重传统机器学习方法而非深度学习技术,但它仍然提供了一些非常有用的辅助函数,比如 `train_test_split` 方法分割训练测试集合;还有像 MinMaxScaler 类这样的标准化处理器对象,可用于调整原始数值范围使之更适合神经网络接受作为输入[^2]。 ```python from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(data) ``` 综上所述,要成功搭建并应用一个基于 LSTM 架构来进行股票市场行情预报的应用程序,则至少需安装上述提及到的所有外部软件组件。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值