一、配对交易的逻辑
如果你关注过量化交易,一定听说过配对交易(Pairs Trading)。逻辑非常直观:
两只同行业的龙头股,定价逻辑相同。当它们的价差拉大时,买入便宜的、卖出贵的,等价差回归后平仓获利。
这个策略在美股市场有几十年的成功历史。但A股有几个天然约束:
T+1
:当天买入最早次日才能卖出
融券困难
:绝大多数股票融不到券
长期趋势强
:A股龙头股往往有极强的长期上涨趋势
在这样的市场里,配对交易还能赚钱吗?我用了6年数据来回测。
二、实验设计
选股配对
为了覆盖不同行业特性,我选了三组代表性配对:
策略逻辑
1. 每日计算两只股票的价比:ratio = price_A / price_B2. 取60个交易日的滚动均值和标准差 3. 计算z-score = (当前ratio - 均值) / 标准差 4. z > 1.5 → B相对便宜,考虑买B z < -1.5 → A相对便宜,考虑买A 5. 买入附加条件:被买入股票的MA5 > MA20(确认短期动量) 6. 退出条件(两重,任意满足即退出): ① z-score 回归到 0.5 以下(价差收敛了) ② z-score 从入场继续恶化超过 1.0(止损,防深层亏损)
回测参数
回测区间:2020-01-01 ~ 2025-12-31(6年,1535个交易日) 初始资金:1,000,000元 交易成本:万三(含印花税+佣金) 数据:Tushare Pro 日线行情 + 前复权 框架:Backtrader
三、踩坑记录
第一版跑出来,6年只交易了4次——显然有问题。排查后发现两个Bug。
错误写法 ❌ def next(self): price_a = self.datas[0].close[0] price_b = self.datas[1].close[0] ratio = price_a / price_b self.ratio_history.append(ratio)
Backtrader中每添加一个数据源,next()就被调用一次。我有两个数据源,next()每天调用两次,ratio_history每天追加两次相同的值。60天滚动窗口压缩到30天,z-score计算全乱。
Bug 2:self.position只认主数据源错误写法 ❌ if not self.position: # 这只检查datas[0]的持仓!
Backtrader的self.position等价于self.getposition(self.datas[0])。当策略买入datas[1](比亚迪)时,self.position仍是False,导致可以重复加仓47万元,现金只剩53元,后续所有信号无法执行。
两个Bug修完后,交易恢复正常,各配对均有20-30次交易。
四、三组对比总表
| | | |
|---|
| 行业 | | | |
| 总收益 | +180.08% | -28.21% | -13.65% |
| +18.73% | | |
| 0.906 | | |
| | | |
| | | |
| | | |
| | | |
| 买入持有A | | | |
| 买入持有B | | | |
唯一的规律:波动越大,配对交易越可能有效。新能源的波动给了价差反复偏离和回归的空间,而金融股的平稳走势让价差几乎没有可交易的幅度。
五、如果A股实行T+0,结果会怎样?
为了回答这个问题,我额外加了一个实验:修改回测逻辑,允许信号触发当天就以收盘价成交(T+0模式),对比原来的隔夜成交(T+1模式)。
| | | | | |
|---|
| | +202.23% | | | 0.976 |
| | +9.81% | +23.46% | | 0.175 |
| | | | | |
关键发现
T+0将平安/人寿从亏损(-13.65%)扭转为盈利(+9.81%)。保险股这对最大的问题是——信号触发后,隔夜才能买入,第二天开盘价可能已经跳空,导致入场成本高出太多。T+0消除了这一跳空损耗,让策略的逻辑得以完整执行。
宁德/比亚迪在T+0下夏普达到0.976。对于一个没有用任何因子模型、只有简单z-score阈值的策略来说,夏普接近1.0已经是一个相当可观的数字。
银行股即使在T+0下仍然亏损。招行/兴业这对从-28.21%改善到-23.50%,但依然没有转正。这说明银行股的问题不是交易制度造成的,而是价差回归力度太弱——即使当天入场,回归收益也不足以覆盖交易成本和持有风险。
T+1的制度成本
T+1对配对交易的影响每年约1-4个百分点。对不同策略影响不同——持仓周期越短的策略,T+1的影响越大。配对交易的持仓周期通常在几天到几周,T+1的隔夜延迟对这类中低频策略的侵蚀大约是1-4个百分点/年。
六、结论
配对交易在A股,跑不赢买入持有
三组配对,两组亏损。唯一盈利的宁德/比亚迪组合,收益也只是买入持有宁德时代的1/3。核心原因:配对交易赚的是价差回归的钱。A股龙头股赚的是长期趋势的钱。在6年的时间尺度上,趋势的力量远大于回归的力量。大部分时间你在空仓等偏离,但龙头股在持续上涨。如果融券困难,导致无法做空被高估的那只,配对交易的收益就只剩一半了。
虽然配对交易作为独立策略跑不赢买入持有,但价差偏离本身是有用的信号——它告诉你今天这两只股票的相对定价关系不正常。这个信号更适合用来触发LLM去查原因,而不是直接用来交易:
系统监测到:宁德时代和比亚迪的价差偏离超过1.5σ ↓ LLM去查:今天出了什么新闻? → 宁德时代发了业绩预告? → 比亚迪发布了新产品? → 还是只是随机波动?
这篇实验做完了,但研究没结束。价差偏离信号本身是有价值的——我正在尝试把它和LLM结合,让AI自动去查"今天为什么偏离",而不是盲目交易。下篇会写这个。
如果你对量化交易、策略回测感兴趣,关注这个号,后续会持续分享策略拆解和实战记录
本文仅作为策略研究记录,不构成任何投资建议。回测结果不代表未来收益。投资有风险,入市需谨慎。