统计套利基础:协整与配对交易、均值回归策略、统计套利的风险与局限

各位同学好。今天我们来聊聊统计套利。

说实话,这玩意儿在量化圈子里被吹得神乎其神。什么「市场中性」、「无风险套利」……听着就让人心动。但我得泼盆冷水——统计套利不是无风险套利。它只是利用统计规律,去捕捉价格偏离的机会。说白了,就是赌它会回归。

我刚开始做高频的时候,也踩过不少坑。有一次,我盯着一对股票,价差拉得特别大,我心想「稳了,这波必回归」。结果呢?价差继续扩大,直接把我止损打穿。后来复盘才发现,那两只股票的基本面已经变了,协整关系早就断了。

所以,学统计套利之前,你得先搞清楚:什么是协整?什么是均值回归? 以及——它到底有哪些坑?

一、协整:统计套利的基石

先问个问题:两只股票价格都在涨,它们有关系吗?

不一定。可能只是大盘好,大家都在涨。真正有关系的是——它们的价差是稳定的

举个例子。A股和H股,同一家公司,两地上市。按理说,价格应该差不多。但有时候A股贵,有时候H股贵。如果你发现价差偏离了正常范围,就可以做多便宜的、做空贵的,等它们回归。

这就是协整的核心思想:两个或多个时间序列,虽然各自不平稳,但它们的线性组合是平稳的

协整的数学定义:如果两个时间序列 \(X_t\) 和 \(Y_t\) 都是 I(1)(一阶单整),但存在一个系数 \(\beta\),使得 \(Z_t = Y_t - \beta X_t\) 是 I(0)(平稳序列),那么 \(X_t\) 和 \(Y_t\) 就是协整的。

嗯,我知道你看到公式就头疼。我换个说法:两只股票,长期看会「手拉手」一起走,偶尔松开,但最终会再牵上。这个「松开」就是套利机会。

如何检验协整?

我个人习惯用 Engle-Granger 两步法。步骤很简单:

  1. 第一步:用 OLS 回归 \(Y_t = \alpha + \beta X_t + \epsilon_t\),得到残差 \(\epsilon_t\)。
  2. 第二步:对残差做 ADF 检验(单位根检验)。如果残差是平稳的,就说明协整关系存在。

代码实现也不复杂。我贴一段 Python 示例:

import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller

# 假设 X 和 Y 是两个价格序列
X = sm.add_constant(X)
model = sm.OLS(Y, X).fit()
residuals = model.resid

# ADF 检验
adf_result = adfuller(residuals)
print(f'ADF Statistic: {adf_result[0]}')
print(f'p-value: {adf_result[1]}')

# p-value < 0.05 说明残差平稳,协整关系成立
if adf_result[1] < 0.05:
    print('协整关系存在')
else:
    print('没有协整关系')

这里要注意:ADF 检验的临界值要调整。因为残差是从回归中估计出来的,直接用标准临界值会偏保守。我一般用 MacKinnon 临界值表,或者直接用 coint 函数,它内部已经处理了这个问题。

小技巧:如果你用 Python 的 statsmodels.tsa.stattools.coint 函数,它会直接返回协整检验的 p-value,省去手动调整的麻烦。

二、配对交易:把理论变成策略

协整检验通过了,接下来就是怎么交易。

配对交易的核心逻辑很简单:

  • 计算价差:\(spread = Y - \beta X\)
  • 标准化价差:\(z\_score = (spread - mean(spread)) / std(spread)\)
  • 设定阈值:当 z_score 超过 +2 或低于 -2 时,开仓。
  • 回归平仓:当 z_score 回归到 0 附近时,平仓。

举个例子。假设你发现茅台和五粮液是协整的。当前 z_score 是 2.5,说明茅台相对五粮液太贵了。你的操作是:

  • 做空茅台(卖贵的那一个)
  • 做多五粮液(买便宜的那一个)

等 z_score 回到 0,两边平仓,赚的就是价差回归的钱。

听起来很完美,对吧?但实际跑起来,问题一堆。

我踩过的坑

第一个坑:阈值设得太死。我曾经用固定的 ±2 倍标准差,结果市场波动一变大,频繁开仓止损。后来我改用动态阈值,根据近期波动率调整,效果好很多。

第二个坑:手续费和滑点。高频配对交易,一天可能来回几十次。手续费和滑点一扣,利润全没了。我建议你在回测时,至少按 2 倍手续费、1 个 tick 滑点来算。

第三个坑:协整关系失效。这是最致命的。我遇到过一对股票,协整了两年,突然有一天关系断了。原因?一家公司被收购了。所以,定期重新检验协整是必须的。

警告:配对交易不是「设好参数就不管了」。你需要每天检查协整关系是否还在。如果 p-value 变大了,赶紧停掉策略。

三、均值回归策略:不止于配对

配对交易只是均值回归策略的一种。广义的均值回归,可以应用到更多场景。

比如:

  • 单个资产的均值回归:价格偏离移动平均线太远,就反向开仓。
  • 行业指数的均值回归:行业 ETF 偏离同类太多,做多/做空。
  • 跨品种的均值回归:比如黄金和白银,历史上价差有稳定区间。

我个人比较喜欢用 布林带 来做均值回归。上轨做空,下轨做多,中轨平仓。简单粗暴,但有效。

# 布林带均值回归示例
import numpy as np

def bollinger_strategy(price, window=20, num_std=2):
    rolling_mean = price.rolling(window).mean()
    rolling_std = price.rolling(window).std()
    upper_band = rolling_mean + num_std * rolling_std
    lower_band = rolling_mean - num_std * rolling_std
    
    # 信号:价格突破上轨做空,突破下轨做多
    signals = pd.DataFrame(index=price.index)
    signals['short'] = price > upper_band
    signals['long'] = price < lower_band
    return signals

但这里有个问题:均值回归策略在趋势行情里会死得很惨。你想想看,如果价格一路向上,你每次在上轨做空,都会被趋势碾压。所以,均值回归策略一定要搭配趋势过滤器。

我常用的过滤器是 ADX(平均趋向指数)。ADX 低于 25 时,说明市场在震荡,适合做均值回归。ADX 高于 25,说明趋势来了,赶紧停手。

四、统计套利的风险与局限

好了,前面说了这么多美好的东西。现在该聊聊风险了。

统计套利不是印钞机。它有三大风险,你必须时刻记在心里。

1. 模型风险

你的协整关系是基于历史数据算出来的。但历史会重演吗?不一定。市场结构在变,参与者在变,规则在变。你今天发现的协整关系,明天可能就失效了。

我曾经回测一个策略,三年夏普 2.5,实盘一个月就亏了 10%。为什么?因为那对股票的流动性变了,价差不再回归了。

2. 执行风险

统计套利通常需要同时做多和做空。但实际交易中,你很难做到「同时」。延迟几毫秒,价差可能就变了。尤其是高频场景,滑点能吃掉你大部分利润。

我建议你:用限价单,别用市价单。虽然成交慢一点,但至少不会滑点滑到怀疑人生。

3. 尾部风险

这是最可怕的。统计套利假设价差会回归,但万一不回归呢?比如 2008 年金融危机,很多原本协整的股票,价差直接崩了。如果你没有止损,爆仓是分分钟的事。

所以,永远要设止损。我一般设 3 倍标准差作为硬止损。超过这个范围,不管什么原因,先平仓再说。

统计套利的局限总结

  • 需要高频数据,低频数据效果差
  • 对交易成本敏感,不适合小资金
  • 协整关系不稳定,需要持续监控
  • 在极端行情下可能失效

五、知识体系图

最后,我画了一张图,帮你梳理本章的核心逻辑。

统计套利知识体系 统计套利 协整检验 配对交易 均值回归策略 Engle-Granger 两步法 ADF 单位根检验 价差计算与标准化 阈值设定与开平仓 布林带策略 ADX 趋势过滤器 风险与局限 模型风险 执行风险 尾部风险 协整失效

这张图把本章的核心内容串起来了。从协整检验开始,到配对交易和均值回归策略,最后落到风险控制。你学完这一章,应该能自己画一遍这张图。

好了,今天就聊到这儿。统计套利是个好东西,但别神话它。记住:没有完美的策略,只有不断进化的交易员

专注资料整理