halo 的技术博客

返回

核心结论:空头的真实风险结构里,有一项从不出现在风险报告上——出借人可以随时把券要回去。 而这件事不是随机发生的:它与标的上涨正相关,也就是精确地在你最不想平仓的时候到来

2 万笔独立路径的受控模拟(真实空头 alpha 由构造设为 −8%/年)给出的账本:60 日持有期内 15.54% 的头寸被召回,平均收益从无召回反事实的 201.80 bp 降到 186.37 bp,拖累 15.43 ± 3.67 bp(t = 4.20),占反事实收益的 7.64%

但整体均值掩盖了真正的问题。被召回的那批交易,实际收益 −184.72 bp,同路径反事实是 −85.42 bp——recall 让这批本就亏钱的单子亏损扩大了 2.16 倍

左:召回率按持仓期涨幅分组,>30% 组 24.38% 是 <−15% 组 13.67% 的 1.78 倍;右:借券拥挤度五分位,真 alpha 最强的 Q5 净收益反而最差

一、问题:一个不在风险模型里的终止条款#

做空的完整流程是:找到出借人借入证券 → 卖出 → 等待下跌 → 买回归还。教科书讲的风险是「股价上涨、亏损无上限」和「借券费率上升」。

但合约里还有一条几乎不被建模的条款:出借人有权随时召回(recall)。原因很多——出借人自己要卖出、需要行使投票权、股息税务安排、或者仅仅是把券转租给出价更高的人。

一旦被召回,你必须在极短时间内(通常 T+1 到 T+3)归还。如果找不到新的出借来源,你就得在市场上买回平仓,无论价格多不合适

这件事为什么重要,取决于一个关键问题:

recall 是独立随机事件,还是与你的头寸表现相关?

如果是前者,它只是一个提前终止的噪声,对期望收益的影响近似中性。如果是后者——recall 更可能发生在标的上涨时(出借人看到价格涨了想卖出,或转租给出价更高的空头)——那么它就是一个系统性地在最坏时点截断头寸的机制。

本文用受控模拟把这两种情形分开量化。

二、模拟设计:真值由构造给定#

参数设定值说明
交易笔数20,000每笔独立抽路径
目标持有期60 交易日空头目标窗口
真实空头 alpha−8%/年真值,由构造给定
个股年化总波动38%
基础日召回强度 λ_base0.0018年化约 36.5%
对累计涨幅的敏感度3.5条件相关的强度
对拥挤度的敏感度0.010
一般券借券费0.4%/年GC
紧俏券借券费9%/年Special(拥挤度 > 45)

召回强度的设定是本文的核心机制:

expo = np.zeros_like(cum)
if ret_link:
    expo += lam_ret * np.maximum(cum, 0.0)
if crowd_on:
    expo += (lam_crowd * crowd)[:, None]
lam = lam_base * np.exp(expo)
python

np.maximum(cum, 0.0) 是关键——只有上涨(对空头不利)才抬高召回概率,下跌不降低它。这是一个不对称的、单边惩罚的结构。

每笔交易同时记录两个结果:实际收益(在 recall 或到期时平仓)和反事实收益(同一条路径持满 60 日)。两者逐笔配对相减,所以拖累的度量不依赖任何基准选择。

三、一个必须先讲的工程教训#

本文的第一版实现有一个致命缺陷,值得单独说,因为它是数值实验里最常见的陷阱之一。

初版让 300 只股票共用同一条市场因子路径,重复 3 次得到 900 笔交易。看起来样本量够了,实际上不是——共同因子让同一批次内的交易高度相关,有效独立样本数约等于重复次数,也就是 3

后果直接体现在自检指标上:

指标v1(共同因子)v2(独立路径)
单笔拖累 SD419 bp519 bp
拖累均值2.7 bp15.43 bp
达 |t|=2 所需样本94,0864,530
12 宇宙 CV1.53870.1595
λ 扫描单调性非单调(17.8 → 5.0 → −7.3 → 102.2 → −67.6 → 378.5)单调(4.9 → 10.2 → 21.8 → 35.1 → 48.1 → 61.0)

CV = 1.54 意味着换个随机种子结论可能反号。 λ 扫描里出现 −67.6 bp 然后 378.5 bp 这种跳跃,物理上没有任何解释——它纯粹是噪声。

按流程,自检发现这类问题必须修复重跑,不允许带 bug 交付。修复方式是每笔交易独立抽路径 + 全向量化,样本量提到 2 万笔。修复后所有扫描恢复单调,CV 降到 0.16。

这个教训可迁移:当你的扫描曲线出现无法用机制解释的非单调跳跃时,第一嫌疑不是「发现了有趣的非线性」,而是有效样本量塌缩。

四、基准结果与解析交叉核对#

指标数值
60 日内召回率15.54%
实际平均收益186.37 bp
无 recall 反事实201.80 bp
召回拖累15.43 ± 3.67 bp(t = 4.20)
占反事实收益7.64%
被召回者平均出场日第 30.64 日(目标 60 日)
被召回者实际收益−184.72 bp
被召回者同路径反事实−85.42 bp
盈利交易占比53.78%

为了确认这不是实现 artifact,做一个解析交叉核对。如果 recall 的唯一效果是「提前终止,少赚 alpha」,那么:

拖累 ≈ |α| × 召回率 × 平均损失天数 / 252
     = 0.08 × 0.15535 × 29.36 / 252
     = 14.48 bp
plaintext

实测 15.43 bp,比值 1.0654

吻合到 6.5% 以内。 多出来的 6.5% 正是「条件相关」的部分——recall 不是随机挑时点,它偏向标的上涨时,所以被截断的收益略高于纯随机截断的期望值。

这个核对同时告诉我们一个重要的量级判断:拖累的主体(约 94%)来自「持有期被缩短、alpha 没赚够」,只有约 6% 来自「择时恶意」。 这与很多人的直觉相反,下一节的安慰剂会进一步确认。

五、安慰剂检验:包括一个诚实的反直觉结果#

安慰剂检验:零 recall 精确为 0;零 alpha 塌到 3.23±3.63 bp;但涨幅脱钩后拖累反而升到 19.25 bp

安慰剂 A:切断涨幅联动,但把召回率校准到相同水平。

这是本文设计得最仔细的一条对照。简单地把 lam_ret 设为 0 会同时降低召回率,那样比较的就不是「条件相关」而是「召回多少」。所以我用二分法重新校准 lam_base,让召回率精确匹配基准的 15.54%:

def calib_lam_for_rate(target_rate, hold, lam_crowd, seed):
    lo, hi = 1e-6, 0.05
    for _ in range(40):
        mid = 0.5 * (lo + hi)
        s = simulate(6000, hold, ALPHA_ANN, mid, 0.0, lam_crowd,
                     ret_link=False, seed=seed)
        if s["recalled"].mean() < target_rate:
            lo = mid
        else:
            hi = mid
    return 0.5 * (lo + hi)
python

校准后 λ_base = 0.002169,召回率 15.59%(基准 15.54%)。

结果:拖累 19.25 ± 3.70 bp,比基准的 15.43 bp 更高。

这个结果与我的先验预期相反,但它是对的,而且有清楚的机制解释:

在基准情形下,召回被涨幅「吸引」到路径的上涨段。而在一条最终会下跌的路径上,上涨段往往出现在早期(先涨后跌)。被早期召回意味着平仓在一个相对高位,但也意味着这笔交易本来就还没开始赚钱。反过来,纯随机召回会均匀分布在整个持有期,包括那些已经赚了很多、继续持有还能赚更多的时点——截断这些反而损失更大

换句话说:

在本文的参数设定下,「recall 挑在你亏钱时到来」这件事的毒性,小于「recall 随机截断你的盈利头寸」。 条件相关让召回集中在早期、金额较小的时点,反而降低了平均拖累。

我不打算把这个结论过度推广——它依赖于 alpha 为负(做空能赚)且路径为几何布朗运动的设定。但它足以推翻一个流行说法:「recall 的危害主要在于它的择时恶意」。在这个模型里,危害的 94% 来自持有期被截断本身,择时效应甚至是反向的。

安慰剂 B:零 recall(λ_base = 0)。 拖累必须精确为 0。

实测:召回率 0.0000%,拖累 0.000000 bp。引擎自洽。

安慰剂 C:零 alpha(真 alpha = 0)。 如果没有 alpha 可被打断,拖累应塌向 0。

实测:3.23 ± 3.63 bp——标准误大于均值本身,统计上不可区分于零

这条是全文最重要的确认:拖累的来源确实是「被夺走的 alpha」,不是任何会计假象。 没有 alpha,就没有可被夺走的东西。

安慰剂 D:零波动(σ → 0)。 拖累 13.35 bp,这是纯 drift 项——在确定性下跌路径上提前平仓,少赚的那部分。它与解析预测的 14.48 bp 同量级,进一步确认账本正确。

六、剂量反应:召回精确地在最坏的时候到来#

虽然择时效应在总量上是反向的,但条件相关本身是真实存在的,而且剂量反应非常干净:

持仓期累计涨幅召回率样本数
< −15%13.67%4,894
−15 ~ −5%13.00%3,963
−5 ~ 5%15.39%4,210
5 ~ 15%16.40%3,487
15 ~ 30%19.20%2,646
> 30%24.38%800

>30% 组是 <−15% 组的 1.78 倍,且从 −5% 往上完全单调。

两个补充数字把这件事讲得更具体:

  • 被召回时平均累计涨幅 +1.65%,而全样本终值均值是 −2.34%
  • 被强平后,标的还要再走 −1.19%——这就是被夺走的那一段

第三个数字是最刺眼的。它的含义是:平均而言,你被赶下车的位置,距离你原本能到达的终点还有 1.19% 的下跌空间。 你的判断是对的,只是没能等到。

七、紧俏券悖论:alpha 最强的地方,也是最危险的地方#

按借券拥挤度分五组(Q5 = 最紧俏):

分位真 alpha实际收益反事实召回率借券费
Q1−8.43%173.57 bp181.10 bp12.55%0.40%
Q2−9.01%213.11 bp219.87 bp13.83%0.40%
Q3−9.56%165.20 bp185.21 bp15.48%0.40%
Q4−10.25%219.40 bp247.63 bp16.50%0.40%
Q5−11.49%160.58 bp175.19 bp19.33%5.11%

按紧俏券 / 一般券二分:

类别实际收益反事实召回率
紧俏券94.50 bp109.53 bp20.29%
一般券197.69 bp213.16 bp14.95%

紧俏券的真 alpha 最强(−11.49% vs −8.43%,强 36%),净收益却最差(94.50 vs 197.69 bp,只有一半)。

三重惩罚同时作用:

  1. 借券费:5.11% vs 0.40%,12.8 倍
  2. 召回率:20.29% vs 14.95%,高 35.7%
  3. 拥挤本身:所有人都在做同一笔交易

注意 Q1–Q5 的实际收益并不单调(173.57 → 213.11 → 165.20 → 219.40 → 160.58)。这是诚实的呈现——在这个样本量下,五分位之间的差异被路径噪声淹没了。可以确认的只有两端的对比(紧俏 vs 一般,94.50 vs 197.69)和召回率的单调上升(12.55% → 19.33%)。如果我把 Q1–Q5 的收益画成一条平滑下降的线,那是在编故事。

实践含义:

「借券费率高说明看空的人多、负面信息强」这个信号是真的,但它同时是「你拿不住」的信号。 信息优势被费率和召回率精确定价掉了。

八、持有期是放大器#

左:召回率随持有期单调上升;右:实际收益与反事实的裂口随持有期扩大

持有期召回率实际反事实拖累占比
5 日1.27%17.4117.730.32 ± 0.251.79%
10 日2.68%40.0140.430.43 ± 0.611.06%
20 日5.04%66.6666.49−0.18 ± 1.19−0.27%
40 日10.49%120.43131.3810.96 ± 2.468.34%
60 日15.55%188.11197.129.01 ± 3.584.57%
90 日23.46%270.83299.4428.61 ± 5.479.55%
120 日30.74%315.75398.7683.01 ± 7.4120.82%

召回率单调上升(1.27% → 30.74%),拖累占比在长端急剧放大到 20.82%

短端(5–20 日)的拖累在统计上不可区分于零——20 日甚至是 −0.18 ± 1.19 bp。这是正确的:持有期短,被召回的机会就少,且被截断的 alpha 也少。

这条曲线定义了做空策略的一个硬约束:慢速空头(基本面做空、等待价值回归)在结构上比快速空头承担高得多的召回风险。 一个需要持有 120 日才能兑现的做空论点,会被召回吃掉五分之一的收益——而这部分成本通常不出现在任何回测里。

九、缓解手段:定价与效果#

左:期限锁定的盈亏平衡溢价 0.648%/年;右:分散出借人的边际效果递减

期限锁定(term loan): 支付溢价换取不可召回。

锁定溢价0%0.25%0.5%1%2%4%8%
净收益 (bp)201.80195.85189.89177.99154.18106.5611.32

不锁定的基准是 186.37 bp,盈亏平衡溢价 = 0.648%/年

把这个数字和市场费率对照:一般券 0.40%/年,紧俏券 5.11%/年。

  • 对一般券:如果能以 GC 费率 + 0.65% 以内锁定期限,值得
  • 对紧俏券:5.11% 的费率已经远超 0.648% 的盈亏平衡点——但紧俏券恰恰是最容易被召回的

这构成一个真实的两难:最需要期限锁定的头寸,也是锁定成本最贵的头寸。

分散出借人: n 家各持 1/n,单家召回只砍 1/n 仓位。

出借人数123510
净收益 (bp)166.65181.02180.52183.94188.13

1 → 2 家是最大的一跳(+14.37 bp),之后边际效果迅速递减(2 → 10 家只多 7.11 bp)。这是标准的分散化收敛形态。

回避紧俏券: 197.69 bp vs 全样本 186.37 bp,+11.32 bp,零成本

在三种手段里,这是性价比最高的一个——不需要谈判、不需要支付溢价,只需要在建仓时把拥挤度作为一个排除条件。代价是放弃 Q5 那些真 alpha 最强的标的。

十、参数敏感性#

左:基础召回强度;中:条件相关强度;右:真 alpha 强度,线性放大 R²=0.9995

基础召回强度:

λ_base (年化)11.8%22.3%36.5%53.1%71.7%86.8%
召回率4.5%8.9%15.3%24.3%36.7%51.7%
拖累 (bp)4.910.221.835.148.161.0

完全单调,且呈现凹性(边际递减)——因为召回率趋近 100% 时,进一步提高强度只是让召回发生得更早,边际损失递减。

真 alpha 强度:

真 alpha0%−4%−8%−12%−20%
拖累 (bp)−3.55.914.723.040.0

线性拟合:斜率 216.7,截距 −3.05,R² = 0.9995

近乎完美的线性关系,且截距在统计上接近零。这是对「拖累 = 被夺走的 alpha」这一解释的最强支持:你的策略越好,recall 从你身上拿走的越多。 一个没有 alpha 的空头策略不怕召回,因为它本来也没什么可被夺走的。

条件相关强度:

敏感度0.01.02.03.55.08.0
召回率13.1%13.7%14.4%15.6%17.0%21.2%
拖累 (bp)9.78.68.88.810.215.6

这条曲线在 0–3.5 区间基本平坦(8.6–9.7 bp,且都在 ±3.6 bp 的标准误量级内),只在 8.0 处明显抬升。与安慰剂 A 的结论一致:条件相关的直接毒性远小于召回本身的存在。

十一、样本量红线:一个几乎无法被实证验证的成本#

这是全文最需要强调的一节。

指标数值
单笔拖累 SD519.08 bp
单笔拖累均值15.43 bp
达 |t| = 2 所需笔数4,530
单笔收益 SD1,784.84 bp
亏损交易占比46.23%
受影响交易占比15.29%(其余拖累恒为 0)
拖累 5% 分位−395.09 bp
拖累 95% 分位+545.83 bp

信噪比 = 15.43 / 519.08 ≈ 0.030。

分位数是双向的:5% 分位是 −395 bp(即 recall 反而帮了你,让你在更好的位置离场),95% 分位 +546 bprecall 有时候是运气,只是平均而言是成本。

左:整体收益分布几乎重叠;右:只看受影响的 15.29%,双向厚尾

实践含义极其残酷:

一个每年做 200 笔空头的基金,需要 22.7 年的数据才能在统计上确认召回拖累的存在。 在此之前,任何「我们的召回成本是 X bp」的说法都是在报告噪声。

这解释了为什么召回风险在行业里被系统性忽视——它不是不重要,而是无法从自己的交易记录里被看见。 唯一能看见它的方式,就是像本文这样构造一个真值已知的模拟。

多宇宙检验(12 个独立种子):拖累均值 15.85 bp,SD 2.53,CV = 0.1595。范围 11.23 ~ 18.97 bp。

CV 在 0.16 说明模拟结论本身是稳健的——这与「单笔无法验证」并不矛盾:模拟有 2 万笔样本,真实机构没有。

十二、对抗式审查:怀疑过并排除的点#

怀疑 1:安慰剂 A 的反直觉结果(19.25 > 15.43)是不是 bug? 这是自检中花时间最多的一点。三个检查:(a) 召回率确实校准到位(15.59% vs 15.54%);(b) 标准误 3.70 bp,差值 3.83 bp 约为 1.03 个标准误——严格说这个差异本身统计显著性有限,我在正文中的表述是「更高」而非「显著更高」;(c) 机制解释(条件相关把召回吸引到早期小额时点)与「被召回者平均出场日第 30.64 日」一致——如果召回是均匀分布,期望出场日应该更接近 30,实际 30.64 略偏后,方向吻合。结论:这个反直觉结果是真实的,但幅度不应被过度解读。

怀疑 2:解析核对的 6.5% 缺口去哪了? 解析式假设「损失天数 × alpha 日率」,忽略了两件事:借券费在提前平仓时也少付了(利好),以及路径的凸性效应。两者方向相反,净残差 6.5% 在可接受范围。如果缺口达到 50% 量级,我会认为账本有问题。

怀疑 3:Q1–Q5 的收益非单调是不是说明分组无效? 检查了各组样本数(均为 4000)和真 alpha 的单调性(−8.43% → −11.49%,严格单调)。真值梯度存在,但收益的组内标准差(约 1800 bp / √4000 ≈ 28 bp)与组间差异(约 20–50 bp)同量级,注定测不出单调性。这与我在其他事件研究里遇到的情形一致:真值梯度存在不等于可观测。正文如实呈现了非单调。

怀疑 4:持有期扫描里 20 日的拖累是负的(−0.18 bp),是 bug 吗? 标准误 1.19 bp,−0.18 完全在噪声内。而且 5 日(0.32 ± 0.25)和 10 日(0.43 ± 0.61)也都不显著。短持有期的拖累本来就应该接近零,出现小幅负值是正常的抽样波动,不是错误。

怀疑 5:为什么盈利交易只占 53.78%,做空 alpha 是 −8%/年不应该更高吗? 60 日持有期的期望收益约 −8% × 60/252 = −1.90%,而 60 日波动约 38% × √(60/252) = 18.5%。信噪比 0.103,对应的胜率理论值约 Φ(0.103) ≈ 54.1%——实测 53.78% 与理论吻合。这个核对确认路径生成没问题。

十三、结论与诚实边界#

可以带走的:

  1. 召回是一个真实的、可量化的成本,量级在 15 bp / 60 日持有期(占反事实收益 7.64%),且随持有期急剧放大(120 日达 20.82%)。
  2. 它随策略质量线性放大(R² = 0.9995)。你的 alpha 越强,被夺走的越多。这是一个「惩罚成功」的成本结构。
  3. 紧俏券是三重惩罚:费率 12.8 倍、召回率高 35.7%、真 alpha 最强却净收益减半。回避紧俏券是零成本的 +11.32 bp。
  4. 拖累的主体是「持有期被截断」,不是「择时恶意」——安慰剂 A 在同召回率下给出更高拖累,推翻了流行说法。
  5. 它几乎无法被实证验证:需要 4,530 笔交易才能达到 |t| = 2。这不是「不存在」的理由,恰恰是「必须用模型而非经验去管理它」的理由。

本文不覆盖的(诚实边界):

  • 召回强度的参数是构造设定,不是市场估计。 真实的召回率因市场、券种、出借人类型差异巨大。本文给出的是机制和量级关系,不是任何具体市场的校准值。任何把 15.43 bp 直接搬到实盘的做法都是误用。
  • 未建模逼空(squeeze)动态。 真实的召回潮往往是相关的、集群式的——多个出借人在同一时间因同一原因召回,这正是逼空的机制之一。本文假设召回在标的间独立,因此系统性低估了尾部风险。这是本文最重要的一个保守偏差。
  • 未建模「找到替代出借人」这条路径。 实务中被召回不一定意味着必须平仓,可以尝试重新借入(可能是更高费率)。本文假设召回即平仓,是保守假设。
  • 几何布朗运动路径。 没有厚尾、没有波动率聚集、没有跳跃。做空最怕的恰恰是跳涨,而本文的路径生成低估了这类事件。
  • A 股融券的制度差异。 本文的框架更贴近美股借券市场。A 股融券在券源、期限、强平规则上有本质差异,结论不能直接迁移。

最后一句:做空的风险管理清单上,「股价上涨」通常排第一,「借券费率」排第二,「召回」经常不在名单上。 而本文的数字说明,对一个 alpha 强、持有期长、标的紧俏的空头策略,召回可能是排第二的成本项——它只是恰好躲在了统计显著性的阈值之下。

借券召回风险:把你打死的不是股价上涨,是券被要回去
https://blog.halo26812.eu.org/blog/securities-lending-recall-risk
Author halo
Published at 2026年8月7日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨