RNN/LSTM与金融时间序列
概述
循环神经网络 (Recurrent Neural Network, RNN) 是处理序列数据的经典架构。其变体长短期记忆网络 (Long Short-Term Memory, LSTM) 通过门控机制 (Gating Mechanism) 解决了梯度消失问题 (Vanishing Gradient Problem),在金融时间序列建模中得到广泛应用,尤其是价格预测 (Price Prediction) 和波动率估计 (Volatility Estimation) 任务。
RNN 基础架构
标准 RNN 的隐状态更新公式为:
其中 \(h_t \in \mathbb{R}^d\) 为隐状态 (Hidden State),\(x_t\) 为时刻 \(t\) 的输入,\(W_{hh}, W_{xh}, W_{hy}\) 为权重矩阵。
梯度消失与爆炸
在反向传播时,梯度经过 \(T\) 步传递后呈指数衰减或增长:
当 \(\|W_{hh}\| < 1\) 时梯度消失,\(\|W_{hh}\| > 1\) 时梯度爆炸。这使得标准 RNN 难以捕捉长距离依赖 (Long-range Dependencies)。
LSTM 门控机制
LSTM 通过三个门控制信息流动:
遗忘门 (Forget Gate)
决定从细胞状态 (Cell State) 中丢弃哪些信息:
输入门 (Input Gate)
决定哪些新信息写入细胞状态:
细胞状态更新
输出门 (Output Gate)
其中 \(\sigma\) 为 Sigmoid 函数,\(\odot\) 为逐元素乘法 (Hadamard Product)。
LSTM 的金融直觉
遗忘门可类比为"市场记忆衰减"——旧信息逐渐被遗忘;输入门决定新信息(如突发事件)对市场状态的影响程度;输出门则控制当前市场状态中哪些部分影响可观测变量(如价格、波动率)。
序列建模:价格预测
数据构建
将时间序列转化为监督学习的滑动窗口 (Sliding Window) 格式:
import numpy as np
import torch
import torch.nn as nn
def create_sequences(data, lookback=60):
"""将时间序列转为 (序列, 标签) 对"""
X, y = [], []
for i in range(lookback, len(data)):
X.append(data[i-lookback:i]) # 过去 lookback 步
y.append(data[i]) # 预测下一步
return np.array(X), np.array(y)
LSTM 模型定义
class FinancialLSTM(nn.Module):
def __init__(self, input_dim, hidden_dim=64, num_layers=2, dropout=0.2):
super().__init__()
self.lstm = nn.LSTM(
input_size=input_dim,
hidden_size=hidden_dim,
num_layers=num_layers,
batch_first=True,
dropout=dropout
)
self.fc = nn.Sequential(
nn.Linear(hidden_dim, 32),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(32, 1)
)
def forward(self, x):
# x: (batch, seq_len, input_dim)
lstm_out, (h_n, c_n) = self.lstm(x)
last_hidden = lstm_out[:, -1, :] # 取最后时刻的隐状态
return self.fc(last_hidden)
训练流程
model = FinancialLSTM(input_dim=num_features)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.MSELoss()
for epoch in range(100):
model.train()
for X_batch, y_batch in train_loader:
y_pred = model(X_batch)
loss = criterion(y_pred.squeeze(), y_batch)
optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
收益率预测 vs 价格预测
直接预测价格水平 (Price Level) 通常不如预测收益率 (Return) 或价格变化。价格序列是非平稳的 (Non-stationary),而收益率序列经差分后更接近平稳,有利于模型学习。
波动率估计 (Volatility Estimation)
LSTM 在波动率建模中的优势在于能捕捉波动率聚集 (Volatility Clustering) 和杠杆效应 (Leverage Effect) 等非线性特征。
已实现波动率预测
目标变量为已实现波动率 (Realized Volatility, RV):
其中 \(r_{t,i}\) 为日内第 \(i\) 个高频收益率,\(M\) 为日内采样点数。
# 输入特征: 过去 N 天的 RV, 收益率, 成交量等
# 目标: 未来 h 天的 RV
features = ['rv', 'return', 'volume', 'bid_ask_spread',
'rv_5d_ma', 'rv_20d_ma', 'return_abs']
# 使用对数变换稳定方差
y = np.log(realized_volatility + 1e-8)
与传统模型的比较
| 模型 | 特点 | 适用场景 |
|---|---|---|
| GARCH | 参数模型,可解释性强 | 低频、单变量 |
| HAR-RV | 多尺度线性模型 | 已实现波动率预测 |
| LSTM | 非线性、自动特征提取 | 高频、多变量 |
| Hybrid | GARCH+LSTM | 融合结构化与非线性 |
混合模型策略
将 GARCH 类模型的输出作为 LSTM 的额外输入特征,可以融合经典时间序列模型的结构化信息与深度学习的非线性拟合能力。实证研究表明,这种混合架构通常优于单一方法。
实践注意事项
- 输入标准化:对每个特征进行 Z-score 标准化,使用训练集的统计量
- 梯度裁剪 (Gradient Clipping):防止梯度爆炸,通常设置
max_norm=1.0 - 学习率调度 (Learning Rate Scheduling):使用 ReduceLROnPlateau 或 CosineAnnealing
- 早停 (Early Stopping):基于验证集损失,防止过拟合
- 多步预测:使用 Encoder-Decoder 架构而非迭代单步预测
小结
RNN/LSTM 为金融时间序列建模提供了灵活的非线性框架。LSTM 的门控机制使其能够自适应地捕捉不同时间尺度的市场动态。然而,金融时间序列的低信噪比意味着模型性能上限有限,合理的特征工程和严格的样本外验证仍然是成功的关键。近年来,Transformer 架构在序列建模中展现出更强的并行性和长程依赖捕捉能力,逐步成为 LSTM 的有力竞争者。