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)
