第三章:协整理论与检验
做配对交易这么多年,我越来越觉得——协整才是整个策略的灵魂。很多人一上来就谈相关系数,觉得两只股票走势像就能配对。嗯,这其实是个坑。相关系数高,不代表它们会一起回来。协整,才是那个能让你安心睡觉的东西。
3.1 协整的定义
先说说协整到底是什么。说白了,就是两个或多个非平稳的时间序列,它们的线性组合是平稳的。你想想看,两只股票各自都在随机游走,但它们的某种组合却像被一根绳子牵着,不会跑太远。
数学上,如果 y_t 和 x_t 都是 I(1) 序列(一阶单整),存在一个系数 β,使得:
z_t = y_t - β * x_t ~ I(0)
那么它们就是协整的。这个 z_t 就是价差序列,也是我们做配对交易的核心。
关键点:协整 ≠ 相关。两只高度相关的股票,如果它们的价差是随机游走的,那配对交易就是赌博。协整保证了价差的均值回归特性。
我在项目中遇到过好几次这样的情况:两只银行股,相关系数0.95,看起来完美配对。结果一跑协整检验,p值0.3——根本不协整。后来那段时间银行板块持续分化,如果按相关系数做,早就亏惨了。
3.2 Engle-Granger两步法
这是最经典的协整检验方法,也是我个人最常用的。为什么?因为它直观,而且容易解释给交易员听。
第一步:估计协整关系
用 OLS 回归估计协整系数:
y_t = α + β * x_t + ε_t
得到残差序列 ε_t。这个残差就是我们的价差。
第二步:检验残差的平稳性
对残差做 ADF 检验。如果残差是平稳的,就说明 y_t 和 x_t 是协整的。
from statsmodels.tsa.stattools import adfuller
import numpy as np
import statsmodels.api as sm
# 假设 y 和 x 是两个价格序列
def engle_granger_test(y, x):
# 第一步:OLS回归
x_const = sm.add_constant(x)
model = sm.OLS(y, x_const).fit()
residuals = model.resid
# 第二步:ADF检验残差
adf_stat, p_value, _, _, critical_values, _ = adfuller(residuals)
return {
'beta': model.params[1],
'alpha': model.params[0],
'adf_stat': adf_stat,
'p_value': p_value,
'is_cointegrated': p_value < 0.05
}
个人经验:EG两步法有个小陷阱——第一步的OLS估计是有偏的,但一致性没问题。样本量足够大时(我一般要求至少250个交易日),这个偏差可以忽略。如果样本量小,可以考虑用动态OLS(DOLS)来修正。
3.3 Johansen检验
EG两步法只能处理一对股票。那如果你有5只股票,想找它们之间有没有协整关系呢?这时候就要用 Johansen 检验了。
Johansen 检验的核心思想是基于向量自回归(VAR)模型。它通过特征值分解,一次性检验出所有可能的协整关系个数。
from statsmodels.tsa.vector_ar.vecm import coint_johansen
def johansen_test(data, det_order=0, k_ar_diff=1):
"""
data: 多只股票的价格矩阵,每列一只股票
det_order: 确定性趋势项,0=无截距,1=有截距
k_ar_diff: 差分滞后阶数
"""
result = coint_johansen(data, det_order, k_ar_diff)
# 迹统计量检验
trace_stat = result.lr1
trace_crit = result.cvt
# 最大特征值检验
max_eigen_stat = result.lr2
max_eigen_crit = result.cvm
return {
'trace_stat': trace_stat,
'trace_crit': trace_crit,
'max_eigen_stat': max_eigen_stat,
'max_eigen_crit': max_eigen_crit,
'r': result.r # 协整秩
}
注意:Johansen检验对滞后阶数很敏感。我建议用AIC或BIC来选择最优滞后阶数。曾经有一次我偷懒用了默认参数,结果检验出3个协整关系,后来调整滞后阶数后才发现其实只有1个。嗯,从那以后我再也不敢省这一步了。
3.4 协整在配对交易中的应用
好了,理论讲完了,咱们说说怎么用。协整在配对交易中,说白了就是帮我们做三件事:
- 筛选配对:只有协整的股票对才值得做
- 确定对冲比例:EG两步法中的β就是最优对冲比例
- 定义交易信号:价差偏离均值多少个标准差时开仓
下面是我在实际策略中用的一个完整流程:
class CointegratedPair:
def __init__(self, y, x, lookback=60):
self.y = y
self.x = x
self.lookback = lookback
def update(self):
# 滚动窗口检验协整
y_window = self.y[-self.lookback:]
x_window = self.x[-self.lookback:]
eg_result = engle_granger_test(y_window, x_window)
if not eg_result['is_cointegrated']:
return None # 不协整,不开仓
# 计算价差
spread = y_window - eg_result['beta'] * x_window - eg_result['alpha']
spread_mean = np.mean(spread)
spread_std = np.std(spread)
# 标准化价差
z_score = (spread[-1] - spread_mean) / spread_std
return {
'z_score': z_score,
'beta': eg_result['beta'],
'is_cointegrated': True
}
实战要点:
- 我习惯用60-120个交易日的滚动窗口来检验协整
- z-score超过±2时开仓,回到0附近平仓
- 如果协整关系破裂(连续3次检验不通过),立即平仓止损
你可能会问:为什么不用固定的协整关系?因为市场在变。我曾经用固定参数跑过回测,前两年表现很好,第三年突然崩了。后来发现是两只股票的业务结构发生了变化,协整关系已经不存在了。所以,动态更新很重要。
3.5 本章知识体系
下面这张图总结了协整理论的核心逻辑,从定义到检验再到应用,一目了然:
我的建议:刚开始做配对交易时,先用EG两步法跑单对股票,把流程跑通。等熟悉了,再上Johansen做多品种筛选。别一上来就搞复杂模型,容易迷失在细节里。
协整理论是配对交易的基石。理解了它,你就能分辨哪些是真正的交易机会,哪些只是噪音。下一章我们会聊如何用协整关系构建完整的交易策略,包括入场、出场和资金管理。嗯,那才是真正赚钱的部分。
公众号:蓝海资料掘金营,微信deep3321