halo 的技术博客

返回

问题:回测里的 Sharpe 3.0,为什么募到 10 亿就死了#

一个策略回测跑出年化 12% 的 alpha,Sharpe 漂亮,回撤可控。基金开门迎客,第一年管 5000 万美元,实盘和回测基本对得上。第三年规模冲到 8 亿,业绩开始跑不动。第五年 20 亿,净值曲线躺平——策略没变,代码没改,市场也没有发生什么结构性断裂。

发生的事只有一件:这个策略的钱变多了

毛 alpha 是策略的性质,和你管多少钱无关。但把毛 alpha 变成净 alpha 的那道减法——交易成本——是规模的函数,而且是超线性的函数。规模翻倍,你要买的股数翻倍,每股付出的冲击也变大,总成本涨得比规模还快。两条曲线一条平、一条向上,交点就是这个策略的容量(capacity)

大部分人从来不算这个交点。他们把容量当成一个「以后再说」的运营问题,直到净值告诉他们答案。

先把冲击成本的形状定下来#

容量的全部数学都压在一个函数上:交易 QQ 股会让价格动多少。业界的共识版本是平方根律

costbps=YσQADV\text{cost}_{\text{bps}} = Y \cdot \sigma \cdot \sqrt{\frac{Q}{\mathrm{ADV}}}

其中 σ\sigma 是日波动率,ADV\mathrm{ADV} 是日均成交额,Q/ADVQ/\mathrm{ADV}参与率YY 是量级为 1 的常数。这个形式在 Almgren、Bouchaud 等人的实证里反复出现,跨市场跨资产都大致成立。

关键在于它带来的成本的成本。付出的总金额是「交易量 × 每单位成本」:

总成本QQ=Q1.5\text{总成本} \propto Q \cdot \sqrt{Q} = Q^{1.5}

规模翻倍,总成本涨 21.52.832^{1.5} \approx 2.83 倍。而收入只涨 2 倍。这个 1.5 次方就是容量衰减的全部引擎——它保证了不管毛 alpha 多高,总有一个规模让净 alpha 归零。

建一个知道标准答案的世界#

模拟 500 只中小盘股票:ADV 服从对数正态(中位数 490 万美元/天,有少数大票和一条长尾小票),日波动率 2% 上下。策略毛 alpha 固定 12%/年、持仓 100 只等权、执行在 252 个交易日里匀速摊开。

注意 turnover 的口径:年度双边换手倍数。8x 意味着一年把组合翻新 8 遍,算上买卖两条腿是 16 倍名义交易额。这个数字对容量的杀伤力,马上就会看到。

容量曲线

三条曲线,同一个 12% 的毛 alpha,只是换手率不同:

换手率净 alpha 腰斩(6%)净 alpha 归零2 亿美元时的净 alpha
2x/年未触及未触及11.61%
8x/年7.4 亿美元29.6 亿美元8.88%
24x/年2700 万美元1.09 亿美元−4.23%

从 8x 换手到 24x 换手,容量差 27 倍。 低换手那条线在整个 20 亿美元区间内几乎是平的——它的容量约束根本不在冲击成本上,而在别的地方(策略本身的信号衰减、标的池宽度)。

这张表最该记住的一行是 24x 那行:在 2 亿美元这个对冲基金界完全不算大的规模上,一个高换手策略的净 alpha 已经是 −4.23%。投资人付管理费,买到的是负数。

容量有三个定义,它们差一个数量级#

「容量是多少」这个问题问得不精确,因为至少有三个口径:

  1. 硬容量:风控允许的最大参与率触发点。你不能一天买走某只股票 30% 的成交量——建仓建到一半价格已经跑了,而且这是执行台的红线。
  2. 半 alpha 容量:净 alpha 掉到毛 alpha 一半的规模。这是业界谈容量时最常用的口径,因为它还留着安全边际。
  3. 归零容量:净 alpha = 0。这是理论上限,实际上没人会管到这里。

成本拆分与参与率上限

上图 8x 换手的情形,把三条线并排放:

  • 参与率上限(10% ADV)在 4800 万美元就被最拥挤的那只股票触发;
  • 此时净 alpha 还有 10.44%——离 12% 只差一点点,账面上「毫发无伤」;
  • 半 alpha 容量在 7.4 亿,归零在 29.6 亿。

硬容量比半 alpha 容量早了 15 倍。这就是为什么只看成本曲线做容量规划会得出荒谬的乐观结论:在成本模型还很温和的时候,执行台已经先撞墙了。下面那张对数轴的参与率图更直白——最拥挤那只的日参与率随规模线性上升,穿过 10% 红线的时候,中位参与率才刚过 1%。平均数完全掩盖了尾部的拥挤

这也解释了一个常见的运营现象:基金经理说「我们的成本模型显示还能装 5 亿」,交易台说「小票已经买不进去了」。两边都没说谎,他们在说两个不同的容量。

冲击指数选错,容量差 2 倍#

平方根律里的指数 δ=0.5\delta = 0.5 是实证共识,但不是铁律。有人用线性(δ=1.0\delta = 1.0,教科书里 Kyle 模型的简化),有人估出 0.6-0.7。

冲击指数敏感性

半 alpha 容量随指数的变化:

冲击指数 δ半 alpha 容量
0.5(平方根)7.4 亿美元
0.711.7 亿美元
1.0(线性)15.6 亿美元

线性假设给出的容量是平方根假设的 2.12 倍。方向值得注意:线性模型反而更乐观。原因是在参与率远小于 1 的区间里,x>x\sqrt{x} > x——平方根律对小额交易的惩罚更重。很多人凭直觉以为「线性=更保守」,恰好搞反了。

实务含义:报告容量数字时不给冲击模型的形式和标定,这个数字就没有意义。δ\delta 是从自己的执行数据里估出来的还是抄论文的,标定用的是哪段时期、哪个市值段,都直接改结论。

四条扩容路线,只有两条真的有效#

发现容量不够怎么办?把四种常见做法放在同一张图上比。

四条扩容路线

路线半 alpha 容量相对基准
基准(500 只池、100 持仓、8x)7.4 亿1.0×
扩到 300 个持仓23.5 亿3.2×
只做 ADV 前 30%33.2 亿4.5×
换手降到 4x59.3 亿8.0×

降换手是杠杆最大的一条路,而且不改变 alpha 的来源。原因回到那个 1.5 次方:成本 \propto 换手1.5^{1.5},换手砍半,成本降到 0.51.5=35%0.5^{1.5} = 35\%。代价是信号衰减快的策略降不了换手——你的 alpha 半衰期如果是 3 天,硬拉到 4x 换手等于主动放弃大部分信号。

流动性倾斜(4.5×)看起来很划算,但它有一个隐藏的代价:只做大票之后,你交易的还是原来那个 alpha 吗?规模效应、流动性溢价、小市值动量——中小盘 alpha 在大盘股上往往显著更弱甚至消失。这条路线把容量买回来了,但可能顺手把毛 alpha 从 12% 削到 6%,那么真实的净效果要重算。图上这条橙线是在假设毛 alpha 不变的前提下画的,这个假设本身就是全文最可疑的地方,必须单独验证。

扩大持仓数(3.2×)的约束在信号宽度:如果模型只能可靠地排出 100 只股票的序,硬扩到 300 只等于把后 200 个仓位填上噪声。容量涨了,信息比率掉了。

对抗式检验:这些数字站得住吗#

五项检验,全部通过。

A1 零冲击安慰剂。YY 设为 0,容量曲线在跨四个数量级的 AUM 上必须完全平直。实测极差 0.00000000pp——整条衰减确实由冲击项驱动,没有其他路径悄悄泄漏规模效应。

A2 规模缩放的解析对照。 AUM 翻倍,成本占比应精确等于 20.5=1.41422^{0.5} = 1.4142(总成本 Q1.5\propto Q^{1.5},除以 QQ 得到占比 Q0.5\propto Q^{0.5})。实测 1.4142,与理论一致到四位小数。

A3 换手缩放的解析对照。 固定 AUM,换手 4 倍,成本占比应等于 41.5=8.04^{1.5} = 8.0(交易量涨 4 倍,单位成本涨 40.54^{0.5})。实测 8.0000。这两项确认实现里没有把参与率或年化算错。

A4 种子稳定性。 换 12 个独立宇宙(重新抽 ADV 和波动率),半 alpha 容量均值 8.88 亿、标准差 8000 万、CV = 0.090。容量对具体标的池的抽样噪声不敏感,量级结论稳。

A5 执行节奏——最容易犯的那个错。 前面所有计算都假设交易在 252 天里匀速摊开。真实的调仓是聚集的:因子月度更新、财报季集中换仓,实际交易可能挤在 30 天里完成。把同样的年度换手压进 1/8 的天数:2 亿美元规模下,成本从 3.17%/年跳到 8.97%/年,翻 2.83 倍(正好是 80.5=2.838^{0.5} = 2.83)。

A5 值得单独强调,因为它是回测高估容量最常见的来源。回测代码里写 cost = notional * cost_bpscost_bps 用全年平均参与率算——这一步就默认了完美匀速执行。真实的组合在调仓日集中吃流动性,参与率是平均值的好几倍,而成本按平方根放大。容量估计因此系统性偏乐观,偏的倍数取决于你的调仓有多集中。

诚实边界#

第一,这里只建模了冲击成本,没有建模「alpha 本身随规模衰减」。 现实中大资金还面临另一重挤压:你的交易本身在消灭信号。别人看到你的持仓变化,或者干脆你就是那个把价格推到公允值的人。这条渠道让真实容量比本文的数字更小,而且它没有干净的解析形式。

第二,容量不是一个数,是一条曲线加一组约束。 本文给了三个口径的容量,实际决策还要叠加:赎回压力下的清仓时间、单一名字的持股比例上限(5% 举牌线)、做空标的的券源、以及策略之间共用流动性的问题——同一家机构的两个策略买同一只票,冲击是叠加的,这正是交叉冲击要处理的问题。

第三,YYδ\delta 必须用自己的执行数据标定。 本文取 Y=0.5Y = 0.5δ=0.5\delta = 0.5 是文献里的典型值,绝对量级(7.4 亿这种数字)因此只有相对意义。真正能用的做法是:从自己的成交回报里回归实际滑点对参与率,估出自己的 YYδ\delta,再代回这套框架。相对结论(换手的 1.5 次方杠杆、硬容量早于软容量、聚集执行的 2.83 倍惩罚)不依赖标定,绝对数字完全依赖。

归宿#

容量不是募资部门的问题,是策略设计的一个参数。这套框架的实用产出有三条:

做容量规划时,先算硬容量再算软容量。 参与率上限通常在净 alpha 还很健康的时候就触发了(本文里早 15 倍),它才是先撞上的那堵墙。

要扩容量,优先动换手率。 1.5 次方的杠杆意味着换手砍半就能把容量推高 8 倍,而且不改变 alpha 来源。流动性倾斜和扩大持仓都在偷偷换掉你的策略。

别信匀速执行的成本估计。 回测里的成本假设是全年摊平,真实调仓是集中的,差 2-3 倍是常态。把这个折扣打进去之后再报容量数字。

最后一句:容量是每个策略的出生缺陷,不是运营失误。 12% 的毛 alpha 在 5000 万美元上是印钞机,在 30 亿美元上是零。这两件事同时为真,而且从第一天就注定了。

策略容量衰减:管多少钱之后,alpha 就被自己的冲击成本吃光了
https://blog.halo26812.eu.org/blog/strategy-capacity-decay
Author halo
Published at 2026年8月4日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨