AH溢价收敛交易:同一家公司两个价格的均值回归
同一家公司,A 股比 H 股贵 35%,教科书说这是套利机会——但这笔『套利』12 年都没到期。60 对双重上市股票、12 年日频模拟把 AH 溢价拆成三层:市场整体水位(半衰期约 170 天、长期不回零)、个股长期溢价(本身在随机游走)、个股短期偏离(半衰期 20 天,唯一可交易的成分)。滚动 z 分数策略在理论多空口径下 Sharpe 1.97,但 A 股个股不能融券做空——换成可实施的『多 H + 空指数期货』只剩 0.72,『只多 H』0.93 且大半是 beta。收敛分解显示 75.3% 的收敛由 H 腿上涨完成,这是策略还能活着的原因。另附两个方法论坑:用全样本均值算 z 分数是 look-ahead(本模拟里反而降低 Sharpe,因为长期均值在漂移,偷看未来均值反而给出更差的锚点);置换检验 200 次打乱信号,95 分位 -0.13,真实 1.97 无一次被超越。诚实边界:模拟假设个体偏离严格 AR(1),真实溢价的驱动是分红税差、资金管制与投资者结构,这些制度性因素决定了溢价可以永远不收敛——AH 不是配对交易,是跨制度的相对价值。
问题:同一家公司,两个价格,为什么不是免费的钱#
同一家公司在上海和香港同时上市,股票的投票权、分红权完全相同,但 A 股价格长期比 H 股贵 30%-40%(恒生 AH 溢价指数在 130-150 之间徘徊了大部分年份)。
教科书式的反应是:买便宜的 H 股,卖贵的 A 股,等价差收敛。
现实的反应应该是先问一个问题:如果这是套利,为什么价差十几年都没收敛?
答案是:AH 溢价不是「同一资产的两个价格」,而是「同一现金流在两个制度环境下的两个定价」。A 股与 H 股之间不能跨市场换股(你不能把 A 股拿去香港交割),套利闭环从物理上就不存在。价差没有到期日,没有强制收敛机制——这与配对交易里协整关系靠模型信仰维持相比,甚至更弱:配对交易至少可以指望竞争性套利资本,AH 之间连套利资本的通路都是残缺的。
那这个交易还有什么可做的?本文用一个受控模拟把 AH 溢价拆开,看清楚哪一层可交易、哪一层不可交易、以及不能做空 A 股这件事到底砍掉多少收益。
溢价的三层结构#
把第 对股票在 日的对数溢价写成:
三个成分性质完全不同:
- 市场整体水位 :所有 AH 对共享的溢价中枢。它受南下资金规模、两地流动性差异、汇率预期驱动,均值回归极慢(模拟中半衰期约 170 天),而且回归目标本身(35%)就不是零;
- 个股长期溢价 :不同股票的溢价水位天差地别——大盘银行股溢价常年 20% 上下,小盘股可以到 100% 以上。更麻烦的是它不是常数,随投资者结构变化缓慢漂移,模拟中直接建成随机游走;
- 个股短期偏离 :真正的均值回归成分,半衰期约 20 天。这是整个交易唯一站得住的部分。
# 三层溢价的模拟构造(节选)
kappa_c, theta_c, sig_c = 0.004, np.log(1.35), 0.006 # 水位:半衰期~170天
c[t] = c[t-1] + kappa_c*(theta_c - c[t-1]) + sig_c*eps # 慢速OU
mu_drift[t] = mu_drift[t-1] + 0.0025*eps_i # 长期溢价:随机游走!
kappa_i, sig_i = 0.035, 0.010 # 偏离:半衰期~20天
x[t] = x[t-1]*(1 - kappa_i) + sig_i*eps_x # 快速AR(1)python60 对股票、3000 个交易日(约 12 年)跑出来的市场长这样:

上图整体水位 12 年在 20%-50% 之间震荡、从不触零;下图横截面 10-90 分位带宽常年超过 40 个百分点。做这笔交易之前必须接受:你赌的不是溢价归零,是溢价回到它自己的(还在漂移的)均值。
信号:滚动 z 分数,以及一个反直觉的 look-ahead 结论#
信号构造很标准——对每只股票的对数溢价算滚动 250 日 z 分数,z > 1.5 进场(赌收敛),回落到 0.3 以下离场:
def zscore_signal(log_prem, lookback=250):
z = np.full(log_prem.shape, np.nan)
for t in range(lookback, len(log_prem)):
w = log_prem[t-lookback:t] # 只用历史窗口
z[t] = (log_prem[t] - w.mean(0)) / (w.std(0) + 1e-12)
return zpython方法论对照组:用全样本均值和标准差算 z(经典 look-ahead 错误)。多数场景下偷看未来会虚增业绩,但这里出现了反直觉的结果:

合法的滚动 z 拿到 Sharpe 1.97,look-ahead 版本反而只有 1.56。原因值得写下来:当长期均值本身在随机游走时,全样本均值是一个更差的锚点——它把 12 年后的均值水平混进了第 2 年的信号里,而滚动均值恰好自适应地跟踪了漂移。这不是说 look-ahead 无害,而是说它的偏差方向不总是向上;靠「结果没变好」来排除 look-ahead 是不可靠的。
右图是置换检验:把 z 信号整体循环移位 200 次(保留自相关结构、破坏与收益的对齐),置换 Sharpe 的 95 分位只有 -0.13,没有一次达到真实值。信号与收益的对齐是真实的——在这个模拟世界里。
关键结论:不能做空 A 股,砍掉的不是一半,是六成#
同一个信号,三种实现:
| 实现方式 | Sharpe | 年化收益 | 可实施性 |
|---|---|---|---|
| 理论多 H 空 A | 1.97 | 22.4% | ❌ A 股个股融券实际不可得 |
| 多 H + 空股指期货 | 0.72 | 7.3% | ✅ 可实施,但对冲的是市场不是那只 A 股 |
| 只多 H | 0.93 | 18.4% | ✅ 可实施,但大半收益是 beta |

理论口径 Sharpe 1.97,可实施口径最好 0.93——而且「只多 H」的 18.4% 年化里有大约三分之二是市场本身的收益(模拟里市场年化约 5% 加上个股波动的截面选择效应),真正来自收敛的 alpha 与「多 H + 空期货」的 7.3% 相当。用指数期货对冲个股多头,对冲掉的是 beta,留下的是个股特质风险加收敛 alpha——Sharpe 从 1.97 掉到 0.72,这就是制度约束的价格。
为什么这笔交易还活着:收敛由谁完成#
对 3179 个进场事件做 60 日收敛分解():

63.7% 的事件在 60 日内出现收敛,收敛事件的平均溢价压缩 6.45%。分解到两条腿:75.3% 的收敛由 H 股上涨完成,只有 24.7% 由 A 股下跌完成(模拟中设定 share_A=0.65 作用在对数溢价上,但由于进场偏向高溢价状态、叠加市场漂移,实现层面 H 腿主导)。
这个分解直接决定策略生死:如果收敛主要靠 A 跌,那么做不了空 A 的你只能干瞪眼;收敛主要靠 H 涨,「只多 H」才能捕获大部分收敛收益。真实市场中这个比例是实证问题——2014 年沪港通开通后的几轮收敛行情确实以 H 股修复为主(南下资金买入折价 H 股),但 2015 年那轮则是 A 股暴跌完成的收敛,只多 H 的组合在那种收敛里不仅赚不到,还要挨市场的打。
A. 实现细节#
- 信号:对数溢价的 250 日滚动 z 分数,z > 1.5 进场、z < 0.3 离场,等权分配到所有活跃信号;
- 执行:信号日收盘确认,次日以收益率近似成交(模拟无日内价格);单边成本 15bp(含港股印花税,这是对 H 腿友好的假设——真实 H 股中小盘价差可以远大于此);
- 三种实现的收益口径:理论 LS 用 ,期货对冲用 ,只多 H 用 ;
- 收敛分解基于进场后 60 日的对数价格变化恒等式,只统计溢价确实压缩的事件。
B. 已知偏差#
- AR(1) 偏离是对真实机制的美化:模拟里个股偏离有稳定的 20 日半衰期,真实 AH 价差的驱动是分红税差(H 股 20% vs A 股持有 1 年免税)、资金管制与两地投资者结构,这些制度因素变化时溢价中枢会跳变而非连续漂移——真实的均值回归比模拟更不可靠;
- 汇率被简化掉了:港币兑人民币的波动直接进入溢价,2015-2016 汇改期间这一项贡献过双位数百分比的「伪收敛」;
- 融券费率假设为无穷大(完全不可做空):部分 AH 对的 A 股其实在融券池里,只是费率 8%+ 且随时召回;本文直接按不可做空处理,低估了极端高溢价时点的机会。
C. 结果解读#
- 这不是套利,是承担制度风险的相对价值:没有收敛的强制力,z 分数赌的是统计规律而非无套利约束。仓位必须按「价差可以再走阔 50%」来设,而不是按「马上收敛」来设;
- 可实施 Sharpe 0.7-0.9 意味着它只配做组合里的一个分散化成分:与股票多头相关性低(期货对冲版本与市场相关约 0.1),这是它真正的卖点,而不是绝对收益;
- 收敛靠 H 腿是策略的软肋而非特性:H 腿修复依赖南下资金的风险偏好,恰恰在市场恐慌、溢价走阔到最诱人的时候,南下资金也在撤——信号最强的时刻与实现通道最堵的时刻高度重合;
- 横截面分化是真正可用的信息:整体水位难预测,但同一时刻 60 对股票谁的偏离更极端是横截面问题,不需要预测水位方向。实盘版本应该做成横截面多空(多最折价的 H、用期货对冲整体),而不是择时整体溢价。
模拟完整代码见 scripts/sim_ah_premium_convergence.py,固定种子 42 可完整复现。