ETF 申赎套利:一级市场折溢价为什么收敛,以及谁真的吃得到
受控模拟实验结论:宽基 ETF 折溢价半衰期约 8.7 分钟,AP(授权参与商)扣成本后净收益约 10.37bp/百万元(胜率 90%);普通投资者仅 7.37bp/百万元(胜率 81%,t=12.2,p≈0);无折溢价对照组 AP 依然亏损 5bp——套利利润的来源是折溢价本身,而非 AP 的技术优势。QDII 跨境 ETF 因额度限制与时差,半衰期拉长至 115 分钟,且可能长期不收敛;普通投资者在日内用 IOPV 实时数据判断折价存在 look-ahead bias,false signal 率 32.6%,修正后每笔亏损扩大至 -7.84bp。
开篇结论#
ETF 二级市场价格围绕净值(IOPV)波动,偏离时授权参与商(AP)通过一级市场申购/赎回抹平价差——这是教科书级别的”无风险套利”。但实际操作中:
- 宽基 ETF 折溢价半衰期约 8.7 分钟(蒙特卡洛实测 8 分钟),AP 有约 10 分钟窗口完成套利
- 普通投资者在二级市场追折溢价扣成本后,净收益期望值为正,但胜率仅 81%,且 t 检验显示 AP 系统性碾压(t=12.2,p≈0)
- 纯净对照组(折溢价 = 0 的市场)中,AP 依然亏损 5bp——说明套利利润来自折溢价本身,不是 AP 的技术优势
- QDII 跨境 ETF 是例外:额度限制 + 时差导致半衰期拉长至 115 分钟,且可能长期维持溢价不收敛
- 最常见的实盘 bug:用收盘 IOPV 判断日内折溢价,构成 look-ahead bias;修正后每笔亏损从 -0.11bp 扩大至 -7.84bp
本文所有数字来自同一受控模拟脚本,代码见后文。
一、机制建模:折溢价为什么收敛#
OU 过程:冲击 → 回复#
ETF 二级市场价格 与净值 IOPV 的偏离 可以用 Ornstein-Uhlenbeck(OU)过程描述:
- :均值回复速度, 越大收敛越快
- :冲击幅度(订单流噪声)
- 半衰期
import numpy as np
def simulate_premium_discount(T_minutes=390, kappa=0.08, sigma=0.0010,
x0=0.0035, n_paths=500):
"""OU 过程:dx = -kappa*x*dt + sigma*dW
kappa=0.08 → 半衰期 ≈ ln2/0.08 ≈ 8.7 分钟(高流动性)
kappa=0.025 → 半衰期 ≈ 27.7 分钟(中流动性)
kappa=0.006 → 半衰期 ≈ 115.5 分钟(QDII 跨境)
"""
dt = 1.0
paths = np.zeros((n_paths, T_minutes))
paths[:, 0] = x0
for t in range(1, T_minutes):
paths[:, t] = (paths[:, t-1]
- kappa * paths[:, t-1] * dt
+ sigma * np.random.randn(n_paths))
return pathspython三类 ETF 的参数设定:
| 类型 | (bp) | 初始冲击 (bp) | 理论半衰期 | |
|---|---|---|---|---|
| 宽基 ETF | 0.08 | 10 | 35 | 8.7 分钟 |
| 行业/主题 ETF | 0.025 | 20 | 70 | 27.7 分钟 |
| QDII 跨境 ETF | 0.006 | 35 | 120 | 115.5 分钟 |
宽基 ETF 的 最高,因为:① 成分股流动性好,AP 申购赎回冲击成本低;② 参与者众多,套利资金竞争激烈。QDII 的 最低,原因见第三节。

怎么读这张图:左图纵轴 0.35% 即 35bp,是集合竞价开盘后的典型冲击幅度;宽基 ETF(蓝线)在约 8.7 分钟后回复至 0 附近,QDII(红线)在 2 小时后仍未收敛。右图自相关衰减曲线,半衰期即自相关系数首次跌破 0.5 的滞后阶数——宽基仅需 8 分钟,行业 ETF 约 18 分钟,QDII 需要 30 分钟以上(实测值)。
二、收敛速度的横截面差异#
实测 vs 理论半衰期对比#
用蒙特卡洛模拟 500 条路径,测量每条路径自相关首次跌破 0.5 的滞后阶数,取均值:
| ETF 类型 | 实测半衰期 | OU 理论半衰期 |
|---|---|---|
| 宽基 ETF | 8 分钟 | 8.7 分钟 |
| 行业/主题 ETF | 18 分钟 | 27.7 分钟 |
| QDII 跨境 ETF | 30 分钟(实测上限) | 115.5 分钟 |
实测 QDII 半衰期远小于理论值,是因为模拟中 设得较大(0.006);而实测 QDII 半衰期远长于宽基,反映的是真实市场摩擦的量级差异。

怎么读:左图每个浅蓝色细线是 5 条模拟路径,深蓝色粗线是均值路径——注意均值路径比个体路径平滑得多,个体路径的波动是 AP 套利无法消除的噪声。右图条形图是核心对比:宽基 ETF 半衰期不到 10 分钟,AP 必须在 10 分钟内完成申购→赎回闭环,这对技术系统的要求极高;QDII 半衰期超过 100 分钟,给了普通投资者更多观察时间,但 AP 也面临额度限制。
三、谁吃得到:成本阶梯与利润分布#
AP 的套利闭环约束#
AP 要完成一次完整的套利闭环,必须同时满足:
- 最小申购单位:通常 100 万份(部分产品 50 万份),对应市值约 100-500 万元
- 一篮子股票冲击成本:买入一篮子成分股本身产生冲击,宽基 ETF 约 1.5bp,行业 ETF 约 3-5bp
- T+0/T+1 结算约束:上海/深圳 ETF T+0,跨市场 ETF T+1,QDII 可能 T+2
- 通道费用:券商结算费 + 过户费 + 管理费 ≈ 3.5bp
成本阶梯对比(蒙特卡洛 2000 次,100 万份等比)#
np.random.seed(777)
n_sim = 2000
# 折溢价分布:均值 15.37bp,std 8bp(基于真实市场观察)
premium_bp = np.abs(np.random.normal(15, 8, n_sim))
# AP 成本
ap_cost_bp = 3.5 # 固定成本(结算+过户+管理)
ap_market_impact_bp = 1.5 # 篮子冲击成本
ap_net_bp = premium_bp - ap_cost_bp - ap_market_impact_bp
ap_profit = ap_net_bp * 1_000_000 / 10_000 # 百万元
# 普通投资者(二级市场)
retail_slippage_bp = 5.0 # 买卖滑点
retail_commission_bp = 3.0 # 印花税 + 佣金
retail_net_bp = premium_bp - retail_slippage_bp - retail_commission_bp
retail_profit = retail_net_bp * 1_000_000 / 10_000python关键结果:
| 指标 | AP(授权参与商) | 普通投资者 |
|---|---|---|
| 折溢价均值(bp) | +15.37 | +15.37 |
| 固定成本(bp) | -5.0 | -8.0 |
| 净收益均值(bp) | +10.37 | +7.37 |
| 每百万份收益(元) | +1037 | +737 |
| 胜率(净收益 > 0) | 90.0% | 81.0% |
AP 的成本比普通投资者低 3bp(篮子冲击成本 1.5bp vs 滑点 5bp),加上无印花税,净收益系统性高 3bp——但这 3bp 在统计上极其显著(Welch t-test: t=12.24, p≈0)。

怎么读:左图成本阶梯最右侧”净收益”列是核心——AP 净收益均值 +10.37bp,普通投资者 +7.37bp,差距 3bp 来自分销渠道(AP 无印花税、无二级市场滑点)。右图分布注意两点:① AP 分布整体右移,但仍有约 10% 的情况亏损;② 两条分布有大量重叠——不是 AP 稳赚,而是 AP 的胜率和均值都更高。
四、两个关键对照实验#
对照 1:纯净引擎(无折溢价市场)#
将折溢价设为 0(模拟一个没有价格偏离的市场),重新跑同一套成本模型:
| 市场状态 | AP 净收益(bp) | 普通投资者净收益(bp) |
|---|---|---|
| 有折溢价(真实) | +10.37 | +7.37 |
| 无折溢价(对照组) | -5.0 | -8.0 |
结论:当折溢价 = 0,AP 和普通投资者双双亏损(成本 > 0)。这说明 AP 的利润100% 来自折溢价本身,而非 AP 的信息优势或技术能力。一旦折溢价被充分抹平,AP 的持仓成本就会吃掉利润——这解释了为什么 AP 套利是”动态的”而非”持续的”。
对照 2:置换检验(AP 优势是随机的吗?)#
对 1000 次随机置换计算 AP - 普通投资者净收益差,检验观测到的 3bp 差是否随机产生:
from scipy import stats
all_net_bp = np.concatenate([ap_net_bp, retail_net_bp])
labels = np.concatenate([np.ones(n_sim), np.zeros(n_sim)]) # 1=AP, 0=retail
perm_diffs = []
for _ in range(1000):
perm_labels = labels.copy()
np.random.shuffle(perm_labels)
diff = (all_net_bp[perm_labels==1].mean()
- all_net_bp[perm_labels==0].mean())
perm_diffs.append(diff)
perm_diffs = np.array(perm_diffs)
p_perm = np.mean(np.abs(perm_diffs) >= np.abs(observed_diff))
# 1000 次置换中,0 次产生了 >= 3.0bp 的差
# p_perm ≈ 0(被机器精度截断为 0)python结论:1000 次随机置换中,没有一次产生 ≥ 3.0bp 的组间差,p_perm 被浮点精度截断为 0。AP 的系统性优势不是随机噪声,是真实存在的成本结构差异。
五、QDII 跨境 ETF:制度性例外#
QDII 跨境 ETF(如恒生 ETF、纳斯达克 100 ETF)与 A 股 ETF 的核心差异不是流动性,而是制度约束:
- QDII 额度限制:基金公司外汇额度有限,申购上限卡死,AP 无法在额度满时完成赎回→卖出→再申购的闭环
- 时差:美股/港股开盘时间与 A 股不完全重叠,盘中 IOPV 计算依赖境外资产的前一日收盘价(A股收盘时美股还没开盘),导致 IOPV 实时估算误差极大
- 结算延迟:部分 QDII ETF 实行 T+2 结算,AP 的资金占用时间更长,资金成本上升
这些因素综合导致 QDII ETF 的 OU 模型 值下降到 0.006(宽基的 7.5%),半衰期拉长至 115 分钟,且在额度耗尽期间折溢价可能长期维持 50-100bp 不收敛。
这才是普通投资者唯一有可能”蹭到”折溢价修复的场景:QDII 折溢价长期偏高,当 AP 因额度满无法套利时,折溢价修复完全依赖其他套利资金缓慢入场。但此时买入 QDII ETF 本质上是在赌境外资产上涨,而非套利。
六、Bug 复盘:当日收盘 IOPV 判断日内折溢价#
Bug 描述#
最常见的实盘错误:用当日收盘 IOPV 判断日内某时刻是否应该买入/卖出 ETF。
这构成经典的 look-ahead bias——收盘 IOPV 是收盘后才知道的值,盘中无法获取。用收盘 IOPV 判断日内信号,等于用了未来信息。
代码对比#
# ── Bug 版本:look-ahead ────────────────────────────────
# 用收盘 IOPV 判断日内是否有折价机会
# 事后看:收盘 IOPV = 真实日内均值 + 小噪声 ≈ 真实值
# 等于把事后完美的信号当成盘中实时信号
iipv_close = true_intraday_premium_bp + small_noise
bug_signal = np.abs(iipv_close) > 5.0 # 阈值 5bp
bug_profit_per_trade_bp = true_intraday_premium_bp * 0.8 # 事后全拿到了
# ── 正确版本:实时 IOPV(有误差)──────────────────────
# 实时 IOPV 估算误差 ≈ 5bp(基金公司披露口径)
iipv_error_bp = np.random.normal(0, 5, n_trades) # 随机误差
iipv_realtime = true_intraday_premium_bp + iipv_error_bp
correct_signal = np.abs(iipv_realtime) > 5.0
# false signal:IOPV 报折价但实际没有,或方向相反
false_mask = np.abs(iipv_error_bp) > 5.0
false_signal_rate = np.mean(false_mask)
# false signal 时损失双倍滑点
correct_profit_per_trade_bp = (
true_intraday_premium_bp * 0.25
- retail_slippage_bp - retail_commission_bp
)
correct_profit_per_trade_bp[false_mask] = (
-retail_slippage_bp * 2 - retail_commission_bp * 2
)python修正前后数字对比(500 笔模拟交易)#
| 指标 | Bug 版本(look-ahead) | 正确版本(实时 IOPV) |
|---|---|---|
| 每笔净收益(bp) | -0.11 | -7.84 |
| false signal 率 | — | 32.6% |
| 修正后收益变化 | — | 下降 6966% |
修正后从 -0.11bp 恶化到 -7.84bp,跌幅 70 倍。false signal 率 32.6% 意味着每 3 笔交易就有 1 笔是被 IOPV 估算误差欺骗入场——且入场后发现方向错,承受双倍滑点。

怎么读:左图纯净引擎对照——折溢价 = 0 时 AP 和普通投资者都亏损,印证了”套利利润来自折溢价本身”的结论。中图置换检验分布——灰色直方图是 1000 次随机置换的差值,红色竖线是 3.0bp 观测差,观测差落在分布最右侧极端(p≈0)。右图 Bug 修正——绿色柱(正确版本)比红色柱(Bug 版本)低 7.73bp,Bug 版本其实是虚假的正收益,真正的实盘会亏损 7.84bp/笔。
七、诚实边界#
- 模拟参数 ≠ 真实市场:本文 OU 参数(, )基于合理市场假设,但不同 ETF、不同时段参数差异很大。实盘应基于历史折溢价时间序列做最大似然估计(MLE)。
- 成本参数是均值:真实成本受市场状态影响——波动率高时滑点更大,流动性差时冲击成本翻倍。本文取均值,但熊市/震荡市的成本结构会显著不同。
- 普通投资者胜率 81% 的含义:81% 胜率不代表”买了就赚”——胜率是统计概念,个体投资者面临的实际摩擦(最小交易单位、涨跌停、T+1)会让真实胜率更低。
- QDII 制度约束是真实但复杂的:额度限制是动态的——基金公司可能临时放开额度,折溢价瞬间收敛。普通投资者”赌 QDII 折溢价回归”的时间窗口不可预测。
- 本文不构成投资建议:所有结果来自受控模拟,非真实市场回测。
附:完整脚本运行说明#
脚本位于 scripts/blog_etfarb_20260731.py,依赖 numpy / pandas / matplotlib / scipy,运行:
python scripts/blog_etfarb_20260731.pybash输出 4 张 PNG + stats.json 到 public/images/etf-creation-redemption-arbitrage/。
所有实测数字均来自该脚本输出,文章正文数字与 stats.json 一一对应,可自行复现。
本文结论摘要(核心数字一览):宽基 ETF 半衰期 8.7 分钟;AP 净收益 10.37bp/百万元(胜率 90%);普通投资者净收益 7.37bp/百万元(胜率 81%,t=12.24,p≈0);无折溢价对照组 AP 亏损 5bp;QDII 半衰期 115 分钟(制度性例外);look-ahead bug 修正后每笔亏损从 -0.11bp 扩大至 -7.84bp,false signal 率 32.6%。