最简单的RNN预测股票收盘价

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)

最简单的RNN预测股票收盘价_第1张图片

你可能感兴趣的:(rnn,深度学习,机器学习)