3. 配对交易原理:基于协整关系的配对交易策略核心思想
配对交易,说白了就是找两个「长得像」的股票,然后赌它们之间的价差会回归。嗯,这个思路听起来简单,但真正落地的时候,坑可不少。我最早接触这个策略是在2015年,当时做美股统计套利,踩过不少雷,今天我把核心逻辑掰开揉碎了讲给你听。
3.1 什么是配对交易?
配对交易的核心思想其实很朴素:找到两只相关性高的股票,当它们的价格出现偏离时,做多被低估的那只,做空被高估的那只,等价格回归后平仓获利。
你想想看,如果两只股票长期走势一致,那短期偏离就是机会。比如可口可乐和百事可乐,它们同属饮料行业,受同样的宏观因素影响,价格走势天然就接近。
核心逻辑:配对交易不是赌方向,而是赌价差回归。这是一种市场中性策略,理论上不受大盘涨跌影响。
3.2 协整关系:比相关性更靠谱
很多人一上来就找相关系数高的股票对,这是个误区。我刚开始做的时候也犯过这个错——找了两只相关系数0.95的股票,结果价差越走越远,亏得我头皮发麻。
为什么会这样?因为相关性高不代表价差会回归。举个例子:
- 相关性:两只股票同涨同跌,但价差可能越拉越大
- 协整性:两只股票的价差围绕某个均值波动,迟早会回来
协整关系才是配对交易的数学基础。它描述的是:两个非平稳时间序列的线性组合是平稳的。翻译成人话就是——两只股票各自乱跑,但它们之间的差距是有规律的。
我的经验:协整检验用Engle-Granger两步法就够了,别整太复杂的Johansen检验,除非你做多资产组合。我在实盘中用EG法,胜率能到65%以上。
3.3 协整检验的实操步骤
咱们直接上代码,看看怎么检验两只股票是否协整。这里以A股中的茅台和五粮液为例:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
# 假设我们已经有了两只股票的价格序列
# price_a: 茅台, price_b: 五粮液
def cointegration_test(price_a, price_b):
# 第一步:用OLS估计协整系数
price_a = sm.add_constant(price_a)
model = sm.OLS(price_b, price_a)
result = model.fit()
# 第二步:提取残差
residuals = result.resid
# 第三步:对残差做ADF检验
adf_result = adfuller(residuals, maxlag=1)
# 如果p值小于0.05,说明残差平稳,即存在协整关系
is_cointegrated = adf_result[1] < 0.05
return {
'is_cointegrated': is_cointegrated,
'p_value': adf_result[1],
'hedge_ratio': result.params[1], # 对冲比率
'residuals': residuals
}
# 调用函数
result = cointegration_test(maotai_prices, wuliangye_prices)
print(f"是否协整: {result['is_cointegrated']}")
print(f"对冲比率: {result['hedge_ratio']:.4f}")
这段代码的核心就三步:回归、取残差、检验平稳性。嗯,就这么简单。但要注意,ADF检验的滞后阶数选择很关键,我一般用AIC准则自动选。
3.4 对冲比率与价差计算
找到协整关系后,下一步就是算对冲比率。说白了就是:做多1股茅台,需要做空多少股五粮液?
对冲比率就是上面代码里的 hedge_ratio。假设结果是0.8,那就意味着:
- 做多100股茅台
- 做空80股五粮液
- 这样组合的价差就是平稳的
价差的计算公式:
spread = price_b - hedge_ratio * price_a
当价差偏离均值超过某个阈值(比如2倍标准差),就开仓。等它回归到均值附近,就平仓。
避坑指南:我曾经遇到过对冲比率随时间变化的情况,尤其是长周期配对。建议每3个月重新做一次协整检验,别一套参数用一年。
3.5 交易信号与仓位管理
有了价差序列,交易信号就清晰了。我习惯用Z-score来标准化价差:
z_score = (spread - spread.mean()) / spread.std()
# 交易规则
if z_score > 2.0:
# 做空价差:做空price_b,做多price_a
print("开仓:价差过高,预期回归")
elif z_score < -2.0:
# 做多价差:做多price_b,做空price_a
print("开仓:价差过低,预期回归")
elif abs(z_score) < 0.5:
# 平仓:价差回归均值
print("平仓:价差已回归")
阈值设多少合适?我做过回测,2倍标准差在大多数情况下表现最好。但如果你做高频,可以缩到1.5倍。记住,阈值越小,交易频率越高,但假信号也越多。
3.6 核心知识体系
下面这张图是我自己总结的配对交易核心逻辑,你看一眼就能明白整个流程:
3.7 实盘中的注意事项
最后聊几个实战中容易踩的坑:
- 交易成本:配对交易是双边交易,手续费和滑点会吃掉利润。我建议选流动性好的股票,别碰小盘股。
- 协整关系会失效:公司基本面变了,协整关系就没了。比如茅台和五粮液,如果茅台突然转型做房地产,那这对就废了。
- 不要过度优化:回测时参数调得再好,实盘也可能翻车。我见过有人把阈值调到1.8倍标准差,回测年化30%,实盘直接亏20%。
- 仓位控制:单笔配对仓位别超过总资金的5%,分散到5-10个股票对,风险就小很多。
我的习惯:每次开仓前,我会手动看一眼两只股票的近期新闻。如果有利空或利好,我会等一等再开仓。机器归机器,人脑归人脑,两者结合效果最好。
好了,配对交易的核心思想就这些。说白了就是找协整、算价差、等回归。下一节我们会讲如何用Python搭建完整的回测框架,到时候我会把实盘踩过的坑都告诉你。
公众号:蓝海资料掘金营,微信deep3321