策略容量衰减:管多少钱之后,alpha 就被自己的冲击成本吃光了
毛 alpha 12% 和规模无关,净 alpha 却随 AUM 单调塌陷——受控模拟(500 只中小盘、中位 ADV 490 万美元、100 个持仓、平方根冲击)给出三条彼此差一个数量级的容量线:8x 换手下净 alpha 腰斩在 7.4 亿美元、归零在 29.6 亿;24x 换手腰斩点只剩 2700 万、归零 1.1 亿——同一个 alpha,换手率一改容量差 27 倍。真正先撞上的是硬约束:10% ADV 参与率上限在 4800 万美元就触发,那时净 alpha 还有 10.44%,账面上「毫发无伤」。四条扩容路线量化对比:降换手 8x→4x 把腰斩点推到 59.3 亿(8.0 倍)最有效,流动性倾斜前 30% 到 33.2 亿(4.5 倍)但换了 alpha 来源,扩到 300 个持仓 23.5 亿(3.2 倍)。冲击指数从 0.5 误设为 1.0,容量估计差 2.12 倍。五项对抗式检验全过:零冲击安慰剂下容量曲线跨四个数量级完全平直(0.00000000pp)、AUM 翻倍成本比 1.4142 精确等于理论 2^0.5、换手 4 倍成本比 8.0000 等于 4^1.5、12 个宇宙腰斩点 CV 仅 0.090。最容易犯的错是回测假设 252 天匀速执行——真实调仓挤在 1/8 的天数里,同样 2 亿美元成本从 3.17% 跳到 8.97%(2.83 倍)(中阶)
问题:回测里的 Sharpe 3.0,为什么募到 10 亿就死了#
一个策略回测跑出年化 12% 的 alpha,Sharpe 漂亮,回撤可控。基金开门迎客,第一年管 5000 万美元,实盘和回测基本对得上。第三年规模冲到 8 亿,业绩开始跑不动。第五年 20 亿,净值曲线躺平——策略没变,代码没改,市场也没有发生什么结构性断裂。
发生的事只有一件:这个策略的钱变多了。
毛 alpha 是策略的性质,和你管多少钱无关。但把毛 alpha 变成净 alpha 的那道减法——交易成本——是规模的函数,而且是超线性的函数。规模翻倍,你要买的股数翻倍,每股付出的冲击也变大,总成本涨得比规模还快。两条曲线一条平、一条向上,交点就是这个策略的容量(capacity)。
大部分人从来不算这个交点。他们把容量当成一个「以后再说」的运营问题,直到净值告诉他们答案。
先把冲击成本的形状定下来#
容量的全部数学都压在一个函数上:交易 股会让价格动多少。业界的共识版本是平方根律:
其中 是日波动率, 是日均成交额, 是参与率, 是量级为 1 的常数。这个形式在 Almgren、Bouchaud 等人的实证里反复出现,跨市场跨资产都大致成立。
关键在于它带来的成本的成本。付出的总金额是「交易量 × 每单位成本」:
规模翻倍,总成本涨 倍。而收入只涨 2 倍。这个 1.5 次方就是容量衰减的全部引擎——它保证了不管毛 alpha 多高,总有一个规模让净 alpha 归零。
建一个知道标准答案的世界#
模拟 500 只中小盘股票:ADV 服从对数正态(中位数 490 万美元/天,有少数大票和一条长尾小票),日波动率 2% 上下。策略毛 alpha 固定 12%/年、持仓 100 只等权、执行在 252 个交易日里匀速摊开。
import numpy as np
Y_IMPACT, GROSS_ALPHA, N_POS, TRADING_DAYS = 0.5, 0.12, 100, 252
def impact_bps(part, sigma, Y=Y_IMPACT, exponent=0.5):
"""平方根冲击律:part = 当日交易量 / ADV"""
return Y * sigma * np.power(np.clip(part, 0, None), exponent) * 1e4
def evaluate(aum, adv, sigma, turnover, rng, n_pos=N_POS, exponent=0.5):
"""给定 AUM 返回净 alpha、中位参与率、成本占比、最大参与率"""
pick = rng.choice(len(adv), size=n_pos, replace=False)
adv_p, sig_p = adv[pick], sigma[pick]
pos = aum / n_pos
traded_per_name = pos * turnover * 2.0 # 双边,年度
part = (traded_per_name / TRADING_DAYS) / adv_p # 日参与率
cost_bps = impact_bps(part, sig_p, exponent=exponent)
cost_frac = (traded_per_name * cost_bps / 1e4).sum() / aum
return GROSS_ALPHA - cost_frac, np.median(part), cost_frac, np.max(part)python注意 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%。投资人付管理费,买到的是负数。
容量有三个定义,它们差一个数量级#
「容量是多少」这个问题问得不精确,因为至少有三个口径:
- 硬容量:风控允许的最大参与率触发点。你不能一天买走某只股票 30% 的成交量——建仓建到一半价格已经跑了,而且这是执行台的红线。
- 半 alpha 容量:净 alpha 掉到毛 alpha 一半的规模。这是业界谈容量时最常用的口径,因为它还留着安全边际。
- 归零容量:净 alpha = 0。这是理论上限,实际上没人会管到这里。

上图 8x 换手的情形,把三条线并排放:
- 参与率上限(10% ADV)在 4800 万美元就被最拥挤的那只股票触发;
- 此时净 alpha 还有 10.44%——离 12% 只差一点点,账面上「毫发无伤」;
- 半 alpha 容量在 7.4 亿,归零在 29.6 亿。
硬容量比半 alpha 容量早了 15 倍。这就是为什么只看成本曲线做容量规划会得出荒谬的乐观结论:在成本模型还很温和的时候,执行台已经先撞墙了。下面那张对数轴的参与率图更直白——最拥挤那只的日参与率随规模线性上升,穿过 10% 红线的时候,中位参与率才刚过 1%。平均数完全掩盖了尾部的拥挤。
这也解释了一个常见的运营现象:基金经理说「我们的成本模型显示还能装 5 亿」,交易台说「小票已经买不进去了」。两边都没说谎,他们在说两个不同的容量。
冲击指数选错,容量差 2 倍#
平方根律里的指数 是实证共识,但不是铁律。有人用线性(,教科书里 Kyle 模型的简化),有人估出 0.6-0.7。

半 alpha 容量随指数的变化:
| 冲击指数 δ | 半 alpha 容量 |
|---|---|
| 0.5(平方根) | 7.4 亿美元 |
| 0.7 | 11.7 亿美元 |
| 1.0(线性) | 15.6 亿美元 |
线性假设给出的容量是平方根假设的 2.12 倍。方向值得注意:线性模型反而更乐观。原因是在参与率远小于 1 的区间里,——平方根律对小额交易的惩罚更重。很多人凭直觉以为「线性=更保守」,恰好搞反了。
实务含义:报告容量数字时不给冲击模型的形式和标定,这个数字就没有意义。 是从自己的执行数据里估出来的还是抄论文的,标定用的是哪段时期、哪个市值段,都直接改结论。
四条扩容路线,只有两条真的有效#
发现容量不够怎么办?把四种常见做法放在同一张图上比。

| 路线 | 半 alpha 容量 | 相对基准 |
|---|---|---|
| 基准(500 只池、100 持仓、8x) | 7.4 亿 | 1.0× |
| 扩到 300 个持仓 | 23.5 亿 | 3.2× |
| 只做 ADV 前 30% | 33.2 亿 | 4.5× |
| 换手降到 4x | 59.3 亿 | 8.0× |
降换手是杠杆最大的一条路,而且不改变 alpha 的来源。原因回到那个 1.5 次方:成本 换手,换手砍半,成本降到 。代价是信号衰减快的策略降不了换手——你的 alpha 半衰期如果是 3 天,硬拉到 4x 换手等于主动放弃大部分信号。
流动性倾斜(4.5×)看起来很划算,但它有一个隐藏的代价:只做大票之后,你交易的还是原来那个 alpha 吗?规模效应、流动性溢价、小市值动量——中小盘 alpha 在大盘股上往往显著更弱甚至消失。这条路线把容量买回来了,但可能顺手把毛 alpha 从 12% 削到 6%,那么真实的净效果要重算。图上这条橙线是在假设毛 alpha 不变的前提下画的,这个假设本身就是全文最可疑的地方,必须单独验证。
扩大持仓数(3.2×)的约束在信号宽度:如果模型只能可靠地排出 100 只股票的序,硬扩到 300 只等于把后 200 个仓位填上噪声。容量涨了,信息比率掉了。
对抗式检验:这些数字站得住吗#
五项检验,全部通过。
A1 零冲击安慰剂。 把 设为 0,容量曲线在跨四个数量级的 AUM 上必须完全平直。实测极差 0.00000000pp——整条衰减确实由冲击项驱动,没有其他路径悄悄泄漏规模效应。
A2 规模缩放的解析对照。 AUM 翻倍,成本占比应精确等于 (总成本 ,除以 得到占比 )。实测 1.4142,与理论一致到四位小数。
A3 换手缩放的解析对照。 固定 AUM,换手 4 倍,成本占比应等于 (交易量涨 4 倍,单位成本涨 )。实测 8.0000。这两项确认实现里没有把参与率或年化算错。
A4 种子稳定性。 换 12 个独立宇宙(重新抽 ADV 和波动率),半 alpha 容量均值 8.88 亿、标准差 8000 万、CV = 0.090。容量对具体标的池的抽样噪声不敏感,量级结论稳。
A5 执行节奏——最容易犯的那个错。 前面所有计算都假设交易在 252 天里匀速摊开。真实的调仓是聚集的:因子月度更新、财报季集中换仓,实际交易可能挤在 30 天里完成。把同样的年度换手压进 1/8 的天数:2 亿美元规模下,成本从 3.17%/年跳到 8.97%/年,翻 2.83 倍(正好是 )。
A5 值得单独强调,因为它是回测高估容量最常见的来源。回测代码里写 cost = notional * cost_bps,cost_bps 用全年平均参与率算——这一步就默认了完美匀速执行。真实的组合在调仓日集中吃流动性,参与率是平均值的好几倍,而成本按平方根放大。容量估计因此系统性偏乐观,偏的倍数取决于你的调仓有多集中。
诚实边界#
第一,这里只建模了冲击成本,没有建模「alpha 本身随规模衰减」。 现实中大资金还面临另一重挤压:你的交易本身在消灭信号。别人看到你的持仓变化,或者干脆你就是那个把价格推到公允值的人。这条渠道让真实容量比本文的数字更小,而且它没有干净的解析形式。
第二,容量不是一个数,是一条曲线加一组约束。 本文给了三个口径的容量,实际决策还要叠加:赎回压力下的清仓时间、单一名字的持股比例上限(5% 举牌线)、做空标的的券源、以及策略之间共用流动性的问题——同一家机构的两个策略买同一只票,冲击是叠加的,这正是交叉冲击要处理的问题。
第三, 和 必须用自己的执行数据标定。 本文取 、 是文献里的典型值,绝对量级(7.4 亿这种数字)因此只有相对意义。真正能用的做法是:从自己的成交回报里回归实际滑点对参与率,估出自己的 和 ,再代回这套框架。相对结论(换手的 1.5 次方杠杆、硬容量早于软容量、聚集执行的 2.83 倍惩罚)不依赖标定,绝对数字完全依赖。
归宿#
容量不是募资部门的问题,是策略设计的一个参数。这套框架的实用产出有三条:
做容量规划时,先算硬容量再算软容量。 参与率上限通常在净 alpha 还很健康的时候就触发了(本文里早 15 倍),它才是先撞上的那堵墙。
要扩容量,优先动换手率。 1.5 次方的杠杆意味着换手砍半就能把容量推高 8 倍,而且不改变 alpha 来源。流动性倾斜和扩大持仓都在偷偷换掉你的策略。
别信匀速执行的成本估计。 回测里的成本假设是全年摊平,真实调仓是集中的,差 2-3 倍是常态。把这个折扣打进去之后再报容量数字。
最后一句:容量是每个策略的出生缺陷,不是运营失误。 12% 的毛 alpha 在 5000 万美元上是印钞机,在 30 亿美元上是零。这两件事同时为真,而且从第一天就注定了。