4. 协整理论与配对交易:Engle-Granger 两步法、Johansen 检验
做市交易里,最怕什么?
怕单边行情。你这边刚把库存建好,那边价格就一路狂泻。这时候,配对交易就派上用场了。说白了,就是找两个走势差不多的资产,一个涨多了就空它,另一个跌多了就买它。但问题来了——你怎么知道它们「差不多」?
嗯,这就是协整理论要解决的事。
4.1 协整:比相关性更靠谱的关系
很多人一上来就看相关系数。我见过不少新手,看到两个资产相关系数0.9,就兴奋地开始做配对。结果呢?亏得底裤都不剩。
为什么?因为相关性只看短期走势,协整看的是长期均衡。两个资产可能短期走势完全相反,但长期却像橡皮筋一样,拉远了就会弹回来。这才是做配对交易的基础。
核心定义:如果两个时间序列都是非平稳的(比如随机游走),但它们的线性组合是平稳的,那它们就存在协整关系。
用大白话说:两个醉汉走路,虽然各自东倒西歪,但始终被一根绳子拴着,距离不会无限拉大。
4.2 Engle-Granger 两步法:最经典的做法
这个方法我用了好多年。简单、直观,适合快速验证想法。但要注意,它只能处理一对资产的关系。
第一步:跑回归,找关系
假设我们要做X和Y的配对。先跑一个普通最小二乘回归:
Y = α + β * X + ε
这里的β就是对冲比率。比如β=1.5,意味着每做多1份Y,就要做空1.5份X来对冲。
我的习惯:跑回归之前,我会先看一眼两个序列的走势图。如果明显有趋势背离,那协整关系可能已经断了。别硬来,换个时间窗口试试。
第二步:检验残差,看是否平稳
把回归的残差ε拿出来,做ADF检验(单位根检验)。如果残差是平稳的,那就说明协整关系成立。
# 伪代码示例
residuals = Y - alpha - beta * X
adf_stat, p_value = adf_test(residuals)
if p_value < 0.05:
print("协整关系成立,可以开干")
else:
print("这俩货没戏,换一对")
避坑指南:我曾经在2018年用这个方法做了一组加密货币的配对,回测漂亮得不行。结果实盘一跑,协整关系直接崩了。后来才发现,那段时间市场结构变了,但我的回测窗口没更新。
记住:协整关系不是永恒的。每隔一段时间就要重新检验一次。
4.3 Johansen 检验:多资产配对的利器
Engle-Granger只能处理一对资产。但做市商手里往往有几十个品种,怎么办?
Johansen检验就是干这个的。它可以同时检验多个资产之间是否存在协整关系,还能告诉你存在几个协整向量。
核心思想
Johansen检验基于向量自回归模型(VAR)。它通过特征值分解,找出所有可能的协整关系。输出两个统计量:
- 迹统计量(Trace Statistic):检验协整秩(即协整关系的个数)
- 最大特征值统计量(Max Eigenvalue Statistic):检验是否存在r个协整关系 vs r+1个
| 统计量 | 原假设 | 备择假设 |
|---|---|---|
| 迹统计量 | 协整秩 ≤ r | 协整秩 > r |
| 最大特征值 | 协整秩 = r | 协整秩 = r+1 |
实战经验:我一般先跑迹统计量,看看大概有几个协整关系。如果结果说有两个,那我会再跑最大特征值确认一下。两个统计量结论一致,我才敢用。
代码示例(Python + statsmodels)
from statsmodels.tsa.vector_ar.vecm import coint_johansen
# 假设data是一个DataFrame,包含三列:A, B, C
result = coint_johansen(data, det_order=0, k_ar_diff=1)
print("迹统计量:", result.lr1)
print("临界值(95%):", result.cvt)
print("最大特征值统计量:", result.lr2)
print("临界值(95%):", result.cvm2)
4.4 实战中的配对交易策略
理论讲完了,说说我怎么在实际做市中用的。
步骤一:筛选候选对
我不会一上来就跑Johansen。先算个相关系数矩阵,把相关性高的挑出来。然后看行业、板块是否相关。比如同行业的两个股票,或者同品种的期货合约。
步骤二:检验协整
用Engle-Granger快速验证一对。如果要做多资产组合,就用Johansen。我个人习惯用60天的滚动窗口,每天更新一次。
步骤三:计算价差与开仓信号
价差 = Y - α - β * X。当价差偏离均值超过1.5个标准差时,开仓。回归到均值时平仓。
# 价差计算
spread = Y - alpha - beta * X
z_score = (spread - spread.mean()) / spread.std()
if z_score > 1.5:
print("做空价差:卖Y,买X")
elif z_score < -1.5:
print("做多价差:买Y,卖X")
else:
print("观望")
注意:价差回归到均值,不代表马上就会回归。我见过价差偏离3个标准差还继续扩大的情况。这时候要设好止损,别死扛。
4.5 知识体系总览
下面这张图,是我自己整理的知识框架。每次做配对交易前,我都会过一遍:
4.6 几个容易踩的坑
- 伪回归陷阱:两个完全不相关的随机游走,跑回归也可能显著。所以一定要做协整检验,别只看回归的R²。
- 结构突变:政策变化、市场改革,都会让协整关系失效。我一般会在检验中加入结构断点检验。
- 交易成本:配对交易需要频繁调仓。如果交易成本太高,利润全被吃掉了。做市商有优势,但也要算清楚。
总结一句话:协整理论是配对交易的基石。Engle-Granger适合快速验证,Johansen适合多资产组合。但别忘了,再好的模型也要结合市场经验。我见过太多人死磕模型,却忽略了市场结构的变化。