当深度学习遇上量化投资#
长短期记忆网络(LSTM)作为循环神经网络(RNN)的改进版本,能够有效捕捉时间序列数据中的长期依赖关系。在量化投资领域,LSTM被广泛应用于股价预测、波动率建模和交易信号生成。本文将手把手教你构建基于LSTM的量化交易策略。

LSTM核心原理#
为什么选择LSTM?#
传统RNN存在梯度消失/爆炸问题,无法捕捉长期依赖。LSTM通过门控机制解决这个问题:
- 遗忘门(Forget Gate):决定丢弃哪些旧信息
- 输入门(Input Gate):决定更新哪些新信息
- 输出门(Output Gate):决定输出哪些信息
LSTM单元结构#
f_t = σ(W_f · [h_{t-1}, x_t] + b_f) # 遗忘门
i_t = σ(W_i · [h_{t-1}, x_t] + b_i) # 输入门
C̃_t = tanh(W_C · [h_{t-1}, x_t] + b_C) # 候选记忆
C_t = f_t * C_{t-1} + i_t * C̃_t # 更新记忆
o_t = σ(W_o · [h_{t-1}, x_t] + b_o) # 输出门
h_t = o_t * tanh(C_t) # 隐藏状态plaintext数据准备与特征工程#
1. 基础价格数据#
import yfinance as yf
import pandas as pd
# 下载股票数据
ticker = "AAPL"
data = yf.download(ticker, start="2015-01-01", end="2026-01-01")
# 计算技术指标
def add_technical_indicators(df):
# 移动平均
df['MA_5'] = df['Close'].rolling(5).mean()
df['MA_20'] = df['Close'].rolling(20).mean()
# RSI
delta = df['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(14).mean()
rs = gain / loss
df['RSI'] = 100 - (100 / (1 + rs))
# Bollinger Bands
df['BB_middle'] = df['Close'].rolling(20).mean()
bb_std = df['Close'].rolling(20).std()
df['BB_upper'] = df['BB_middle'] + (bb_std * 2)
df['BB_lower'] = df['BB_middle'] - (bb_std * 2)
return df
data = add_technical_indicators(data)python2. 高级特征工程#
# 添加滞后特征
def create_lag_features(df, lags=10):
for lag in range(1, lags + 1):
df[f'Close_lag_{lag}'] = df['Close'].shift(lag)
df[f'Volume_lag_{lag}'] = df['Volume'].shift(lag)
df[f'Return_lag_{lag}'] = df['Close'].pct_change().shift(lag)
return df
# 添加滚动统计特征
def add_rolling_features(df, windows=[5, 10, 20]):
for window in windows:
df[f'Return_mean_{window}'] = df['Close'].pct_change().rolling(window).mean()
df[f'Return_std_{window}'] = df['Close'].pct_change().rolling(window).std()
df[f'Volume_mean_{window}'] = df['Volume'].rolling(window).mean()
return df
data = create_lag_features(data)
data = add_rolling_features(data)python3. 数据标准化#
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data.dropna())python构建LSTM模型#
模型架构#
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, BatchNormalization
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
def build_lstm_model(input_shape):
model = Sequential([
# 第一层LSTM
LSTM(128, return_sequences=True, input_shape=input_shape),
BatchNormalization(),
Dropout(0.3),
# 第二层LSTM
LSTM(64, return_sequences=True),
BatchNormalization(),
Dropout(0.3),
# 第三层LSTM
LSTM(32, return_sequences=False),
BatchNormalization(),
Dropout(0.3),
# 全连接层
Dense(64, activation='relu'),
Dense(32, activation='relu'),
Dense(1, activation='linear') # 预测下一期收益率
])
optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=optimizer, loss='mse', metrics=['mae'])
return model
# 构建模型
input_shape = (lookback_days, n_features)
model = build_lstm_model(input_shape)
model.summary()python训练策略#
# 时间序列交叉验证
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, val_idx in tscv.split(scaled_data):
X_train, X_val = scaled_data[train_idx], scaled_data[val_idx]
y_train, y_val = labels[train_idx], labels[val_idx]
# 早停法
early_stopping = EarlyStopping(
monitor='val_loss',
patience=10,
restore_best_weights=True
)
# 学习率衰减
reduce_lr = ReduceLROnPlateau(
monitor='val_loss',
factor=0.5,
patience=5,
min_lr=1e-6
)
history = model.fit(
X_train, y_train,
validation_data=(X_val, y_val),
epochs=100,
batch_size=32,
callbacks=[early_stopping, reduce_lr],
verbose=1
)python策略设计与回测#
1. 信号生成#
def generate_signals(predictions, threshold=0.001):
"""
根据预测收益率生成交易信号
predictions: LSTM预测的下期收益率
threshold: 交易阈值
"""
signals = np.zeros(len(predictions))
# 买入信号:预测收益率 > threshold
signals[predictions > threshold] = 1
# 卖出信号:预测收益率 < -threshold
signals[predictions < -threshold] = -1
return signalspython2. 回测框架#
import backtrader as bt
class LSTMSignalStrategy(bt.Strategy):
params = (('threshold', 0.001),)
def __init__(self):
self.lstm_predictions = [] # LSTM预测结果
self.current_bar = 0
def next(self):
if self.current_bar >= len(self.lstm_predictions):
return
prediction = self.lstm_predictions[self.current_bar]
signal = generate_signals([prediction], self.params.threshold)[0]
if signal == 1 and not self.position:
self.buy(size=100)
elif signal == -1 and self.position:
self.close()
self.current_bar += 1
# 执行回测
cerebro = bt.Cerebro()
cerebro.addstrategy(LSTMSignalStrategy, threshold=0.001)
# ... 添加数据、设置佣金等
results = cerebro.run()python3. 绩效评估#
def evaluate_strategy(returns, benchmark_returns):
"""计算策略绩效指标"""
metrics = {
'年化收益率': returns.mean() * 252,
'年化波动率': returns.std() * np.sqrt(252),
'夏普比率': returns.mean() / returns.std() * np.sqrt(252),
'最大回撤': (1 - (1 + returns).cumprod() / (1 + returns).cumprod().expanding().max()).max(),
'胜率': (returns > 0).sum() / len(returns),
'信息比率': (returns - benchmark_returns).mean() / (returns - benchmark_returns).std() * np.sqrt(252)
}
return metrics
# 计算绩效
strategy_returns = calculate_strategy_returns(signals, actual_returns)
benchmark_returns = data['Close'].pct_change()
metrics = evaluate_strategy(strategy_returns, benchmark_returns)
print(metrics)python实战技巧与陷阱#
✅ 最佳实践#
- 数据质量第一:清洗异常值、处理缺失数据
- 避免过拟合:使用正则化、Dropout、早停法
- 特征选择:不是特征越多越好,要选择有经济意义的因子
- 样本外测试:保留最近6-12个月数据作为样本外测试集
❌ 常见陷阱#
- 未来函数:确保训练数据不包含未来信息
- 幸存者偏差:使用包含所有退市股票的数据集
- 交易成本忽略:LSTM策略通常高频交易,交易成本影响大
- 市场状态变化:模型在牛市训练,在熊市可能失效

模型优化方向#
1. 注意力机制(Attention Mechanism)#
from tensorflow.keras.layers import Attention, MultiHeadAttention
# 添加注意力层
attention_layer = MultiHeadAttention(num_heads=4, key_dim=64)
attention_output = attention_layer(query, value, key)python2. 集成学习#
结合多个LSTM模型(不同参数、不同特征)的预测结果:
# 模型集成
predictions_ensemble = (
0.3 * model1.predict(X_test) +
0.3 * model2.predict(X_test) +
0.4 * model3.predict(X_test)
)python3. 强化学习结合#
使用深度强化学习(DRL)优化交易执行:
# 使用DQN或PPO算法
from stable_baselines3 import PPO
env = TradingEnvironment(data, lstm_predictions)
model = PPO('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=100000)python总结#
基于LSTM的量化策略是一个系统工程,涉及数据工程、模型设计、策略回测和风险管理等多个环节。关键要点:
- 数据是根本:高质量的数据和合理的特征工程比复杂模型更重要
- 避免过拟合:使用正则化、交叉验证和样本外测试
- 交易成本敏感:LSTM策略通常高频,必须考虑交易成本
- 持续优化:市场结构变化,模型需要定期重新训练
免责声明:本文仅供技术交流,不构成投资建议。量化投资有风险,入市需谨慎。
“预测未来最好的方法是创造未来。但在量化投资中,我们先试图理解未来,然后才创造收益。” —— 改编自彼得·德鲁克