PyTorch Transformer 预测股票价格,虚拟数据

该文章介绍了如何使用深度学习库PyTorch构建一个基于Transformer的模型,对股票价格进行短期预测。模型使用了自回归序列数据和MSE损失函数,训练后预测未来5天的股票价格走势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np


num_days = 200
stock_prices = np.random.rand(num_days) * 100



input_seq_len = 10
output_seq_len = 5
num_samples = num_days - input_seq_len - output_seq_len + 1

src_data = torch.tensor([stock_prices[i:i+input_seq_len] for i in range(num_samples)]).unsqueeze(-1).float()
tgt_data = torch.tensor([stock_prices[i+input_seq_len:i+input_seq_len+output_seq_len] for i in range(num_samples)]).unsqueeze(-1).float()


class StockPriceTransformer(nn.Module):
    def __init__(self, d_model, nhead, num_layers, dropout):
        super(StockPriceTransformer, self).__init__()
        self.input_linear = nn.Linear(1, d_model)
        self.transformer = nn.Transformer(d_model, nhead, num_layers, dropout=dropout)
        self.output_linear = nn.Linear(d_model, 1)

    def forward(self, src, tgt):
        src = self.input_linear(src)
        tgt = self.input_linear(tgt)
        output = self.transformer(src, tgt)
        output = self.output_linear(output)
        return output

d_model = 64
nhead = 4
num_layers = 2
dropout = 0.1

model = StockPriceTransformer(d_model, nhead, num_layers, dropout=dropout)


epochs = 100
lr = 0.001
batch_size = 16

criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=lr)

for epoch in range(epochs):
    for i in range(0, num_samples, batch_size):
        src_batch = src_data[i:i+batch_size].transpose(0, 1)
        tgt_batch = tgt_data[i:i+batch_size].transpose(0, 1)
        
        optimizer.zero_grad()
        output = model(src_batch, tgt_batch[:-1])
        loss = criterion(output, tgt_batch[1:])
        loss.backward()
        optimizer.step()

    print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.item()}")



src = torch.tensor(stock_prices[-input_seq_len:]).unsqueeze(-1).unsqueeze(1).float()
tgt = torch.zeros(output_seq_len, 1, 1)

with torch.no_grad():
    for i in range(output_seq_len):
        prediction = model(src, tgt[:i+1])
        tgt[i] = prediction[-1]

output = tgt.squeeze().tolist()
print("Next 5 days of stock prices:", output)


### Transformer预测模型的代码实现 以下是基于PyTorch框架的一个简单Transformer预测模型的代码实现示例。此代码展示了如何构建一个基本的Transformer结构并用于序列预测任务。 ```python import torch import torch.nn as nn class TransformerPredictor(nn.Module): def __init__(self, input_dim, output_dim, d_model=512, nhead=8, num_layers=6, dropout=0.1): super(TransformerPredictor, self).__init__() # 输入嵌入层 self.embedding = nn.Linear(input_dim, d_model) # Positional Encoding 层 self.positional_encoding = PositionalEncoding(d_model, dropout) # Transformer Encoder 层 encoder_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead, dim_feedforward=2048, dropout=dropout) self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) # 输出层 self.fc_out = nn.Linear(d_model, output_dim) def forward(self, src): embedded_src = self.embedding(src) # 嵌入输入数据 pos_encoded_src = self.positional_encoding(embedded_src) # 添加位置编码 transformer_output = self.transformer_encoder(pos_encoded_src) # 进行Transformer计算 prediction = self.fc_out(transformer_output) # 得到最终预测结果 return prediction class PositionalEncoding(nn.Module): def __init__(self, d_model, dropout=0.1, max_len=5000): super(PositionalEncoding, self).__init__() self.dropout = nn.Dropout(p=dropout) pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-torch.log(torch.tensor(10000.0)) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) pe = pe.unsqueeze(0).transpose(0, 1) self.register_buffer('pe', pe) def forward(self, x): x = x + self.pe[:x.size(0), :] return self.dropout(x) # 初始化模型参数 input_dim = 10 # 输入特征维度 output_dim = 1 # 输出目标维度 d_model = 64 # 模型隐藏层大小 nhead = 4 # 多头注意力机制中的头数 num_layers = 3 # Transformer层数 model = TransformerPredictor(input_dim, output_dim, d_model, nhead, num_layers) # 创建虚拟数据集 src = torch.rand((10, 32, input_dim)) # (时间步长, 批量大小, 特征维度) # 获取模型输出 output = model(src) print(output.shape) # 应该打印出 (时间步长, 批量大小, 输出维度) ``` 以上代码定义了一个简单的Transformer预测器,适用于处理连续数值的时间序列或其他类型的序列数据[^1]。 `PositionalEncoding` 类实现了位置编码功能,这是Transformer架构的关键组成部分之一,允许模型理解输入序列的位置关系[^2]。 #### 关于代码的具体说明: - `TransformerPredictor`: 主要负责接收输入张量并通过一系列操作生成预测值。 - `PositionalEncoding`: 提供了位置信息给Transformer模型,使其能够区分不同顺序的输入项。 - 使用了 PyTorch 的内置模块 `nn.TransformerEncoderLayer` 和 `nn.TransformerEncoder` 来简化开发过程。 --- ### 注意事项 为了使模型更好地适应实际应用场景,可能还需要调整超参数(如 `d_model`, `nhead`, `num_layers`),以及优化训练策略(如学习率调度、正则化方法)。此外,在真实场景下还需考虑批量标准化、残差连接等技术来提升性能[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值