配对交易第二步:怎么挑出好搭档?
好,咱们接着聊。上一章我讲了配对交易的基本逻辑,说白了就是找两个“同涨同跌”的股票,等它们价格跑偏了再进场套利。但问题来了——市场上几千只股票,你总不能瞎蒙吧?
这一章,我就把筛选配对的具体方法掰开揉碎讲清楚。我个人习惯把这套流程叫做“四步筛选法”,每一步都能帮你过滤掉大量垃圾配对。
第一步:相关性分析——先看它们“步调”是否一致
相关性分析,说白了就是算两个股票价格走势的相似度。最常用的指标是皮尔逊相关系数,取值范围在-1到1之间。
- 接近1:同涨同跌,正相关强
- 接近-1:反向走,负相关强
- 接近0:没啥关系,别碰
我一般要求相关系数在0.8以上才考虑。低于这个数,后面协整检验大概率过不了。
⚠️ 注意:相关性高不代表一定适合做配对。我见过不少新手看到两只股票相关系数0.95就兴奋得不行,结果一跑协整检验直接翻车。为什么?因为相关性只看线性关系,而配对交易需要的是长期均衡关系。
举个例子,茅台和五粮液,相关系数常年0.9以上。但如果你拿茅台和某只煤炭股去算,可能只有0.3,那就别浪费时间了。
代码实现很简单,用Python的pandas几行搞定:
import pandas as pd
import numpy as np
# 假设df1和df2是两只股票的价格序列
corr = df1['close'].corr(df2['close'])
print(f'相关系数: {corr:.4f}')
# 我习惯用滚动窗口看稳定性
rolling_corr = df1['close'].rolling(60).corr(df2['close'])
print(f'滚动相关系数均值: {rolling_corr.mean():.4f}')
💡 我的经验:别只看全样本相关系数。我建议用滚动窗口(比如60天)算一遍,看看相关性是否稳定。如果忽高忽低,说明两只股票的关系不稳定,做配对风险很大。
第二步:协整性检验——这才是核心
相关性高只是表象,协整性才是配对交易的灵魂。你想想看,两只股票如果只是碰巧一起涨跌,但长期来看各走各的路,那价差迟早会失控。
协整检验,就是验证两个时间序列是否存在长期均衡关系。最常用的是Engle-Granger两步法,或者Johansen检验。
我个人习惯用Johansen检验,因为它能同时处理多个股票,而且不需要指定谁是自变量。
from statsmodels.tsa.vector_ar.vecm import coint_johansen
# 准备数据
data = pd.DataFrame({
'stock_a': df1['close'],
'stock_b': df2['close']
})
# Johansen检验
result = coint_johansen(data, det_order=0, k_ar_diff=1)
print(f'迹统计量: {result.lr1}')
print(f'5%临界值: {result.cvt[:, 1]}')
# 如果迹统计量大于临界值,说明存在协整关系
if result.lr1[0] > result.cvt[0, 1]:
print('✅ 存在协整关系,可以继续')
else:
print('❌ 没有协整关系,放弃这个配对')
⚠️ 避坑指南:我曾经遇到过一组股票,相关性高达0.95,协整检验也通过了,但实盘跑了两个月就崩了。后来一查,是因为样本期选得太短,刚好赶上两只股票都在牛市,看起来关系很铁,其实只是“虚假协整”。所以,我建议至少用1年以上的日线数据做检验。
第三步:行业与基本面匹配——别把苹果和橘子硬凑
这一步很多人会忽略,但我认为它比前两步更重要。为什么?因为统计方法只能告诉你“过去怎么样”,而行业和基本面匹配能告诉你“未来大概率会怎么样”。
我一般会检查以下几点:
- 行业相同:同行业股票受相同宏观因素影响,价差更容易回归
- 业务模式相似:比如两家都是做白酒的,或者都是做芯片的
- 市值规模接近:大市值和小市值股票波动特性不同,配对效果差
- 财务指标可比:PE、PB、ROE这些别差太远
举个例子,我做过一个配对:招商银行和兴业银行。都是银行股,市值接近,业务模式也类似。这个配对跑了两年,年化收益15%以上,最大回撤不到5%。
反过来,如果你把招商银行和宁德时代凑一起,就算相关性再高,我也不建议碰。为什么?一个银行一个新能源,基本面驱动因素完全不同,价差回归的逻辑根本站不住脚。
💡 我的习惯:每次筛选完统计上的候选配对,我都会手动查一下两家公司的年报,看看主营业务、收入结构、风险因素是否相似。这一步花不了多少时间,但能帮你避开很多坑。
第四步:流动性筛选——别做“纸上富贵”
最后一步,也是最容易被新手忽略的一步:流动性。你想想看,如果选了两只股票,每天成交量只有几百万,你建仓都费劲,更别说止损了。
我一般用以下几个指标筛选:
| 指标 | 我的最低要求 | 说明 |
|---|---|---|
| 日均成交额 | ≥ 5000万 | 确保能顺利进出 |
| 日均换手率 | ≥ 0.5% | 太低说明交投不活跃 |
| 买卖价差 | ≤ 0.1% | 价差太大会吃掉利润 |
| 流通市值 | ≥ 50亿 | 避免被庄家操控 |
代码实现也很简单:
# 假设有日线数据
daily_volume = df['volume'] * df['close'] # 成交额
avg_daily_volume = daily_volume.mean()
if avg_daily_volume >= 50_000_000:
print(f'✅ 日均成交额: {avg_daily_volume/1e6:.2f}亿,通过')
else:
print(f'❌ 日均成交额不足,放弃')
💡 我的经验:流动性筛选最好放在最后一步。因为前面三步已经帮你过滤掉大部分股票了,最后再检查流动性,能节省不少计算资源。我曾经一次性跑了5000只股票的配对,相关性+协整检验筛完只剩不到100对,再检查流动性和基本面,最后能用的也就20对左右。
知识体系总览
下面这张图,是我自己整理的四步筛选流程,你可以保存下来当参考:
嗯,以上就是配对选择的完整逻辑。四步走下来,能用的配对其实不多,但每一个都是精挑细选的。我个人宁愿花一周时间筛选,也不愿意随便选一对然后天天提心吊胆。
下一章,我会讲具体的止损策略和资金管理方案。到时候咱们再细聊。