第十三章:机器学习在曲面套利中的应用
说实话,做期权曲面套利做到一定程度,你会发现一个尴尬的事实——传统统计套利模型越来越难赚钱了。为什么?因为市场在进化,做市商和量化机构都在用更复杂的工具。这时候,机器学习就派上用场了。
我个人习惯把机器学习在曲面套利中的应用分成三个层次:预测曲面变动、识别套利信号、优化执行策略。这一章,我们重点聊前两个。
13.1 为什么要用机器学习预测曲面变动?
先问一个问题:曲面套利的本质是什么?
说白了,就是找到曲面上的定价错误,然后赌它回归。但这里有个坑——曲面本身是动态的。你今天看到的"错误",明天可能就变成"合理"了。
我在项目中遇到过这样的情况:一个明显的蝶式套利机会,按传统统计模型算出来有3个sigma的偏离。结果我进场之后,曲面继续往不利方向跑,最后止损出局。后来复盘发现,是因为没有把曲面变动的趋势考虑进去。
所以,预测曲面变动,本质上是在回答一个问题:当前这个定价偏差,是会收敛,还是会扩大?
核心观点:机器学习不是用来替代传统套利模型的,而是用来给传统模型加一个"方向过滤器"。只有预测曲面会向有利方向变动时,才进场。
13.2 LSTM:捕捉曲面时序依赖
LSTM(长短期记忆网络)这东西,说白了就是专门处理时间序列的。曲面数据天然就是时序数据——今天的曲面和昨天的曲面有很强的依赖关系。
我建议这样设计LSTM的输入:
- 输入特征:过去N天的曲面切片(比如ATM波动率、偏度、峰度)
- 目标变量:未来K天的曲面变动方向(涨/跌/平)
- 时间窗口:我个人习惯用20天(约一个交易月)
代码示例(简化版):
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# 假设曲面数据 shape: (样本数, 时间步长, 特征数)
# 特征:ATM波动率、25delta偏度、10delta偏度、期限结构斜率
X_train = np.random.randn(1000, 20, 4)
y_train = np.random.randint(0, 3, 1000) # 0:下跌, 1:持平, 2:上涨
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(20, 4)),
Dropout(0.2),
LSTM(32),
Dropout(0.2),
Dense(16, activation='relu'),
Dense(3, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2)
避坑指南:我曾经在LSTM上吃过亏——直接用原始波动率数据训练,结果模型过拟合严重。后来加了差分处理和归一化,效果才稳定下来。记住,曲面数据是非平稳的,一定要做预处理。
13.3 XGBoost:特征工程才是王道
LSTM虽然强大,但有个问题——可解释性差。你很难说清楚到底是哪个因子在驱动预测结果。这时候,XGBoost就派上用场了。
我个人习惯用XGBoost做两件事:
- 特征重要性分析:找出哪些曲面特征对预测最有帮助
- 分类预测:和LSTM做同样的任务,但提供可解释性
特征工程这块,我建议至少包含以下几类:
| 特征类别 | 具体特征 | 说明 |
|---|---|---|
| 水平因子 | ATM波动率、VVIX | 反映整体波动水平 |
| 偏度因子 | 25delta skew、10delta skew | 反映尾部风险定价 |
| 曲度因子 | 蝶式价差、铁鹰价差 | 反映凸性定价 |
| 期限结构 | 近远月价差、期限结构斜率 | 反映时间溢价 |
| 动量特征 | 过去N日变动率、波动率变化 | 反映趋势 |
代码示例:
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# 假设特征矩阵 X 和标签 y
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = xgb.XGBClassifier(
n_estimators=200,
max_depth=6,
learning_rate=0.05,
subsample=0.8,
colsample_bytree=0.8
)
model.fit(X_train, y_train,
eval_set=[(X_test, y_test)],
early_stopping_rounds=20,
verbose=False)
# 特征重要性
importance = model.feature_importances_
for i, imp in enumerate(importance):
print(f"特征{i}: {imp:.4f}")
实战经验:我在实盘中发现,偏度因子(尤其是25delta skew)的重要性往往排在前两位。这说明曲面套利中,尾部风险的定价偏差是最容易预测的。
13.4 特征重要性分析:到底什么在驱动曲面?
你想想看,如果不知道哪些特征重要,你就是在黑箱里做交易。特征重要性分析,说白了就是给模型做"体检"。
我常用的方法有三种:
- 内置重要性:XGBoost自带的feature_importances_,基于分裂次数或信息增益
- SHAP值:更精细的分析,能告诉你每个特征对单个预测的贡献
- Permutation Importance:打乱某个特征,看模型性能下降多少
举个例子,用SHAP分析曲面特征:
import shap
# 创建解释器
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
# 可视化
shap.summary_plot(shap_values, X_test, feature_names=feature_names)
我在项目中用SHAP分析发现了一个有趣的现象:当市场处于低波动环境时,期限结构特征的重要性会上升;而在高波动环境下,偏度特征更重要。这说明曲面变动的驱动因子是动态变化的。
注意:特征重要性分析的结果不能直接用于交易决策。它只是告诉你"哪些特征对预测有帮助",而不是"哪些特征能赚钱"。我曾经犯过这个错误——根据特征重要性调整了交易策略,结果回测表现反而变差了。
13.5 模型集成策略:1+1 > 2
单一模型总有局限性。LSTM擅长捕捉时序依赖,XGBoost擅长处理特征交互。把它们结合起来,效果往往更好。
我常用的集成策略有三种:
- Stacking:用LSTM和XGBoost的输出作为元模型的输入
- Voting:多个模型投票决定最终预测
- Blending:按权重混合多个模型的预测结果
我个人最常用的是Blending,因为它简单且有效:
# LSTM预测概率
lstm_probs = lstm_model.predict(X_test_lstm)
# XGBoost预测概率
xgb_probs = xgb_model.predict_proba(X_test_xgb)
# 加权混合(权重根据验证集表现调整)
weights = [0.4, 0.6] # LSTM权重0.4, XGBoost权重0.6
ensemble_probs = weights[0] * lstm_probs + weights[1] * xgb_probs
# 最终预测
final_pred = np.argmax(ensemble_probs, axis=1)
小技巧:权重不要固定,可以根据市场状态动态调整。比如在趋势明显的行情中,给LSTM更高权重;在震荡行情中,给XGBoost更高权重。我写了一个简单的状态识别器来做这件事,效果还不错。
13.6 知识体系总览
这一章的内容比较多,我画了一张图帮你理清思路:
这张图展示了从数据输入到最终预测的完整流程。核心思路是:先用特征工程提取有效信息,再用LSTM和XGBoost分别建模,最后通过集成策略融合结果。
13.7 实战中的注意事项
最后,分享几个我在实战中踩过的坑:
- 过拟合是最大的敌人:曲面数据样本量有限,模型很容易记住噪声。我建议用滚动验证而不是随机划分,更贴近实盘场景。
- 不要迷信模型精度:预测准确率80%听起来不错,但如果那20%的错误都发生在关键时刻,你的策略照样亏钱。
- 模型更新频率要合理:我试过每天重新训练模型,结果过拟合严重。后来改成每周更新一次,效果反而更好。
- 别忘了交易成本:机器学习模型给出的信号可能很频繁,但每次交易都有成本。一定要在回测中考虑滑点和手续费。
总结一下:机器学习在曲面套利中的应用,不是要取代传统模型,而是给传统模型加一个"预测层"。LSTM负责捕捉时序依赖,XGBoost负责特征交互和可解释性,集成策略负责融合优势。三者结合,才能构建出真正稳健的套利系统。