配对交易原理:协整关系与相关性、平稳性检验(ADF检验)、配对选择的基本流程
各位同学,咱们今天聊点实在的。配对交易这个策略,说白了就是找两个“长得像”的品种,等它们价格跑偏了再出手。但这里有个关键问题——你怎么判断两个品种是真的“像”,还是只是碰巧走在一起?
我刚开始做量化那会儿,踩过一个大坑。当时看到两只银行股走势几乎一模一样,相关系数高达0.95,我兴奋得直接上了仓位。结果呢?一个月后它们分道扬镳,我亏得差点被风控叫去喝茶。后来我才明白——相关性高不代表它们会一直在一起。真正决定配对能否成立的,是协整关系。
一、相关性 vs 协整关系:别被表象骗了
很多人一上来就算相关系数,觉得0.9以上就是好配对。嗯,这里要注意——相关性衡量的是两个序列线性相关的程度,但它完全不管这两个序列的长期关系。
举个例子:
- 两只股票A和B,过去一年相关系数0.95
- 但A是趋势上涨,B是震荡下跌
- 你按相关性做配对,大概率亏钱
为什么会这样?因为相关性只看“同向变动”的强度,不看“价差是否稳定”。而协整关系,才是我们真正要找的东西。
核心区别一句话:
相关性告诉你两个序列是否一起动,协整告诉你它们分开后会不会回来。
我在项目中遇到过好几次这种情况:两只股票相关系数只有0.7,但协整检验通过了,实际交易效果反而比0.95的配对好得多。所以,别迷信相关系数,它只是初筛工具。
二、平稳性检验:ADF检验到底在测什么?
要理解协整,先得搞懂平稳性。平稳性说白了就是——一个时间序列的统计性质(均值、方差)不随时间变化。你想想看,如果一只股票的价格均值一直在变,你怎么判断它现在“贵了”还是“便宜了”?
ADF检验(Augmented Dickey-Fuller Test)就是用来判断序列是否平稳的。它的逻辑很简单:
- 原假设H0:序列存在单位根(不平稳)
- 备择假设H1:序列平稳
- 如果p值小于0.05,拒绝H0,认为序列平稳
我个人习惯,在做配对之前,先对每个品种单独做ADF检验。如果两个品种本身都是非平稳的(比如价格序列),但它们的线性组合是平稳的,那就说明它们存在协整关系。
实战小技巧:
ADF检验的滞后阶数选择很关键。我一般用AIC准则自动选阶,别手动设一个固定值,容易出问题。
三、配对选择的基本流程:从筛选到确认
好了,理论讲完了,咱们直接上流程。我自己的交易系统里,配对选择分四步走:
- 初筛:同行业、同板块、市值相近的品种。别把茅台和五粮液配一起,虽然都是白酒,但体量差太多。
- 相关性过滤:算相关系数,设个阈值(比如0.8以上)。这一步只是快速排除明显不相关的。
- 协整检验:用Engle-Granger两步法或Johansen检验。我个人偏好EG两步法,简单直观。
- 回测验证:用历史数据跑一遍,看价差是否均值回复,开仓信号是否有效。
下面这张图,是我自己画的配对选择流程,你们可以保存下来当参考:
四、代码实战:ADF检验与协整检验
光说不练假把式。下面是我常用的Python代码,你们可以直接拿去用:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller, coint
# 1. ADF检验:判断单个序列是否平稳
def check_stationarity(series, name=''):
result = adfuller(series.dropna(), autolag='AIC')
p_value = result[1]
print(f'{name} ADF p-value: {p_value:.4f}')
return p_value < 0.05
# 2. 协整检验:判断两个序列是否存在协整关系
def check_cointegration(series1, series2):
score, p_value, _ = coint(series1, series2)
print(f'Cointegration p-value: {p_value:.4f}')
return p_value < 0.05
# 示例:加载两只股票数据
# df = pd.read_csv('stock_data.csv')
# stock_a = df['AAPL']
# stock_b = df['MSFT']
# 先检查平稳性
# print(check_stationarity(stock_a, 'AAPL'))
# print(check_stationarity(stock_b, 'MSFT'))
# 再检查协整
# print(check_cointegration(stock_a, stock_b))
避坑指南:
我曾经在协整检验上吃过亏——直接用日线数据跑,结果p值看起来很好,但实际交易时价差根本不回复。后来发现,日线数据有滞后效应,建议至少用30分钟以上的高频数据做检验,或者用滚动窗口动态检验。
五、实战中的几个关键点
最后,分享几个我这些年总结出来的经验:
- 别只看p值:协整检验通过只是第一步,还要看价差的半衰期。半衰期太长(比如超过20个交易日),这个配对就没法做。
- 动态更新:协整关系不是一成不变的。我每3个月重新跑一次检验,发现有些配对半年后就失效了。
- 多品种组合:别只做一对,至少同时持有5-10个配对。分散风险,也避免单一配对失效时没仓位可开。
嗯,今天就先聊到这儿。配对交易的核心就是找到真正“绑在一起”的品种,而不是看着像就冲进去。下一节咱们会讲价差的计算和标准化,到时候再细聊。
公众号:蓝海资料掘金营,微信deep3321