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


    1.首先,导入必要的库:

    1. import torch
    2. import torch.nn as nn
    3. import numpy as np

    2.准备数据。需要准备好包含历史股票收盘价的一维时间序列数据。在这个例子中,我们将使用NumPy模拟一些示例数据

    1. # 示例的股票收盘价时间序列数据
    2. # 假设数据点表示 2021.1.1 到 2021.1.30 每日的股票收盘价
    3. closing_prices = np.array([100.0, 101.2, 102.5, 101.8, 103.0, 102.7, 103.5, 104.2, 104.5, 105.0,
    4. 104.8, 104.9, 105.2, 106.0, 107.0, 107.5, 107.8, 108.2, 109.0, 109.5,
    5. 109.8, 110.2, 110.5, 111.0, 112.0, 112.5, 112.8, 113.0, 113.2, 113.5])
    6. # 将数据转换为PyTorch张量
    7. closing_prices = torch.tensor(closing_prices, dtype=torch.float32)

    3创建序列数据。为了使用RNN模型,你需要将时间序列数据分割成输入序列和目标序列。在这个示例中,我们将使用前N天的数据来预测下一天的股票收盘价。你可以调整N的值来控制输入序列的长度。

    1. # 定义输入序列的长度
    2. sequence_length = 5 # 使用前5天的数据来预测下一天的收盘价
    3. # 创建输入序列和目标序列
    4. def create_sequences(data, sequence_length):
    5. sequences = []
    6. targets = []
    7. for i in range(len(data) - sequence_length):
    8. seq = data[i:i + sequence_length]
    9. target = data[i + sequence_length]
    10. sequences.append(seq)
    11. targets.append(target)
    12. return torch.stack(sequences), torch.stack(targets)
    13. # 创建序列数据
    14. input_sequences, target_sequences = create_sequences(closing_prices, sequence_length)

    4定义RNN模型。在这里,我们使用一个简单的RNN模型,它有一个RNN层和一个全连接层:

    1. class StockPredictionRNN(nn.Module):
    2. def __init__(self, input_size, hidden_size, output_size, num_layers):
    3. super(StockPredictionRNN, self).__init__()
    4. self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
    5. self.fc = nn.Linear(hidden_size, output_size)
    6. def forward(self, x):
    7. out, _ = self.rnn(x)
    8. out = self.fc(out[:, -1, :])
    9. return out
    10. # 定义模型参数
    11. input_size = 1 # 输入特征的维度,这里是股票收盘价
    12. hidden_size = 64 # 隐藏层的维度
    13. output_size = 1 # 输出特征的维度,这里是预测的股票收盘价
    14. num_layers = 1 # RNN的层数
    15. # 创建模型
    16. model = StockPredictionRNN(input_size, hidden_size, output_size, num_layers)

    5定义损失函数和优化器

    1. criterion = nn.MSELoss() # 使用均方误差损失
    2. optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

    6训练模型。你需要将输入序列传递给模型,计算损失并反向传播进行优化。这里只提供一个简单的示例,实际训练通常需要更多的数据和迭代次数

    1. num_epochs = 4000
    2. for epoch in range(num_epochs):
    3. optimizer.zero_grad()
    4. outputs = model(input_sequences.unsqueeze(2)) # 添加额外的维度以匹配模型的输入要求
    5. loss = criterion(outputs, target_sequences)
    6. loss.backward()
    7. optimizer.step()
    8. if (epoch + 1) % 100 == 0:
    9. print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

    7使用训练好的模型进行预测:

    1. # 准备输入数据来预测未来5天的收盘价
    2. input_data = closing_prices[-sequence_length:].unsqueeze(0).unsqueeze(2)
    3. # 使用模型进行预测
    4. predicted_prices = model(input_data).squeeze().detach().numpy()
    5. print("预测的未来1天股票收盘价:", predicted_prices)

  • 相关阅读:
    一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版
    电饭锅一会儿通电一会儿不通电【检修原因】
    【Qt炫酷动画】1.easing官方demo详细剖析
    Linux下载微信
    第一章:变量和简单的数据类型
    如何拿取 macOS 系统中的图标文件
    Archery工单系统之inception 审计参数详解
    基于图像识别的自动驾驶汽车障碍物检测与避障算法研究
    MySQL
    Windows电脑双屏设置不一样的壁纸
  • 原文地址:https://blog.csdn.net/Metal1/article/details/133386508