交割失败与强制买入:缩短结算周期把风险从信用桶挪到了操作桶
T+2 改 T+1 的官方理由是「减少风险敞口」,而这句话只在信用桶里成立。6 万笔配售的受控模拟给出与监管叙事错位的账本:信用敞口精确腰斩(0.842→0.421 bp),但操作成本从 0.653 涨到 1.664 bp,节省被吃掉 240.1%,净额 +0.590 bp——风险没消失,只是从「对手方违约」这个几乎不发生的桶,搬进「自己后台来不及」这个天天发生的桶。零摩擦安慰剂是决定性的:STP 设为 100% 后失败率与操作成本精确归零,T+1 立刻变成无争议的净省 0.421 bp——T+1 本身没错,错的是把它装在一个 98.8% 的后台上。分水岭是 STP 盈亏平衡点 99.59%,而跨境只有 94.5%:纯境内净额 +0.223 bp、纯跨境 +1.818 bp,同一条规则给出相反判决。反直觉的是境内失败率放大 6.09 倍、跨境只放大 1.97 倍。买入冲击只占 T+1 成本的 2.4%,失败期价格敞口占 76.8%。单笔 SD 21.73 bp 对均值差 0.65 bp,需 4430 笔才够 |t|=2(高阶)
核心结论:缩短结算周期不消灭风险,它把风险从一个几乎不发生的桶(对手方违约)搬进一个天天发生的桶(后台来不及)。 在 98.8% 的境内 STP、94.5% 的跨境 STP 下,T+1 相对 T+2 信用敞口精确腰斩(省 0.421 bp),操作成本却涨了 1.011 bp,净额 +0.590 bp——每省 1 分钱信用风险,要多付 2.4 分钱操作风险。而这个结论不是「T+1 是坏主意」,是「T+1 是一张对后台质量收费的账单」:把 STP 提到 99.59% 以上,同一套模型立刻翻转成 T+1 更省。

一、这篇文章要拆的那句话#
2024 年美国把股票结算周期从 T+2 改到 T+1,欧盟和英国在排队。官方理由几乎总是同一句:
缩短结算周期减少了对手方风险敞口。
这句话是对的。它甚至是可以精确证明的:如果对手方违约的概率是每天 λ,你的敞口存活 D 天,那么期望替换成本正比于 λ · D · E[|价格变动|],而价格变动本身按 sqrt(D) 缩放。窗口从 2 天砍到 1 天,这一项必然下降。
问题在于,这句话只覆盖了账本的一半。
另一半是:结算周期同时是你的后台修复差错的时间预算。T+2 给你一整个额外营业日去核对账户、调头寸、借券、跨时区联系当地托管行。T+1 给你几个小时。同一个差错率,修复窗口砍半,未修复的差错就变成交割失败。
而交割失败不是记账问题,它有现金成本:借券费、失败期间的价格敞口、以及升级成强制买入(mandatory buy-in)时被塞进一个流动性极差的时点执行。
所以真正的问题不是「T+1 好不好」,而是:信用桶省下来的,和操作桶多花的,谁大?
这个问题不能靠拍脑袋,因为两个桶的量级差得很远,而且方向相反。得算。
二、为什么必须用受控模拟,而不是真实数据#
用真实数据回答这个问题有个根本困难:你只能观测到一个世界。美国现在是 T+1,你看不到「同样这批交易在 T+2 下会怎样」。跨国比较又混杂了市场结构、参与者构成、监管差异——你分不清是周期的效果还是别的。
受控模拟绕开这个:同一批交易、同一个随机种子、只改结算周期这一个参数,跑两遍。差额里的每一 bp,成因由构造已知。
世界设定:
6 万笔配售,名义金额中位约 180 万美元(对数正态,sigma=0.85)
标的年化波动率 28%
30% 跨境(FX 腿 + 时区 + 当地代理行),70% 境内
境内 STP 直通率 98.8%,跨境 94.5%
差错修复率:T+2 下 93%,T+1 下 62%(跨境再乘 0.82)plaintext关键的一步是替换成本必须按违约概率折算,不能用全额市值变动。清算会员的年违约概率大约 40 bp,折到 1-2 个营业日是个很小的数——这恰恰是本文的要害。我第一版模型直接用了全额 MTM 变动当替换成本,结果信用桶算出 101 bp、完全淹没操作桶,T+1 看起来是压倒性胜利。那是个 bug,不是发现:
# 错的:把整个价格波动当成信用损失
replacement_bp = mtm_move * 1e4 * 0.5
# 对的:只有对手方真的违约才付这笔钱
PD_ANN = 0.0040 # 清算会员年违约率 40bp
PD_DAY = PD_ANN / 252
LGD = 0.55 # 违约损失率
replacement_bp = PD_DAY * cycle_days * LGD * mtm_move * 1e4 * 0.5python改完之后信用桶从 101 bp 塌到 0.84 bp,和操作桶进入同一个数量级——这才是真实的权衡所在。一个把信用风险算大 120 倍的模型,会让任何缩短周期的提案看起来都无懈可击。
三、五个桶的完整账本#
def run(cycle_days, stp_dom=0.988, stp_xb=0.945, sigma_d=SIGMA_D, n=60000):
rng = np.random.default_rng(SEED)
notional = rng.lognormal(np.log(1_800_000), 0.85, n)
is_xb = rng.random(n) < 0.30
# 桶1+2:信用侧,随窗口线性/根号缩放
mtm_move = np.abs(rng.normal(0, sigma_d * np.sqrt(cycle_days), n))
replacement_bp = PD_DAY * cycle_days * LGD * mtm_move * 1e4 * 0.5
margin_funding_bp = 0.42 * cycle_days # 保证金占款的资金成本
# 桶3-5:操作侧,随修复窗口反向恶化
stp = np.where(is_xb, stp_xb, stp_dom)
broke = rng.random(n) > stp
repair = 0.93 if cycle_days >= 2 else 0.62
repair_p = np.where(is_xb, repair * 0.82, repair) # 跨境更难修
failed = broke & (rng.random(n) > repair_p)
fail_days = np.zeros(n)
base_len = 1.9 if cycle_days >= 2 else 2.8 # T+1 下队列排不掉
fail_days[failed] = 1 + rng.gamma(base_len, 1.0, failed.sum())
borrow_bp = fail_days * (0.0075 / 252) * 1e4
fail_mtm_bp = np.abs(rng.normal(0, sigma_d, n)) * np.sqrt(fail_days) * 1e4 * 0.5
buyin = failed & (rng.random(n) < 0.11)
buyin_bp = np.where(buyin, 34.0 * rng.uniform(0.6, 1.7, n), 0.0)
w = notional / notional.sum() # 按名义金额加权
return (replacement_bp + margin_funding_bp + borrow_bp
+ fail_mtm_bp + buyin_bp) * wpython跑出来的账本:
| 成本桶 | T+2 (bp) | T+1 (bp) | 变化 |
|---|---|---|---|
| 替换成本(对手方违约) | 0.0017 | 0.0006 | −0.0011 |
| 保证金资金成本 | 0.840 | 0.420 | −0.420 |
| 借券费 | 0.004 | 0.013 | +0.009 |
| 失败期间价格敞口 | 0.616 | 1.601 | +0.985 |
| 强制买入冲击 | 0.032 | 0.050 | +0.018 |
| 合计 | 1.494 | 2.084 | +0.590 |
信用桶省 0.421 bp,操作桶多花 1.011 bp,节省被吃掉 240.1%。

注意一个容易被忽略的细节:真正的信用节省几乎全部来自保证金资金成本(0.42 bp),而不是替换成本(0.001 bp)。替换成本小到可以忽略——因为清算会员一天违约的概率实在太低了。也就是说,「减少对手方风险」这个卖点,在数字上兑现的其实是「少占两天保证金的资金」,这是个融资故事,不是风险故事。
四、失败率:境内放大 6 倍,跨境只放大 2 倍#

全样本失败率从 0.47% 涨到 1.16%(2.47 倍),但拆开看是两个完全不同的故事:
- 境内放大 6.09 倍(0.08% → 0.49%)
- 跨境只放大 1.97 倍(1.38% → 2.71%)
这个方向很反直觉——不是应该跨境更脆弱吗?
跨境确实更脆弱,但它本来就已经很脆弱了。跨境的坏是存量的:STP 只有 94.5%,即便在 T+2 下也已经在大量失败。缩短窗口对它是雪上加霜,但相对增幅有限。境内的坏是新增的:98.8% 的 STP 在 T+2 下几乎不出事(0.08%),突然砍掉一个营业日的修复时间,那些原本能在第二天早上悄悄补掉的差错,一下子全变成了公开的交割失败。
运营上的含义:T+1 迁移的痛点不在你早就知道有问题的跨境链路上,而在你从来没操心过的境内链路上。前者你有专人盯,后者你的容量规划是按「反正第二天能补」建的。
另一个数字:平均失败持续天数从 2.98 天涨到 3.82 天。失败不仅变多,还变长——因为借券队列和差错处理队列在同一时间段拥堵,清不掉。
五、四项对抗式检验#
安慰剂 1:零摩擦世界(决定性检验)#
把 STP 设为 100%、去掉所有操作摩擦,只留信用桶。理论上此时 T+1 应该是无争议的胜利。

结果:失败率 0.000000,操作成本 0.000000 bp,T+1 净省 0.421 bp。
这条检验的意义比它看起来大得多。它证明:本文的结论不是「T+1 是个坏主意」。在一个后台完美的世界里,T+1 严格更好,而且好得干干净净。全部的成本翻转都来自操作摩擦这一个来源。
换句话说,反对 T+1 的人和支持 T+1 的人可能在同一个模型里都是对的——他们只是在讨论 STP 数值不同的两家机构。
安慰剂 2:零波动率世界#
把 sigma 设为 0,同时把买入冲击设为 0。理论上所有价格相关的桶都应该精确归零。
结果:替换成本 0.000000、失败期敞口 0.000000、买入冲击 0.000000。
同时失败率仍然是 1.16%——交割照样失败,只是失败不再花钱。这两条合起来证明:账本里没有加性常数,没有哪个桶在偷偷贡献一个与机制无关的固定数字。如果我的代码里有个写死的偏移量,这条检验会立刻暴露它。
检验 3:窗口缩放律#
替换成本里的价格变动项应该严格按 sqrt(D) 缩放。取 40 万样本单独测这一条腿:
- 实测 T+1/T+2 比值:0.708530
- 理论
sqrt(1/2):0.707107 - 误差:1.42e-03(纯抽样噪声量级)
缩放律成立,说明信用桶的实现是对的。但要强调:缩放律成立不代表桶的标签对——它只证明「这个数按我以为的方式随窗口变化」,不证明「这个数就是对手方风险」。
检验 4:STP 盈亏平衡扫描#
这是全文最有实践价值的一条。

| STP | T+2 (bp) | T+1 (bp) | 差额 |
|---|---|---|---|
| 90.0% | 5.480 | 13.703 | +8.223 |
| 95.0% | 3.271 | 6.566 | +3.295 |
| 98.5% | 1.437 | 2.272 | +0.835 |
| 99.0% | 1.264 | 1.636 | +0.372 |
| 99.4% | 1.089 | 1.290 | +0.200 |
| 99.59% | — | — | 0(盈亏平衡) |
| 99.7% | 0.973 | 0.855 | −0.118 |
| 100% | 0.842 | 0.421 | −0.421 |
盈亏平衡点:STP = 99.59%。
这个数字应该被印在每一份 T+1 迁移方案的封面上。它把一个政策辩论转化成一个可测量的运营 KPI:你的直通处理率过没过 99.59%?过了,T+1 是净收益;没过,你是在给自己开一张账单。
而 99.59% 是个很高的门槛。90% 的 STP 下 T+1 要多花 8.22 bp,而 99.4% 时只多花 0.20 bp——同一条规则,代价差 41 倍。这个非线性是本文最该被记住的一件事:STP 从 99.4% 掉到 95%,T+1 的总成本涨 5.09 倍,而 T+1 相对 T+2 的溢价涨 16.4 倍。后台质量不是一个「差不多就行」的维度。
六、同一条规则,两个相反的判决#
把组合拆成纯境内和纯跨境两个极端:
- 纯境内组合:净额 +0.223 bp(轻微变贵)
- 纯跨境组合:净额 +1.818 bp(明显变贵,是境内的 8.1 倍)
同一条监管规则,对两类机构的成本影响差 8 倍。一家纯做美国境内自营的机构几乎感觉不到 T+1,一家跑全球配售的资管会实打实地多付钱。这不是规则设计得不好,这是任何统一规则的必然结果——但它意味着「行业平均影响」这个数字对任何具体机构都没有指导意义。
再看强制买入冲击的扫描:

这条曲线几乎是平的:买入冲击从 0 bp 涨到 120 bp(现实中极端值),净额只从 +0.686 变到 +0.747,总共差 0.06 bp。
这个结果推翻了一个常见叙事。CSDR 强制买入制度在欧洲引起过巨大争议,业界的核心论点是「买入执行成本太高」。但在这个模型里,买入冲击根本不是主要成本——它只占 T+1 总成本的 2.4%。真正的大头是「失败期间价格敞口」,占 76.8%。
也就是说:失败本身就是成本,不需要升级成买入才产生成本。你持有一个本该已经交割掉的敞口,市场在动,这就是钱。盯着买入罚则去优化,是在优化账单上最小的那一项。
七、成本分布:98.86% 的交易完全没事#
这是运营视角最重要的一张图(数字而非图表):
| 指标 | T+2 | T+1 |
|---|---|---|
| 「安静」交易占比 | 99.55% | 98.86% |
| 99 分位成本 | 0.85 bp | 30.65 bp |
| 单笔最大成本 | — | 696.7 bp |
平均值在这里是有误导性的。0.59 bp 的均值差听起来微不足道,但它是这样构成的:98.86% 的交易一分钱额外成本都没有,剩下 1.14% 里有人付了 30 bp、极端的付了 696 bp。
这种分布形态有两个实际后果:
- 日常监控看不到问题。你的月度 TCA 报表显示成本上升 0.6 bp,淹没在噪声里。
- 事故是集中的。当它发生时,是在某一天、某几笔大单上,金额足够大到需要向上汇报。
样本量红线:单笔成本标准差 21.73 bp,而 T+1 与 T+2 的单笔均值差只有 0.65 bp。要在自己的账本上把这个差异测到 |t|=2,需要 4430 笔同类配售。一家中型资管一年可能都跑不到这个量——这意味着大多数机构在统计上永远无法从自己的数据里验证 T+1 到底让他们多花了钱还是省了钱。
12 个不同种子的稳定性检验:净额均值 +0.586 bp,CV 仅 0.154,区间 [+0.405, +0.692]。结论方向在所有宇宙里一致。
八、陷阱与局限(诚实版)#
1. 修复率 0.93 / 0.62 是我设的,不是测的
这两个数字驱动了全部结论。它们是基于「T+2 多给一整个营业日」的合理推断,但没有公开数据能校准。如果真实的 T+1 修复率是 0.80 而不是 0.62,盈亏平衡点会显著下移,结论可能翻转。这是本文最大的不确定性来源,也是任何机构做自己评估时第一个该替换成内部数据的参数。
2. 模型里没有学习曲线
现实中 T+1 迁移后,机构会投资自动化、改流程、加人手。本文比较的是「同样的后台,两个周期」的瞬时对比,不是三年后的稳态。长期看 STP 会被推高到盈亏平衡点以上——但那笔 IT 投资的成本,本文完全没有计入。
3. 保证金资金成本 0.42 bp/天 是个粗糙的代理
真实的保证金要求取决于组合净额、CCP 模型、会员分层。用一个线性的每日费率是简化。这一项占了全部信用节省的 99.7%,所以它的误设会直接按比例传导到结论。
4. 没有建模「失败会传染」
现实中 A 交割失败会导致 B 无法交割(fail chains)。本文的失败是独立的。这会低估 T+1 的操作成本——真实的链式失败在结算周期缩短时会更容易形成。
5. 未建模日内时点
T+1 的真正痛点之一是时区:亚洲投资者买美股,T+1 意味着确认窗口落在当地深夜。本文用「跨境修复率乘 0.82」笼统地代理了这件事,没有真的建模时钟。
九、实践 Checklist#
- 先测自己的 STP,再讨论周期。盈亏平衡点 99.59% 是个可以直接对标的数字。低于它,T+1 对你是净成本,而这个成本可以量化成预算去申请自动化投资
- 境内链路优先排查,不是跨境。跨境的失败你早就知道,境内失败率的相对放大(6.09 倍)才是没人做过容量规划的地方
- 别把优化重点放在买入罚则上。买入冲击只占 T+1 增量成本的 2.4%,失败期间的价格敞口占 76.8%——缩短失败持续时间比降低买入成本值钱 30 倍
- 监控 99 分位,不是均值。均值 0.59 bp 淹没在噪声里,99 分位从 0.85 跳到 30.65 bp 才是真实的风险画像
- 别指望用自己的数据验证。单笔 SD 21.73 bp 对均值差 0.65 bp,需要 4430 笔。用行业数据或受控模拟,不要用 200 笔的内部样本得出结论
- 区分「省资金」和「降风险」。信用节省的 99.7% 来自保证金占款减少,替换成本的节省只有 0.001 bp——如果你的理由是「降低对手方风险」,数字不支持你;如果理由是「释放保证金」,数字支持你
本文所有数字基于 SEED=20260806 的受控模拟,真实市场参数(尤其是差错修复率)可能存在量级差异。