为什么用 LSTM
普通 RNN 在长序列上有梯度消失问题。LSTM 通过门控机制和细胞状态 缓解这一问题。其核心方程为:
其中 是 sigmoid 函数, 是逐元素乘法。
数据构造的两个坑
- 归一化要在划分训练集之后做,用训练集的均值方差变换测试集,否则就是数据泄漏。
- 滑动窗口:用过去 天预测下一天,。
最小实现
import torch
import torch.nn as nn
class StockLSTM(nn.Module):
def __init__(self, input_size=1, hidden_size=64, num_layers=2):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers,
batch_first=True, dropout=0.2)
self.fc = nn.Linear(hidden_size, 1)
def forward(self, x):
# x: (batch, seq_len, features)
out, _ = self.lstm(x)
return self.fc(out[:, -1, :]) # 只取最后时刻的隐状态
model = StockLSTM()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
实验中的观察
对价格本身建模往往不如对收益率建模稳定——价格是非平稳序列,模型容易学到”明天约等于今天”的懒惰解。
评估时除了 MSE,还应该看方向准确率(涨跌预测对的比例),这更贴近交易场景。
待深入
- 加入成交量、技术指标等多特征输入
- 与 GRU、Transformer(如 Informer、PatchTST)对比
- 概率预测:输出分布而非点估计(分位数损失)