14. 统计套利方法:基于统计模型的套利机会识别

统计套利,说白了就是让数据自己说话。我们不做主观判断,而是让模型告诉我们:现在这个价格,是不是「不正常」了?

我个人习惯把统计套利分成两类:一类是找共性,一类是找个性。PCA属于前者,均值回归属于后者。今天咱们就聊聊这两把刀怎么用。

14.1 PCA主成分分析:降维找共性

波动率曲面是个高维怪物。不同期限、不同行权价,几十个点摆在那。你一个个看,眼睛会瞎的。

PCA的核心思想很简单:大部分波动率变动,其实是由少数几个「隐藏因子」驱动的

我在项目中遇到过这样的情况——明明整个曲面都在动,但单个点看起来没什么规律。用PCA一拆,发现第一个主成分解释了80%以上的方差。说白了,大家都在跟着大盘走。

核心逻辑:
  • 第一主成分:整体波动率水平(市场情绪)
  • 第二主成分:期限结构斜率(短期vs长期)
  • 第三主成分:微笑曲率(虚值vs实值)

为什么会这样?因为期权定价的驱动因素就那么几个。你想想看,波动率曲面再怎么扭曲,也逃不出这三个维度的约束。

实战步骤

  1. 数据准备:取一段时间内,固定期限-行权价网格的隐含波动率数据
  2. 标准化:每个点减去均值,除以标准差。这一步不能省,不然量纲不同会出问题
  3. 跑PCA:计算协方差矩阵的特征值和特征向量
  4. 看载荷:每个主成分对应的特征向量,就是各点的「权重」
  5. 找残差:用前k个主成分重构曲面,残差就是套利机会
import numpy as np
from sklearn.decomposition import PCA

# 假设 iv_matrix 是 T x N 的矩阵,T为时间,N为曲面点数
# 每一行是一个时间点的曲面快照
iv_matrix = ...  # 你的数据

# 标准化
mean = np.mean(iv_matrix, axis=0)
std = np.std(iv_matrix, axis=0)
iv_norm = (iv_matrix - mean) / std

# PCA
pca = PCA(n_components=3)
scores = pca.fit_transform(iv_norm)  # 主成分得分
loadings = pca.components_           # 载荷矩阵

# 重构
reconstructed = scores @ loadings * std + mean

# 残差 = 实际值 - 重构值
residuals = iv_matrix - reconstructed

# 残差超过2倍标准差,视为异常
threshold = 2 * np.std(residuals, axis=0)
anomaly_mask = np.abs(residuals) > threshold
我的经验:别贪心用太多主成分。3个就够了,最多5个。用多了反而过拟合,把噪声当信号抓。

14.2 均值回归:赌它「回来」

均值回归是统计套利的老祖宗。它的信仰很简单:价格偏离均值太远,迟早会回来

嗯,这里要注意——不是所有东西都会均值回归。趋势性资产就不行,比如股票价格。但波动率不一样,它天生就有均值回归的特性。你想想看,波动率能一直高到天上去吗?能一直低到地板上吗?不会的。

我记得有一次,VIX飙到40以上,所有人都说「这次不一样」。结果呢?两个月后回到20。波动率这东西,就像橡皮筋,拉得越狠,弹得越猛。

怎么判断「偏离」?

常用的工具就这几个:

指标 含义 阈值参考
Z-score (当前值 - 均值) / 标准差 |Z| > 2 视为异常
布林带 均值 ± k * 标准差 k=2 或 k=2.5
半衰期 偏离回归到一半所需时间 半衰期越短,套利越安全

我个人习惯用Z-score。简单、直观、好用。但有个坑——均值本身会漂移。你用过去一年的均值,跟用过去一个月的均值,结果可能完全相反。

我曾经踩过的坑:用固定窗口的均值做回归交易,结果市场结构变了,均值本身在漂移。我还在傻傻地等回归,结果越等越远。后来改用滚动窗口+指数加权,才稳住。

均值回归策略框架

def mean_reversion_signal(iv_series, window=20, z_threshold=2):
    """
    输入:iv_series - 某个曲面点的隐含波动率时间序列
    输出:信号 - 1表示做空波动率,-1表示做多波动率
    """
    rolling_mean = iv_series.rolling(window).mean()
    rolling_std = iv_series.rolling(window).std()
    z_score = (iv_series - rolling_mean) / rolling_std
    
    signal = np.zeros_like(z_score)
    signal[z_score > z_threshold] = -1   # 偏高,做空
    signal[z_score < -z_threshold] = 1   # 偏低,做多
    
    return signal, z_score

14.3 PCA + 均值回归:组合拳

单独用PCA,你只能发现「异常」,但不知道什么时候回归。单独用均值回归,你容易被均值漂移坑。

把两者结合起来,效果会好很多:

  1. 用PCA把曲面拆成主成分和残差
  2. 对残差做均值回归分析
  3. 当残差的Z-score超过阈值时,开仓
  4. 当残差回归到0附近时,平仓

这样做的好处是:你过滤掉了整体市场波动的影响,只盯着「异常」的部分。说白了,就是在大海里捞针,但你先用PCA把大海过滤成一个小池塘。

实战要点:
  • PCA的窗口要足够长(至少6个月),才能稳定估计协方差结构
  • 均值回归的窗口要短(1-3个月),捕捉短期偏离
  • 开仓要分批,别一把梭。我一般分3次,每次间隔1天
  • 止损要设,别死扛。残差超过3倍标准差还不回归,说明模型可能错了

14.4 知识体系总览

下面这张图,是我自己整理统计套利方法时画的框架。你看一眼,心里就有数了。

统计套利方法框架 波动率曲面统计套利 PCA主成分分析 降维提取因子 残差分析 异常检测 均值回归 Z-score信号 布林带 半衰期评估 PCA + 均值回归组合 输出:套利信号 + 入场/出场时机

14.5 避坑指南

做统计套利这些年,我踩过的坑不少。挑几个典型的说说:

  • 数据频率不匹配:用日线数据做PCA,用分钟线做交易。结果PCA的因子还没更新,交易信号已经变了。建议PCA和交易用同一频率。
  • 过度优化:我曾经为了追求回测夏普比率,调了十几个参数。结果实盘一跑,直接崩了。记住:参数越少,模型越稳。
  • 忽略交易成本:统计套利通常是高频、小利差。交易成本一扣,利润可能变负数。我一般会在回测里加2-3个tick的滑点。
  • 市场结构突变:2020年3月那次,所有统计模型都失效了。因为波动率曲面的协方差结构彻底变了。遇到这种时候,别硬扛,先停手。
一个小技巧:每次开仓前,问自己三个问题——这个信号是统计上的异常,还是基本面上的变化?如果基本面变了,统计模型就不适用了。

好了,统计套利的核心思路就这些。PCA帮你找到「哪里不对劲」,均值回归告诉你「什么时候动手」。两者结合,就是一套完整的套利系统。

记住:统计模型只是工具,不是真理。它给你信号,但最终决策还得靠你的判断。


公众号:蓝海资料掘金营,微信deep3321