成本、冲击与容量:一个策略能装下多少钱
同一个双均线,10 万块年化 1.47%,1000 万年化 -4.62%——不是策略变了,是你变大了
前面所有回测都隐含一个假设:你的委托不影响价格。
在 100 万上这个假设基本成立;在 10 亿上它显然不成立。加上冲击成本之后,同一个双均线策略:
资金 趋势跟随净年化 波动率目标净年化
不含冲击 2.15% 4.28%
10 万 1.47% 4.26%
100 万 0.01% 4.23%
1000 万 -4.62% 4.11%
1 亿 -19.26% 3.75%
10 亿 -65.56% 2.62%
左边这一列不是策略变差了,是你变大了。
而右边那一列几乎没动——两个策略的成交笔数是 256 和 2118,笔数多的那个反而扛得住。
这一节讲清楚为什么,以及一个必须写进任何策略报告的数:容量。
你在小区门口的面馆吃面,10 块一碗。
你一个人去,还是 10 块。
但如果你要一次买 500 碗——老板得临时加人、加锅、加料,价格一定不是 5000 块。
你的订单本身改变了价格。这就是冲击成本,它不在菜单上,只在你足够大的时候出现。
一、三层成本
| 层 | 内容 | 与规模的关系 | 前面用过吗 |
|---|---|---|---|
| ① 显性成本 | 佣金 2.5bp + 印花税 5bp(卖出) | 比例固定,与规模无关 | 一直在用 |
| ② 滑点 | 固定 5bp | 我们一直假设与规模无关 | 一直在用 |
| ③ 冲击成本 | 你的委托推动价格 | 随规模上升 | 本节才加 |
第三层用业界常见的平方根模型:
单笔冲击率 ≈ c · σ_daily · √(V / ADV)
单笔冲击成本 = V × 冲击率 ∝ V^1.5
V = 本次成交金额,ADV = 过去 20 日平均成交额,σ_daily = 60 日日波动。
c 是这一节里最不可靠的数,必须明说。
它无法从公开日频数据校准——校准需要逐笔成交与盘口数据。文献里常用 0.5~1.0。
所以本节的做法是:取 c=1.0 作基准,同时跑 c=0.5 与 c=2.0,只报在整个区间上都成立的结论。
这是处理"必须用但校不准的参数"的通用姿势:不是回避它,也不是假装它准,而是把结论的稳健性建立在一个区间上。
与 p4.2 的成本网格、p5.6 的自助法区间,是同一套思路。
二、两个对照策略:关键差别不是笔数
| 趋势跟随(整仓进出) | 波动率目标(小额调仓) | |
|---|---|---|
| 平均成交笔数 | 256 | 2118 |
| 累计换手额(倍基准资金) | 296.4× | 39.5× |
| 单笔成交额均值 | 116.0 万元 | 2.1 万元 |
| 标的 ADV 中位数 | 3.56 亿元 | 3.56 亿元 |
笔数多 8 倍的那个,单笔金额只有 1/55。
因为双均线是整仓进出:每次信号翻转,全部权益一次性换手。而波动率目标每天按波动微调仓位,每笔都很小。
三、冲击成本随规模的增长
累计冲击成本(占初始资金比例,全期 16 年,c=1.0):
| 资金 | 趋势跟随 | 波动率目标 |
|---|---|---|
| 10 万 | 10.81% | 0.27% |
| 100 万 | 34.18% | 0.84% |
| 1000 万 | 108.09% | 2.66% |
| 1 亿 | 341.82% | 8.40% |
| 10 亿 | 1080.94% | 26.55% |
每上一个数量级,冲击成本大约乘以 3.16(即 √10)——这正是平方根模型的形状。
🔧 动手做:同一个策略,放 10 万和放 10 亿(5 分钟)
跑 python capacity.py,看【一】净年化随资金规模的衰减(冲击成本 impact = c·σ·√(V/ADV))。
你会看到(实测):同一条策略,资金从 10 万加到 10 亿,净年化被冲击成本一路吃掉——趋势跟随的单笔均值达 116 万,而标的日均成交额(ADV)中位才 3.56 亿,你的一单几乎就是那天的成交量。
想明白:前面所有回测都藏了一个假设——你的委托不影响价格。100 万上成立,10 亿上是幻觉。一个"年化 20%"的策略,不说清能装多少钱,等于没说:它可能在 100 万上真赚,在你真想投的规模上早已是负的。
四、容量上限
定义:把不含冲击的年化吃到 ≤ 0 的资金规模。
| 策略 | 不含冲击年化 | c=0.5 | c=1.0 | c=2.0 |
|---|---|---|---|---|
| 趋势跟随(整仓进出) | 2.15% | 约 1000 万元 | 约 1000 万元 | 约 100 万元 |
| 波动率目标(小额调仓) | 4.28% | 10^10 元内未归零 | 约 100 亿元 | 约 100 亿元 |
趋势跟随的容量在千万级——在 c=2.0 下甚至只有百万级。
而这个策略在 p5.5 里已经被证明连样本外都撑不住。一个既没有样本外证据、容量又只有千万级的策略,不该出现在任何严肃的报告里。
五、参与率:比成本更硬的墙
冲击成本是"多付钱",参与率是"根本做不出来"。
单日成交额不该超过当日 ADV 的 10%——超过了,你就是市场本身。
超过 10% 上限的委托笔数:
| 资金 | 趋势跟随 | 最大占比 | 波动率目标 | 最大占比 |
|---|---|---|---|---|
| 100 万 | 0 / 256 | 10% | 0 / 2118 | 2% |
| 1000 万 | 34 / 256 | 101% | 0 / 2118 | 16% |
| 1 亿 | 229 / 256 | 1013% | 19 / 2118 | 155% |
| 10 亿 | 253 / 256 | 10133% | 385 / 2118 | 1554% |
"最大占比 101%"的意思是:那一笔委托本身,等于那只股票当天的全部成交额。
这类委托只能拆到多日执行,而拆单会引入额外的择时偏离——你想要的价格已经不在了。 这部分损失本模型完全没有计入,所以上面的容量估计仍然是偏乐观的。
六、为什么笔数多的反而扛得住:把 40.7 倍拆开
在 1 亿元档,趋势跟随的冲击成本是波动率目标的 40.7 倍,而它的成交笔数只有后者的 0.12 倍。
拆成两个因子:
趋势跟随 累计换手额 296.4 亿元,每元换手的平均冲击 115.3 bp
波动率目标 累计换手额 39.5 亿元,每元换手的平均冲击 21.3 bp
→ 换手额之比 7.5 倍 × 单位冲击之比 5.4 倍 ≈ 40.7 倍
两个因子都不利于整仓进出:它交易得更多,而且每一块钱都更贵。
第二个因子(单位冲击贵 5.4 倍)与"换手越高容量越小"的直觉相反,原因在模型形状里:
单笔冲击成本 ∝ V^1.5 —— 1.5 次方是超线性的
→ 同样的总换手额,拆成小单要便宜得多
所以容量的决定因素不是成交笔数,是单笔相对 ADV 的规模。
这也是实盘执行算法(TWAP/VWAP、冰山单)存在的全部理由:它们不改变你要交易的总量,只改变每一笔的大小。
📌 免责:本课为技术教学,标的为沪深300 成分股按代码序取样(非精选),冲击系数 c 无法从公开日频数据校准,所有测算为模型估计,不构成投资建议。
三件事:
- 第三层成本随规模上升。平方根模型
冲击率 = c·σ·√(V/ADV),单笔成本 ∝ V^1.5;每上一个资金数量级,冲击成本约乘 √10。同一个双均线:10 万年化 1.47%,1000 万 -4.62%,10 亿 -65.56% - 容量的决定因素是单笔相对 ADV 的规模,不是成交笔数。40.7 倍的冲击差 = 换手额 7.5 倍 × 单位冲击 5.4 倍;趋势跟随容量千万级(c=2.0 下只有百万级),波动率目标百亿级
- 参与率是比成本更硬的墙:1000 万档趋势跟随已有 34/256 笔超过 ADV 的 10%,最大那笔等于该股当天全部成交额。这类委托不是"多付点钱",是做不出来;拆单带来的择时偏离本模型完全没计入,所以容量估计仍偏乐观
一条必须带上的口径:"这个策略年化 X%"永远要跟一句"在多少资金上"。
关于 c 的处理方式值得单独记住:它校不准,所以跑 0.5/1.0/2.0 三档,只报在整个区间上都成立的结论——和 p4.2 的成本网格、p5.6 的自助区间是同一套思路。
下一节问一个更难的问题:策略是会衰减的。你打算什么时候承认它已经不行了?
🔎 来源与核验· 5 条,点开核对
