4、配对交易策略:协整理论、配对选择、价差计算、交易信号与止损
配对交易,说白了就是找两个「同命相连」的品种。
一个涨,另一个也跟着涨。一个跌,另一个也跑不掉。
但有时候它们会闹别扭,暂时走散了。这时候,我们就买入那个被低估的,卖出那个被高估的。等它们重新「和好」,我们就平仓赚钱。
嗯,这个思路听起来简单。但实际操作中,有个核心问题:你怎么判断两个品种是真的「同命相连」,还是只是碰巧走在一起?
这就引出了我们今天的主角——协整理论。
4.1 协整理论:找到真正的「灵魂伴侣」
很多人刚开始做配对交易,喜欢算相关系数。觉得两个品种相关系数高,就能配对。
我踩过这个坑。相关系数高,只能说明它们过去走势像。但未来呢?说不定明天就分道扬镳了。
协整不一样。它检验的是两个时间序列的长期均衡关系。说白了,就是看它们之间有没有一个「橡皮筋」在拉着。
你想想看,如果两个品种是协整的,那么它们的价差(Spread)就会围绕一个均值来回波动。偏离太远了,一定会被拉回来。
我个人习惯用 Engle-Granger 两步法来检验协整:
- 第一步:做回归
用其中一个品种的价格(Y)对另一个品种的价格(X)做线性回归:
Y = α + β * X + ε - 第二步:检验残差
提取残差序列 ε,用 ADF 检验看它是否平稳。如果残差平稳,就说明 Y 和 X 是协整的。
核心要点: 协整 ≠ 高相关。两个完全不相关的品种,也可能协整。两个高度相关的品种,也可能不协整。一定要用统计检验说话。
这里我贴一段 Python 代码,是我项目中常用的协整检验函数:
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
def check_cointegration(y, x):
"""
检验 y 和 x 是否协整
返回: (is_cointegrated, p_value, hedge_ratio)
"""
# 第一步:OLS回归,计算对冲比率
x_const = sm.add_constant(x)
model = sm.OLS(y, x_const).fit()
hedge_ratio = model.params[1]
residuals = model.resid
# 第二步:ADF检验残差平稳性
adf_result = adfuller(residuals, autolag='AIC')
p_value = adf_result[1]
# 通常 p < 0.05 认为残差平稳,即协整
is_cointegrated = p_value < 0.05
return is_cointegrated, p_value, hedge_ratio
小技巧: 我建议在检验前,先对价格序列取对数。这样对冲比率 β 就变成了「弹性系数」,解释起来更直观。比如 β=1.2,意味着 X 涨 1%,Y 平均涨 1.2%。
4.2 配对选择:从候选到确认
协整检验通过了,是不是就能直接上?别急,还有几个坑要避开。
我曾经在回测中选了一对协整性很好的股票,结果实盘亏得很惨。后来发现,这两个公司属于同一个行业,但其中一个刚换了管理层,基本面已经变了。
所以,配对选择我一般分三步走:
- 第一步:行业筛选
同行业、同板块的优先。比如银行股配银行股,能源股配能源股。跨行业配对,逻辑上很难解释。 - 第二步:相关性初筛
虽然协整是核心,但相关性可以帮我们快速缩小范围。我一般要求 60 日滚动相关系数 > 0.7。 - 第三步:协整检验
用上面的代码跑一遍。p 值 < 0.05 才算合格。
另外,我还会看一个指标:半衰期(Half-life)。它衡量的是价差偏离均值后,平均需要多久才能回归。半衰期太短(比如 1 天),交易机会少,手续费还高。半衰期太长(比如 60 天),资金占用太久,风险也大。
我个人偏好半衰期在 5-20 天之间的配对。
4.3 价差计算:标准化才有意义
协整检验通过后,我们得到了对冲比率 β。接下来就是计算价差:
Spread = Y - β * X
但这里有个问题:不同配对的价差,数值大小不一样。有的价差在 0.5 附近波动,有的在 50 附近波动。没法统一设阈值。
所以,我习惯把价差标准化:
Z-score = (Spread - mean(Spread)) / std(Spread)
标准化之后,所有配对的价差都在同一个尺度上。Z-score = 2,就表示当前价差偏离均值 2 个标准差。这样设置交易信号就方便多了。
注意: 计算均值和标准差时,要用滚动窗口。我一般用 60 天的滚动窗口。窗口太短,统计不稳定。窗口太长,反应太迟钝。
4.4 交易信号:什么时候进场,什么时候出场
有了 Z-score,交易信号就清晰了。我常用的规则是:
| Z-score 范围 | 信号 | 操作 |
|---|---|---|
| Z > 2.0 | 价差过高 | 做空价差:卖出 Y,买入 X |
| Z < -2.0 | 价差过低 | 做多价差:买入 Y,卖出 X |
| |Z| < 0.5 | 价差回归 | 平仓 |
| |Z| > 3.0 | 极端偏离 | 强制止损 |
嗯,这里有个细节:进场阈值(2.0)和出场阈值(0.5)之间,留了足够的空间。这样能避免频繁交易,减少手续费损耗。
我刚开始做的时候,进场和出场都设成 1.5,结果来回打脸。后来改成 2.0 进场、0.5 出场,效果好了很多。
4.5 止损:别让「均值回归」变成「均值毁灭」
配对交易最大的风险是什么?
不是价差不回归,而是价差永远不回归。
你想想看,如果两个品种的基本面发生了根本性变化,原来的协整关系可能就断了。价差偏离 5 个标准差、10 个标准差,都有可能。这时候还死扛着等回归,那就是在赌博。
所以,止损是必须的。我一般设两道防线:
- 第一道:价格止损
当 Z-score 超过 3.0 时,无条件平仓。不管后面会不会回归,先出来再说。 - 第二道:时间止损
如果持仓超过 30 天,价差还没回归,也平仓。资金是有时间成本的。
避坑指南: 我曾经有一笔配对交易,价差偏离到 4.0 还没止损。结果那对股票因为行业政策突变,协整关系彻底破裂。最后亏了 15% 才割肉。从那以后,我再也不敢忽视止损了。
4.6 一张图看懂配对交易全流程
说了这么多,我画了一张流程图,把整个配对交易的逻辑串起来:
这张图把整个流程串起来了。从候选池到协整检验,再到价差计算、信号判断、执行交易,最后到止损平仓。每一步都不能少。
4.7 实战中的几个提醒
最后,分享几个我在实战中总结的点:
- 不要过度优化: 进场阈值 2.0 还是 2.5?滚动窗口 60 天还是 90 天?这些参数差不多就行。过度优化只会让策略在样本外失效。
- 注意交易成本: 配对交易是双边交易,手续费是双倍的。如果价差波动很小,可能还不够手续费。我一般要求每次交易的预期收益至少覆盖 3 倍手续费。
- 动态调整配对: 协整关系不是一成不变的。我建议每 3 个月重新检验一次。如果协整关系消失了,就换一对。
个人习惯: 我每天开盘前会跑一遍所有配对的 Z-score。如果发现某个配对的 Z-score 突然跳到 2.5 以上,我会先看看有没有新闻。确认没有基本面变化,再进场。这个习惯帮我躲过了好几次黑天鹅。
好了,配对交易的核心内容就这些。说白了,就是找两个协整的品种,在价差偏离时进场,在价差回归时离场。再加上严格的止损,就是一个完整的策略了。