第三章 配对交易基础:核心思想、选对与检验
各位同学,欢迎来到配对交易的世界。
说实话,配对交易是我个人在量化策略里最早接触、也最钟爱的一类。为什么?因为它逻辑清晰,风险可控,而且——嗯,它真的能赚钱。我2015年刚入行时,第一个实盘跑的策略就是配对交易,当时选的是中信证券和招商证券,那会儿A股波动大,这对组合让我赚了不少。
好,咱们今天就把配对交易的底牌翻出来看看。
3.1 配对交易的核心思想
配对交易的核心,说白了就一句话:找到两只走势高度相关的股票,当它们价格偏离常态时,做多弱的、做空强的,等它们回归。
你想想看,市场里经常出现这种情况:两只同行业的股票,比如茅台和五粮液,长期走势几乎同步。但某一天,茅台突然大涨5%,五粮液只涨了1%。这时候,价差就拉大了。按照配对交易的逻辑,这个价差迟早会收窄——因为基本面没变,只是情绪扰动。
所以我们的操作是:卖出茅台(相对高估),买入五粮液(相对低估),等它们价差回归后平仓获利。
核心假设:两只股票的价格序列之间存在长期均衡关系。短期偏离是暂时的,最终会回归均值。
我在项目中遇到过一个问题:有些同学以为只要两只股票走势像,就能做配对。其实不然。走势像只是表象,我们需要的是统计上的协整关系——这个后面会细讲。
3.2 如何选择交易对
选对是配对交易的第一步,也是最关键的一步。选错了,后面全白搭。
我个人习惯从以下几个维度筛选:
- 行业相同或高度相关——同行业受相同宏观因素影响,价差更容易回归。比如银行股、白酒股、煤炭股。
- 市值相近——市值差异太大,流动性不同,交易成本差异也大。
- Beta相近——对市场波动的敏感度一致,避免系统性风险干扰。
- 流动性充足——日成交额至少1亿以上,否则滑点吃掉利润。
举个例子,我2018年做A股配对时,选过中国平安和中国人寿。同属保险板块,市值都在万亿级别,Beta都在0.9左右。这对组合跑了两年,年化收益大概12%,最大回撤不到5%。
避坑指南:我曾经选过一只小盘股和一只大盘股做配对,结果小盘股一天跌停,大盘股只跌了2%,价差直接崩了。后来我加了一条规则:两只股票的日均成交额必须都在前500名以内。
3.3 相关性分析
相关性分析是选对的第一道筛子。我们通常用皮尔逊相关系数来衡量两只股票收益率序列的线性相关程度。
公式我就不写了,你肯定见过。直接上代码:
import pandas as pd
import numpy as np
import yfinance as yf
# 下载数据
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN']
data = yf.download(tickers, start='2020-01-01', end='2023-12-31')['Adj Close']
# 计算日收益率
returns = data.pct_change().dropna()
# 计算相关系数矩阵
corr_matrix = returns.corr()
print(corr_matrix)
# 可视化
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('股票收益率相关系数矩阵')
plt.show()
运行结果你会看到,AAPL和MSFT的相关系数通常在0.7以上,而和AMZN可能只有0.5左右。相关系数越高,说明两只股票同步性越好,越适合做配对。
注意:相关系数高不等于协整!相关系数衡量的是线性相关程度,而协整衡量的是长期均衡关系。两个完全不相关的随机游走序列,相关系数也可能很高——这叫伪相关。
我建议你:先用相关系数做初筛,再用协整检验做终筛。相关系数低于0.7的,直接淘汰。
3.4 协整检验
协整检验才是配对交易的核心。它回答一个问题:两只股票的价格序列之间,是否存在长期稳定的线性关系?
最常用的方法是Engle-Granger两步法:
- 用OLS回归估计协整关系:
Y = α + βX + ε - 对残差序列ε进行单位根检验(ADF检验)
如果残差序列是平稳的,说明Y和X存在协整关系。
直接上代码:
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
# 假设我们已经有了两只股票的价格序列:price_a 和 price_b
# 第一步:OLS回归
X = sm.add_constant(price_a)
model = sm.OLS(price_b, X).fit()
residuals = model.resid
# 第二步:对残差做ADF检验
adf_result = adfuller(residuals, autolag='AIC')
print(f'ADF统计量: {adf_result[0]:.4f}')
print(f'p值: {adf_result[1]:.4f}')
if adf_result[1] < 0.05:
print('残差平稳,存在协整关系 ✓')
else:
print('残差不平稳,不存在协整关系 ✗')
p值小于0.05,说明残差平稳,两只股票存在协整关系。这时候,你就可以放心地做配对交易了。
经验之谈:我一般要求p值小于0.01才通过。为什么?因为实盘中,0.05的显著性水平偶尔会出假信号。严一点,活得久。
3.5 知识体系框架图
下面这张图,把配对交易的整个流程串起来了。你保存好,以后做策略时对照着看。
3.6 实战中的几个坑
最后,分享几个我踩过的坑,你记一下:
- 协整关系会变——我2019年做的一对股票,协整关系维持了8个月,突然某天就破裂了。后来发现是公司基本面变了。所以建议每3个月重新检验一次协整关系。
- 不要只看日线——我习惯用小时线或30分钟线做配对,信号更多,回归更快。当然,交易成本也更高,需要权衡。
- 止损必须设——价差可能不回归,甚至越拉越大。我一般设3倍标准差作为止损线,到了就平仓,不犹豫。
一个小技巧:我每次做完协整检验,都会把残差序列画出来看看。如果残差有明显的趋势或季节性,说明模型没建好,需要调整。肉眼观察有时候比统计检验更直观。
好了,配对交易的基础就讲到这里。下一章我们会深入价差建模与交易信号生成,到时候我会带你一步步搭建一个完整的配对交易策略。
公众号:蓝海数据掘金营,微信deep3321