1.首先,导入必要的库:
import torch
import torch.nn as nn
import numpy as np
2.准备数据。需要准备好包含历史股票收盘价的一维时间序列数据。在这个例子中,我们将使用NumPy模拟一些示例数据
# 示例的股票收盘价时间序列数据
# 假设数据点表示 2021.1.1 到 2021.1.30 每日的股票收盘价
closing_prices = np.array([100.0, 101.2, 102.5, 101.8, 103.0, 102.7, 103.5, 104.2, 104.5, 105.0,
104.8, 104.9, 105.2, 106.0, 107.0, 107.5, 107.8, 108.2, 109.0, 109.5,
109.8, 110.2, 110.5, 111.0, 112.0, 112.5, 112.8, 113.0, 113.2, 113.5])
# 将数据转换为PyTorch张量
closing_prices = torch.tensor(closing_prices, dtype=torch.float32)
3创建序列数据。为了使用RNN模型,你需要将时间序列数据分割成输入序列和目标序列。在这个示例中,我们将使用前N天的数据来预测下一天的股票收盘价。你可以调整N的值来控制输入序列的长度。
# 定义输入序列的长度
sequence_length = 5 # 使用前5天的数据来预测下一天的收盘价
# 创建输入序列和目标序列
def create_sequences(data, sequence_length):
sequences = []
targets = []
for i in range(len(data) - sequence_length):
seq = data[i:i + sequence_length]
target = data[i + sequence_length]
sequences.append(seq)
targets.append(target)
return torch.stack(sequences), torch.stack(targets)
# 创建序列数据
input_sequences, target_sequences = create_sequences(closing_prices, sequence_length)
4定义RNN模型。在这里,我们使用一个简单的RNN模型,它有一个RNN层和一个全连接层:
class StockPredictionRNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size, num_layers):
super(StockPredictionRNN, self).__init__()
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.rnn(x)
out = self.fc(out[:, -1, :])
return out
# 定义模型参数
input_size = 1 # 输入特征的维度,这里是股票收盘价
hidden_size = 64 # 隐藏层的维度
output_size = 1 # 输出特征的维度,这里是预测的股票收盘价
num_layers = 1 # RNN的层数
# 创建模型
model = StockPredictionRNN(input_size, hidden_size, output_size, num_layers)
5定义损失函数和优化器
criterion = nn.MSELoss() # 使用均方误差损失
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
6训练模型。你需要将输入序列传递给模型,计算损失并反向传播进行优化。这里只提供一个简单的示例,实际训练通常需要更多的数据和迭代次数
num_epochs = 4000
for epoch in range(num_epochs):
optimizer.zero_grad()
outputs = model(input_sequences.unsqueeze(2)) # 添加额外的维度以匹配模型的输入要求
loss = criterion(outputs, target_sequences)
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
7使用训练好的模型进行预测:
# 准备输入数据来预测未来5天的收盘价
input_data = closing_prices[-sequence_length:].unsqueeze(0).unsqueeze(2)
# 使用模型进行预测
predicted_prices = model(input_data).squeeze().detach().numpy()
print("预测的未来1天股票收盘价:", predicted_prices)