18、统计套利信号:协整检验、配对交易、均值回归

统计套利,说白了就是找「亲戚」。

两只股票,表面上各走各的,但私底下关系很铁。一只跌了,另一只迟早跟着跌。一只涨了,另一只也会爬起来。这种「价格差」一旦拉大,就会像橡皮筋一样被拽回来。我们赚的,就是这个回归的钱。

我刚开始做高频策略时,总觉得统计套利太慢。后来发现,真正赚钱的并不是预测方向,而是捕捉「偏离」——你不需要知道它们为什么分开,只需要知道它们一定会回来。

核心思想: 统计套利不赌单边涨跌,只赌价差回归。胜率高,但单笔利润薄,适合高频环境。

18.1 协整检验:先确认它们是不是「真亲戚」

很多人一上来就做配对交易,结果亏得底掉。为什么?因为两只股票的相关性高,不代表它们会回归。

相关性高,可能只是巧合。比如两只股票都跟大盘涨,但彼此之间没有「绑定关系」。协整检验,就是用来判断这种绑定关系的。

协整 vs 相关:

指标 含义 我的经验
相关系数 线性关系的强度 容易骗人,尤其在高频数据里
协整检验 长期均衡关系是否存在 这才是真金不怕火炼

我常用的方法是 Engle-Granger 两步法。第一步,用 OLS 回归算出残差。第二步,对残差做单位根检验(ADF 检验)。如果残差是平稳的,说明它们协整。

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

# 假设 price_a 和 price_b 是两列价格序列
def check_cointegration(price_a, price_b):
    # 第一步:OLS回归
    X = sm.add_constant(price_b)
    model = sm.OLS(price_a, X).fit()
    residuals = model.resid
    
    # 第二步:ADF检验残差
    adf_stat, p_value, _, _, critical_values, _ = adfuller(residuals)
    
    return p_value < 0.05  # p值小于0.05,拒绝非平稳假设,即协整成立

避坑指南: 我曾经用日线数据做协整检验,效果很好。但换到分钟级高频数据后,发现很多「伪协整」——因为高频噪声太大,ADF检验容易误判。我的建议是:先用低频数据筛选候选对,再用高频数据验证。

18.2 配对交易:构建你的「价差信号」

确认协整之后,下一步就是构建配对。说白了,就是找到两只股票的「合理价差」是多少。

标准做法:

  1. 用 OLS 回归得到 hedge ratio(对冲比率)
  2. 计算价差:spread = price_a - hedge_ratio * price_b
  3. 对价差做标准化(Z-score)

为什么要标准化?因为价差的绝对值没有意义。不同时间段的价差波动幅度不一样,标准化后,我们就能用统一的阈值来判断「偏离程度」。

import numpy as np

def calculate_spread(price_a, price_b, hedge_ratio):
    spread = price_a - hedge_ratio * price_b
    z_score = (spread - np.mean(spread)) / np.std(spread)
    return spread, z_score

嗯,这里要注意:hedge ratio 不是一成不变的。我习惯用滚动窗口(比如 60 个交易日)重新计算,这样能适应市场结构的变化。

18.3 均值回归:什么时候进场,什么时候跑

有了 Z-score,交易规则就很简单了:

  • Z-score > 2.0: 价差过大,做空价差(卖 A 买 B)
  • Z-score < -2.0: 价差过小,做多价差(买 A 卖 B)
  • Z-score 回归到 0 附近: 平仓

你想想看,这个逻辑其实很朴素。就像一根橡皮筋,拉得太紧,一定会弹回来。我们只需要在它拉得最紧的时候出手。

注意: 均值回归策略最大的风险是「趋势延续」。如果价差突破阈值后继续扩大,而不是回归,你会亏得很惨。我遇到过这种情况——2015年股灾期间,很多配对关系瞬间崩塌,价差一去不返。所以,一定要设止损。

我的止损规则:

  • 如果 Z-score 超过 3.0,强制平仓
  • 如果持仓超过 5 个交易日仍未回归,平仓
  • 如果单笔亏损超过 2%,止损

18.4 实战中的高频优化

高频数据下,统计套利有几个坑:

  1. 交易成本: 高频配对交易频繁开平仓,手续费和滑点会吃掉利润。我建议用限价单,不要追价。
  2. 延迟问题: 价差信号变化很快,如果你用分钟级数据,可能信号出来时已经错过了最佳进场点。我习惯用 tick 级数据,配合事件驱动。
  3. 多对组合: 单对配对的容量有限。我通常会同时监控 20-30 对,哪个出信号就做哪个,分散风险。

我的经验: 高频统计套利,胜率能做到 70% 以上,但每笔利润很薄。关键是控制交易成本,以及快速执行。我曾经用 C++ 重写了信号计算部分,把延迟从 50ms 降到了 2ms,效果立竿见影。

18.5 知识体系总览

下面这张图,是我自己总结的统计套利流程。每次做新策略前,我都会对着它过一遍,确保没有遗漏。

统计套利信号提取流程 数据准备 高频价格序列清洗 协整检验 Engle-Granger / ADF 构建价差 OLS回归 + Z-score 信号生成 阈值触发 + 止损逻辑 执行与风控 限价单 + 多对组合 回测与优化 滚动窗口 + 参数调优 持续迭代优化

这张图里,最容易被忽略的是「回测与优化」这个循环。很多人做完信号生成就直接上线了,结果实盘和回测差距很大。我建议每次回测至少覆盖两种市场环境(比如牛市和震荡市),看看策略在不同场景下的表现。

一个小技巧: 回测时,不要用全部数据计算 Z-score 的均值和标准差。那样会引入未来信息。正确的做法是用滚动窗口,比如用过去 60 个交易日的均值和标准差来标准化当前时刻的价差。

好了,统计套利的核心就这些。说白了,就是找关系、算价差、等回归。听起来简单,但真正做好,需要大量的数据清洗和参数调优。我做了这么多年,依然觉得每次上新配对前,都要重新跑一遍协整检验——市场在变,亲戚关系也会变。