当前位置:首页>python>我用Python回测了6年:A股配对交易,到底能不能赚钱?

我用Python回测了6年:A股配对交易,到底能不能赚钱?

  • 2026-09-10 23:23:39
我用Python回测了6年:A股配对交易,到底能不能赚钱?

一、配对交易的逻辑

如果你关注过量化交易,一定听说过配对交易(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。

Bug 1:Backtrader双数据流陷阱
错误写法 ❌    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%
-5.38%
-2.42%
夏普比率
0.906
-0.304
-0.084
最大回撤
-28.67%
-46.89%
-46.56%
交易次数
29
26
24
胜率
58.6%
42.3%
45.8%
盈亏比
1.87
0.93
1.07
买入持有A
+554%
+39%
+3%
买入持有B
+527%
+43%
+46%

唯一的规律:波动越大,配对交易越可能有效。新能源的波动给了价差反复偏离和回归的空间,而金融股的平稳走势让价差几乎没有可交易的幅度。


五、如果A股实行T+0,结果会怎样?

为了回答这个问题,我额外加了一个实验:修改回测逻辑,允许信号触发当天就以收盘价成交(T+0模式),对比原来的隔夜成交(T+1模式)。

配对
T+1收益
T+0收益
提升
T+1夏普
T+0夏普
宁德时代↔比亚迪
+180.08%
+202.23%
+22.15%
0.906
0.976
中国平安↔中国人寿
-13.65%
+9.81%+23.46%
-0.084
0.175
招商银行↔兴业银行
-28.21%
-23.50%
+4.71%
-0.304
-0.235

关键发现

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年化
T+0年化
年化损失
宁德↔比亚迪
18.73%
20.25%
1.52%
平安↔人寿
-2.42%
1.57%
3.99%
招行↔兴业
-5.38%
-4.37%
1.01%

T+1对配对交易的影响每年约1-4个百分点。对不同策略影响不同——持仓周期越短的策略,T+1的影响越大。配对交易的持仓周期通常在几天到几周,T+1的隔夜延迟对这类中低频策略的侵蚀大约是1-4个百分点/年。


六、结论

配对交易在A股,跑不赢买入持有

三组配对,两组亏损。唯一盈利的宁德/比亚迪组合,收益也只是买入持有宁德时代的1/3。核心原因:配对交易赚的是价差回归的钱。A股龙头股赚的是长期趋势的钱。在6年的时间尺度上,趋势的力量远大于回归的力量。大部分时间你在空仓等偏离,但龙头股在持续上涨。如果融券困难,导致无法做空被高估的那只,配对交易的收益就只剩一半了。

价差偏离是一个好信号,但不是好策略

虽然配对交易作为独立策略跑不赢买入持有,但价差偏离本身是有用的信号——它告诉你今天这两只股票的相对定价关系不正常。这个信号更适合用来触发LLM去查原因,而不是直接用来交易:

系统监测到:宁德时代和比亚迪的价差偏离超过1.5σ     ↓     LLM去查:今天出了什么新闻?      → 宁德时代发了业绩预告?   → 比亚迪发布了新产品?      → 还是只是随机波动?

这篇实验做完了,但研究没结束。价差偏离信号本身是有价值的——我正在尝试把它和LLM结合,让AI自动去查"今天为什么偏离",而不是盲目交易。下篇会写这个。

如果你对量化交易、策略回测感兴趣,关注这个号,后续会持续分享策略拆解和实战记录

本文仅作为策略研究记录,不构成任何投资建议。回测结果不代表未来收益。投资有风险,入市需谨慎。

最新文章

随机文章