Python 语言 用 PyTorch 实现 LSTM 时间序列预测 股票收盘价

Python阿木 发布于 2025-06-09 10 次阅读


使用 PyTorch 实现 LSTM 时间序列预测:股票收盘价预测

时间序列预测是金融领域中的一个重要应用,它可以帮助投资者预测股票价格的趋势,从而做出更明智的投资决策。在众多时间序列预测模型中,长短期记忆网络(LSTM)因其能够捕捉时间序列数据中的长期依赖性而备受关注。本文将使用 PyTorch 框架实现一个基于 LSTM 的股票收盘价预测模型。

环境准备

在开始之前,请确保您已经安装了以下 Python 包:

- PyTorch
- NumPy
- Matplotlib
- Pandas

您可以使用以下命令安装这些包:

bash
pip install torch numpy matplotlib pandas

数据准备

我们需要获取股票收盘价数据。这里我们以某支股票为例,使用 `pandas-datareader` 库从互联网上获取数据。

python
import pandas_datareader.data as web
from datetime import datetime

设置股票代码和日期范围
stock_code = 'AAPL'
start_date = datetime(2010, 1, 1)
end_date = datetime(2020, 1, 1)

获取股票数据
data = web.DataReader(stock_code, 'yahoo', start_date, end_date)

数据预处理

在训练模型之前,我们需要对数据进行预处理,包括归一化和创建时间窗口。

归一化

归一化是将数据缩放到一个固定范围(通常是 0 到 1)的过程,这有助于模型更快地收敛。

python
from sklearn.preprocessing import MinMaxScaler

创建归一化器
scaler = MinMaxScaler(feature_range=(0, 1))

归一化收盘价
data['Close'] = scaler.fit_transform(data[['Close']])

创建时间窗口

我们将使用滑动窗口的方法来创建时间序列数据。每个窗口包含一定数量的历史数据,用于预测未来的股票价格。

python
def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset) - look_back - 1):
a = dataset[i:(i + look_back), 0]
X.append(a)
Y.append(dataset[i + look_back, 0])
return np.array(X), np.array(Y)

look_back = 60
X, Y = create_dataset(data['Close'].values.reshape(-1, 1), look_back)

构建LSTM模型

现在我们可以使用 PyTorch 构建一个 LSTM 模型。

python
import torch
import torch.nn as nn
import torch.optim as optim

定义 LSTM 模型
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTMModel, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)

def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).requires_grad_()
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).requires_grad_()
out, _ = self.lstm(x, (h0.detach(), c0.detach()))
out = self.fc(out[:, -1, :])
return out

设置模型参数
input_size = 1
hidden_size = 50
num_layers = 1
output_size = 1

实例化模型
model = LSTMModel(input_size, hidden_size, num_layers, output_size)

定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

训练模型

接下来,我们将使用训练数据来训练模型。

python
将数据分为训练集和测试集
train_size = int(len(X) 0.67)
test_size = len(X) - train_size
trainX, testX = X[0:train_size], X[train_size:len(X)]
trainY, testY = Y[0:train_size], Y[train_size:len(Y)]

将数据转换为 PyTorch 张量
trainX = torch.tensor(trainX, dtype=torch.float32)
trainY = torch.tensor(trainY, dtype=torch.float32)
testX = torch.tensor(testX, dtype=torch.float32)
testY = torch.tensor(testY, dtype=torch.float32)

训练模型
num_epochs = 100
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(trainX)
loss = criterion(outputs, trainY)
loss.backward()
optimizer.step()

if epoch % 10 == 0:
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')

预测和评估

在训练完成后,我们可以使用测试数据来评估模型的性能。

python
预测测试集数据
model.eval()
test_outputs = model(testX)

反归一化预测结果
test_predictions = scaler.inverse_transform(test_outputs.detach().numpy())
test_actuals = scaler.inverse_transform(testY.numpy())

绘制预测结果和实际值
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5))
plt.plot(test_actuals, label='Actual')
plt.plot(test_predictions, label='Predicted')
plt.title('Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Price')
plt.legend()
plt.show()

结论

本文使用 PyTorch 实现了一个基于 LSTM 的股票收盘价预测模型。通过训练和测试,我们发现模型能够较好地捕捉股票价格的趋势。需要注意的是,股票市场受到多种因素的影响,因此预测结果仅供参考。

在实际应用中,您可以根据需要调整模型参数、增加特征或尝试其他时间序列预测模型,以提高预测精度。