你把收益报告发给我,只问了一个问题:规模放大后,这套策略还能不能跑。5 分钟均值回归,约 30 个中市值 USDT 永续合约,回测中每笔交易的名义金额都固定为 $2,000,样本外 Sharpe 略低于 2,每次完整往返交易的平均毛优势约为 22 个基点,尚未扣除成本。你一直用零花钱在跑,现在想投入真正的资金——每笔就按 $50,000 算吧。
坦率地说,容量不是别人能直接告诉你的一个数字。它是一条曲线,而你这周的任务就是把它画出来。不过,用一张电子表格就能完成大部分工作,我希望你在用更昂贵的方式弄清楚之前先算一遍。
先从你已有数据能算出的比率入手
在建立任何冲击模型之前,先算参与率。取你 K 线数据中已有的成交额列——索引 7,也就是该 bar 的 USDT 成交额——看看你的订单会占典型入场 bar 成交量的多大比例。
按你这样的交易标的范围,用 5 分钟报价成交量的中位数来看,大致情况如下:
| 标的层级 | 5 分钟报价成交量中位数 | $2,000 订单 | $50,000 订单 |
|---|---|---|---|
| BTCUSDT | $18,000,000 | 0.01% | 0.28% |
| SOLUSDT | $3,200,000 | 0.06% | 1.6% |
| LINKUSDT | $450,000 | 0.44% | 11% |
| ARBUSDT | $220,000 | 0.9% | 23% |
| 你的标的池中流动性最差的一批 | $60,000 | 3.3% | 83% |
下 $2,000 时,你在所有标的里都几乎可以忽略不计,所以回测中的成交假设从未受到考验。下 $50,000 时,在这份列表的后半部分,你的订单规模已经相当于整根 bar 的成交量。5 分钟 bar 成交量的 83% 可不是普通执行,而是一次事件。无论你的成交模型对吃单价差怎么估算,它描述的都是一个你已经不在其中的市场。
我做初步判断时会用这条经验法则:订单超过该 bar 成交量的 10%,就别再相信回测对这笔成交的任何估算。介于 1% 到 10% 之间,要仔细建模冲击成本。低于 1% 时,价差和手续费占主导,可以继续往下做。
用你自己的标的,大致校准平方根定律
常用的工作模型是平方根冲击定律:以收益率计的成本,随波动率与所消耗日成交量占比的平方根成比例变化。
冲击成本 ≈ Y × σ_daily × √(Q / V_daily)
大多数估算中,Y 是接近 1 的常数;σ_daily 是该标的的日收益波动率;Q 是你的订单名义金额;V_daily 是当日名义成交额。看表里这个类似 ARB 的标的。5 分钟成交额中位数为 $220,000,折算下来每天约 $63M。假设日波动率为 4%。
把完整往返交易的成本算进去。下 $2,000 时:冲击成本 4.5 bps,加上 5-and-5 收费档下 taker 手续费 10 bps,总成本约 14.5 bps,而毛优势为 22 bps。净优势为 7.5 bps,和你的收益报告大致吻合。很好,模型和回测在你实际测试过的规模上得出了相同结果。下 $50,000 时:冲击成本 22.6 bps,加上同样的 10 bps 手续费,总成本 32.6 bps,而优势只有 22 bps。你每笔交易要倒贴 10 个基点。
令净优势为零并解出 Q,在这个标的上得到的规模约为 $14,000。不是 25 倍,而是 7 倍;而这个区间的最后三分之一,已经没有任何容错空间。平方根关系恰如其分地体现了平方根的特性:规模扩大 25 倍,单位规模成本扩大 5 倍,因此随着名义金额增长,亏损也会迅速累积。
容量按单个标的、单根 bar 计算,它的汇总方式和账户资金并不一样。“我的策略有 $2M 的容量”这句话说的是整个组合;真正的限制存在于每个标的的每笔成交中。你的标的池里,流动性最差的那些会最先触顶,而主流币种还远没到极限。
使用你实际交易时遇到的成交量,而不是中位数
还有一个比选 Y 值更重要的细化步骤。你刚才用成交量中位数算了参与率,但你并不是在成交量中位数对应的 bar 里入场。回去计算信号触发时对应的 V。
5 分钟均值回归通常在剧烈波动后触发,这意味着入场 bar 的成交额可能是中位数的 2 到 3 倍。这是实实在在的利好,相较于粗略估算,它能让你的实际容量翻倍。动量突破也有同样的利好。按计划入场的策略——比如固定再平衡或时段筛选——则没有这项优势;在平静行情中入场的策略,遇到的订单簿会比中位数暗示的更薄。
所以,实际测量一下。按入场时间做一次 groupby,就能得到成交量分布。我会看第 20 百分位数,而不是均值,因为决定风险的是那些糟糕的成交。如果入场 bar 成交量的第 20 百分位数低于中位数,说明你之前粗略估算的容量过于乐观,现在就该弄清楚。
真正会拖垮放大后的山寨币组合的因素
在回测里,30 个中市值永续合约看起来像 30 笔彼此独立的押注。但每个月真正关键的那 2 小时里,它其实就是一笔押注。连环清算发生时,所有标的都会和 BTC 同步相关,所有订单簿同时变薄,你那 12 笔同时持有的 $50,000 仓位,实际上就是 $600,000 的单向敞口,必须在本季度流动性最差的时候平掉。
基于中位数行情校准的冲击模型对此一无所知,你的 Sharpe 也一样。解决办法并不复杂:用成交量处于第 5 百分位的交易日重新计算参与率,再检查最大同时持仓总额是否能顺利平掉。如果在参与率上限为 10% 时,平掉整个组合需要连续交易 90 分钟,而你的优势 15 分钟就会衰减,那么你做的已经不是 5 分钟均值回归策略,而是附带均值回归说辞的慢速方向性仓位。
每一次容量讨论,最终都会变成持仓周期的讨论。冲击成本就是速度的代价。持仓时间越长,可交易的规模就越大;如果持仓时间无法延长,你能调整的就只有规模。
另一个会在 $2,000 到 $50,000 之间显现、让人措手不及的限制是杠杆档位。在大多数交易平台上,中市值永续合约的最大杠杆会随着仓位名义金额增加而下调;小市值标的的最高档位通常远低于你的目标规模。回测在 $2,000 规模下假定的保证金,不等于 $50,000 规模下实际需要的保证金。在假设资金需求线性增长之前,先查清标的池中每个标的的风险限额表。
如果是我,这周会这样安排
- 用 6 种规模重新跑同一套回测——$2k、$5k、$10k、$25k、$50k、$100k——并接入冲击模型,让冲击成本根据订单规模与该 bar 报价成交量的比值变化。不要用固定滑点常数。正是固定常数让你一开始相信 $50,000 规模可行。
- 绘制净 Sharpe 随规模变化的曲线。曲线会先保持平稳,然后开始拐头,最后下滑。曲线跌到你愿意接受的 Sharpe 水平时对应的规模,就是你的容量;还要留出充足折扣,因为所有冲击模型在极端行情下都会过于乐观。
- 按流动性层级划分标的,并为每个标的单独确定规模,而不是统一设置。30 个标的都用相同规模,意味着流动性最差的标的在悄悄补贴主流标的,而它们承受的却是整根 bar 成交量的 80%。
- 按照曲线给出的规模做模拟交易,并记录每笔成交的实际滑点与模型估算值。这个对比是你唯一能真正校准 Y 的办法。我在流动性差的山寨币订单簿上测出来的数值更接近 1.4,而不是 1.0。
在没看过具体数据的情况下,我猜每笔规模大概会落在 $8,000–$12,000,覆盖你标的池里流动性较好的三分之二;剩下的三分之一,我建议直接剔除,而不是接受它们带来的成交质量。这仍然比你现在的规模大不少,只是没到 25 倍。用电子表格提前发现这一点,不花一分钱。
算出规模曲线后发给我。我很想看看你的曲线会从哪里开始拐头。
← 全部文章


