配对交易理论基础:核心思想、价差构建与平稳性检验
配对交易,说白了就是找两个「长得像」的股票,赌它们之间的价差会回归均值。我刚开始做量化那会儿,觉得这玩意儿挺玄乎的——两个不同的股票,凭什么会一起涨跌?后来在实盘里跑了几轮,才真正理解其中的门道。
配对交易的核心思想
核心逻辑其实很简单:找到两只高度相关的股票,当它们的价格出现偏离时,做多被低估的那只,做空被高估的那只,等它们重新「对齐」后平仓获利。
你想想看,如果两只股票长期走势几乎一致,那它们之间的价差就应该围绕某个均值波动。一旦价差拉得太大,市场迟早会把它「拽」回来。这就是配对交易的底层逻辑——均值回归。
核心假设:两只股票之间存在长期稳定的均衡关系,短期偏离会被市场修正。
我在项目中遇到过一个问题:很多人以为只要两只股票走势图看起来像,就能做配对。结果实盘一跑,价差越走越远,亏得底裤都不剩。嗯,这里要注意——相关性不等于协整性,后面我会细讲。
价差序列的构建
有了配对标的,下一步就是构建价差序列。价差不是简单地把价格相减,因为两只股票的价格量级可能差很多。举个例子,茅台2000块,五粮液200块,直接相减的话,茅台稍微动一动,价差就炸了。
我个人习惯用两种方式构建价差:
1. 价格比率法
直接用价格相除,得到一个比率序列。这个方法简单直观,但有个坑——比率序列的统计性质不太好,容易出现异方差。
# 价格比率法
spread = price_A / price_B
2. 回归残差法(推荐)
用线性回归拟合两只股票的价格关系,取残差作为价差。这个方法更严谨,能剔除掉量纲差异的影响。
import statsmodels.api as sm
# 回归残差法
X = sm.add_constant(price_B)
model = sm.OLS(price_A, X).fit()
spread = model.resid # 残差就是价差
我的经验:实盘中我更倾向用回归残差法。价格比率法虽然快,但遇到极端行情时容易误判。曾经有一次,我用比率法跑了一个配对,结果价差突然飙升,我以为是机会,结果是个假信号——后来发现是其中一只股票除权了。
平稳性检验(ADF检验)
价差序列建好了,怎么判断它能不能用?关键就看它是不是平稳的。
平稳性,说白了就是价差序列的统计性质(均值、方差)不随时间变化。如果价差不平稳,均值回归就无从谈起——你都不知道它该回归到哪个值。
ADF检验(Augmented Dickey-Fuller Test)是检验平稳性的标准工具。它的原假设是「序列存在单位根,即不平稳」。如果p值小于0.05,就拒绝原假设,认为序列是平稳的。
from statsmodels.tsa.stattools import adfuller
# ADF检验
result = adfuller(spread)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
if result[1] < 0.05:
print('价差序列平稳,可以用于配对交易')
else:
print('价差不平稳,需要重新选择配对标的')
避坑指南:我曾经犯过一个错误——只看ADF检验的p值,忽略了检验的滞后阶数选择。默认的滞后阶数可能不适合你的数据频率。日线数据和分钟线数据,最优滞后阶数完全不同。建议用AIC或BIC准则自动选择滞后阶数。
完整的配对交易流程
到这里,我们把配对交易的理论基础串起来了。下面这张图展示了完整的逻辑链条:
实际应用中的注意事项
理论讲完了,说点实战中的坑:
- 数据频率要匹配:日线数据用日线价差,分钟线用分钟线价差。混着用会出问题。
- 滚动窗口更新:价差的均值和标准差不是一成不变的。我习惯用60个交易日的滚动窗口,每天重新计算。
- 交易成本别忽略:配对交易是双边交易,手续费和滑点加起来不少。阈值设得太小,可能赚的钱还不够交手续费。
- 黑天鹅事件:2008年金融危机时,很多经典的配对组合都失效了。记得设止损。
一个小技巧:做ADF检验时,别只看p值。我还会看ADF统计量和临界值的对比。如果统计量比1%的临界值还小,说明平稳性非常强,这样的配对做起来更放心。
好了,配对交易的理论基础就这些。说白了就是三步走:找配对、建价差、验平稳。每一步都有坑,但踩过之后,你会发现这套方法在震荡市里特别好用。
公众号:蓝海资料掘金营,微信deep3321