实盘 vs 回测表现:你该预留多大的差距
实盘表现总是比回测差。差多少取决于策略、市场 regime 和执行。这里讲怎么在部署之前估计这个差距。
计划实盘 Sharpe 是回测 Sharpe 的 30–50%。计划滑点是回测估计的 2 倍。如果你能接受这个,部署。如果不能,别部署。这件事不存在”实盘跟回测一样”的版本。任何告诉你不一样的人在卖你东西。
这篇文章拆解 backtest-to-live 差距的四个组成成分、给你已发表研究里的经验性 shrinkage 规则、走过一遍容量建模、最后给一个部署前可以跑的 checklist。
四个组成成分
回测和实盘表现之间的差距来自四个不同的来源。每一个在部署之前都能估计。每一个都比你想的更狠。
1. 执行滑点。 你的回测假定你能拿到收盘价。现实中你拿到的是收盘价减去买卖价差的一半、减去市场冲击、减去信号到成交之间的延迟。流动性好的美股,每个 trade 1–3 个基点。流动性差的名字,5–20 bps。期货 0.5–2 个 tick。外汇 0.5–1.5 个 pip。
2. 容量约束。 你的回测假定你能交易任何规模。现实中你会在某个点耗尽流动性。如果你的策略需要在一只日成交 500 万美元的股票上每天交易 1000 万美元,你就在把市场往对自己不利的方向推。实盘表现崩盘。
3. Regime 切换。 你的回测拟合了一个历史窗口。实盘交易发生在未来。未来不匹配过去。有时未来更好。有时差很多。
4. 过拟合(CV 失败)。 即使做了正确的 purged walk-forward,你的回测 Sharpe 仍然是乐观的。CPCV 那篇文章说过,诚实的方法 5–15% 的乐观偏差。K-fold 是 30–60%。如果你用的是弱的 CV 方法,这个差距比其他三个加起来还大。
相对量级取决于策略和资产类别。低频策略在流动性好的美股上,滑点小、regime 切换占主导。高频策略在单只名字上,容量占主导。用 k-fold CV 测试的动量策略,过拟合占主导。
经验性 shrinkage 规则
McLean 和 Pontiff(2016)研究了学术文献里的 97 个异常策略。他们发现发表后策略收益平均下降了大约 32%。发表后这段时期是实盘表现的有用代理,因为它把发表效应偏差从回测里去掉了。
具体到 Sharpe 比率,Bailey 和 López de Prado(2014)展示了怎么用 Deflated Sharpe Ratio 把观测 Sharpe 对照多重检验下的期望最大值做评估。DSR 是一个概率值,不是按某个百分比往下压、也不是调整后的 Sharpe 幅度;下面这些 live-performance shrinkage 的数字,是一个独立的经验先验问题。
López de Prado Advances in Financial Machine Learning(ISBN 978-1-119-48208-6)的相关章节是第 13 章——合成数据那一章。但 50–70% 和 30–60% 这些数值是经验先验,不是 AFML 里的固定规则;任何 live/backtest shrinkage 的具体数字都应标明是应用特定的估计。
这些不是定律。它们是经验先验。如果你全做对了,策略可能在 80% 那一档。如果你过拟合了,它可能在 10% 那一档。
怎么现实地估计滑点
你的回测滑点模型几乎一定过于乐观。下面是怎么把它变现实。
第一步:用半价差代替零滑点。 大部分回测用收盘价、假定你拿到收盘价。你拿不到。假定你拿到买卖价差的中点减去价差的一半。一只 100 美元、价差 2 分的股票,那是 99.99 美元而不是 100.00 美元。每边 1 个基点,不是半个基点。
第二步:加市场冲击。 市场冲击随你参与率的平方根缩放。如果你在某只日均成交额 美元的名字上交易 美元,用一个显式带单位的模型,比如:
其中 是日波动率(小数), 是一个无量纲的冲击系数。取 、2% 波动率的名字、$V = 100 万美元$、$ADV = 5000 万美元$,那 bps。如果把系数误设成 10、又不做 bps 换算,你会得到 0.028 这个十进制结果,也就是 283 bps 而不是 2.8 bps。
第三步:加延迟惩罚。 你的信号在收盘时触发。你的单子在收盘后 50–500 毫秒到达交易所。等你成交的时候,价格已经动了。流动性好的名字假设每笔 0.5 bps,流动性差的更多。
第四步:为了安全乘 2。 经验研究显示回测的滑点估计低估了实盘滑点大约 2 倍。所以如果你的模型说每笔 5 bps,按 10 bps 计划。
对一个每月再平衡、年化毛收益 100 bps 的策略,每笔 10 bps、如果一年交易 24 个名字,那就是一年 240 bps。吃掉你毛收益的 24%。实盘 Sharpe 会相应更低。
容量建模
每条策略都有容量。超出那个容量,策略就不好使了。
容量由仓位占比、日成交量、年化约定和最大参与率四个东西决定。设 是仓位占比、 是每日美元成交量、 是最大参与率、 是年化换手约定。在该约定下:
当 是日美元量、 是无量纲的年化换手时, 的单位是美元。说清楚 是仓位的换手率还是总 AUM 的换手率——约定换了结果会跟着变。
对一个 1 亿美元组合的 5% 仓位,按 的年化名义换手是 。按 50 美元股价,那是:
不是 40 股/天。如果 股/天,参与率大约是 ,远低于 5% 的上限。按给出的容量约定,、、、 给出 ;不同的换手定义必须显式代入而不是混着套同一个公式。
老实的规则:容量随规模缩小。一条在 1000 万 AUM 下 Sharpe 20% 的策略,在 1 亿下可能 Sharpe 10%,在 10 亿下 Sharpe 3%。在你去募钱之前先想好容量。
Regime 切换问题
你的回测拟合的是历史 regime。实盘交易发生在新的 regime。
Regime 由以下特征刻画:
- 波动率水平(VIX 12 还是 VIX 35)
- 相关结构(危机中相关性上升)
- 趋势 vs 均值回复(动量在趋势中 work,在震荡中挂)
- 流动性(信用利差、买卖价差、市场深度)
你没法预测 regime 切换。你可以为它做压力测试。那是下一篇文章的内容。现在就假设接下来 12 个月会在某个重要方面跟过去 12 个月不一样。
如果你的策略是 regime-dependent 的(多数都),实盘表现会按 regime 移动的方向背离回测表现。如果你在低波动率 regime 测的、结果进入高波动率 regime,你的均值回复策略亏。如果你在高波动率 regime 测的、结果进入低波动率 regime,你的动量策略亏。
Shrinkage 规则隐含地覆盖了这一点。实盘 Sharpe = 50% 回测 Sharpe 指的是”跨 regime 的平均”。在对你策略有利的 regime 里,实盘 Sharpe 可能是回测的 80%。在伤害你策略的 regime 里,实盘 Sharpe 可能是 20% 或者负的。
部署 Checklist
在拿真钱部署之前,把这个清单走一遍。如果任何一项的答案是”我不知道”,别部署。
1. 用的 CV 方法。 Walk-forward purged 或更好。如果用的是 k-fold,你的回测 Sharpe 乐观了 30–60%。应用 0.5x shrinkage 因子。
2. PBO 分数。 挑选方法 PBO 低于 25%。高于这个,你那条最佳策略大概率就是运气最差的输家。
3. 样本外测试。 留出 20% 数据。在上面跑最终策略。Sharpe 应该在样本内 Sharpe 的 30% 以内。
4. 现实的滑点。 回测包含半价差、市场冲击和延迟。总滑点估计为了安全按模型估计的 2x。
5. 容量检查。 在目标 AUM 下,每个名字的参与率低于 5%。越低越好。高于 10%,预期严重冲击。
6. Regime 压力测试。 策略在至少 2 个 regime 里测过(比如 2008–2009 和 2017–2019)。两个里面 Sharpe 都是正的。
7. Deflated Sharpe Ratio。 报的 Sharpe 经过试验次数的多重检验校正后跨过 DSR > 0.95。
8. 最大回撤估计。 实盘回撤会是回测回撤的 1.5–2x。投资人能扛得住吗?
9. 流动性压力。 如果买卖价差翻倍会怎样?你用 2x 滑点的回测 Sharpe 还是正的?
10. 失败模式定义清楚。 具体什么信号表明策略已经停止 work?高于平常的回撤?波动率 regime 切换?具体事件?
如果这 10 项你能用真数字答出来,先小量部署。目标 AUM 的 5%。跑 3 个月。把实盘 Sharpe 跟预期实盘 Sharpe 比。如果实盘 Sharpe 在预期范围内,扩到目标 AUM 的 25%。再过 3 个月,扩到 100%。
这种规模的 ramp 不是可选的。每个跳过 ramp 的量化机构都得撤掉一条在回测上看 OK、但全规模下崩盘的策略。
诚实的总结
实盘表现比回测差。差多少取决于你的回测有多诚实、你建模了多少滑点、你部署进的是什么 regime、你的 AUM 相对容量有多大。
用 50% 规则当起点:预期实盘 Sharpe 是回测 Sharpe 的一半。如果你的策略在 half Sharpe 下还能成立,部署。如果不能,换一条策略。
Shrinkage 不是 bug。它是对不知道的东西保持诚实的代价。回测告诉你过去 work 过什么。实盘告诉你未来 work 什么。它们不是同一个数。
相应地计划。
50% 这个数哪里来的
“实盘 Sharpe 是回测 Sharpe 的 50%” 这条规则不是自然规律。它是一小撮研究里的经验平均。
McLean 和 Pontiff(2016)研究了学术文献里的 97 个异常变量。发表后收益平均下降了大约 32%,发表后 5 年对比样本内时期下降了大约 58%。把收益翻译成 Sharpe(假设波动率类似),对这些异常来说就是实盘 Sharpe 大约是样本内 Sharpe 的 42%。
Bailey 和 López de Prado(2014)给的是 Deflated Sharpe Ratio 的分析框架——在多重检验和非正态收益之下评估 Sharpe。它给出的是一个概率值(跟期望最大值比对),不是把 Sharpe 本身按固定 30–50% 的”砍幅”往下打。
López de Prado Advances in Financial Machine Learning 第 13 章(合成数据那一章)相关的是合成数据方法本身,而不是 live/backtest shrinkage 的具体数字。任何 live/backtest shrinkage 的具体数值都应该标注为应用特定的估计,不能当 AFML 的固定规则用。
不同的研究、不同的数字、相似的结论:预期实盘 Sharpe 大致是回测 Sharpe 的一半。具体数字取决于你的策略类别、资产类别和执行质量。
不同 AUM 水平下的容量
容量建模告诉你策略表现怎么随 AUM 缩放。数学是:
其中 是 AUM、 是策略容量。AUM 远小于容量时,实盘 Sharpe 等于回测 Sharpe。AUM 等于容量时,实盘 Sharpe 掉到接近零。这种二次下降是粗略的,但跟经验观察一致。
对一条 10 亿美元容量的策略:
- 1 亿 AUM(容量的 10%):实盘 Sharpe ≈ 回测 Sharpe 的 99%。
- 3 亿 AUM(容量的 30%):实盘 Sharpe ≈ 回测 Sharpe 的 91%。
- 5 亿 AUM(容量的 50%):实盘 Sharpe ≈ 回测 Sharpe 的 75%。
- 7 亿 AUM(容量的 70%):实盘 Sharpe ≈ 回测 Sharpe 的 51%。
- 10 亿 AUM(容量的 100%):实盘 Sharpe ≈ 回测 Sharpe 的 0%。
这就是容量衰减曲线。在 1 亿 work 的策略在 10 亿不一定 work。在 1000 万 work 的策略如果容量低于 1 亿,那在 1 亿肯定不 work。
容量公式假定市场冲击随参与率的平方根缩放(流动性市场的标准假设)。对不太流动的市场或更大的单子,缩放更接近线性,容量衰减更快。
按资产类别分的经验滑点数
不同资产类别的交易成本结构不一样。一些经验先验:
美股大盘股:1–3 bps 半价差,正常参与率下 1–5 bps 市场冲击。每笔来回 trade 总成本:2–8 bps。
美股小盘股:5–15 bps 半价差,5–20 bps 市场冲击。总:10–35 bps。
美股期货(ES, NQ):0.5–1 tick 半价差,1–3 ticks 市场冲击。ES 在 5000 美元,那是每边每手 12.50–37.50 美元。
外汇主要货币对:0.3–1 pip 半价差,正常规模下市场冲击可忽略。总:0.6–2 pips。
Crypto(BTC, ETH 在主要交易所):2–10 bps 半价差,5–20 bps 市场冲击。总:7–30 bps。
Crypto(alt-coins 在小交易所):50–200 bps 半价差。总:100–400 bps。
对一个每月再平衡、年化毛收益 100 bps 的日策略,交易成本关系重大。每笔 5 bps、一年 12 笔 trade,成本是 60 bps(毛收益的 60%)。每笔 20 bps,成本是 240 bps(毛收益的 240%——策略不赚钱)。
你回测的成本估计大概率错 2 倍。如果你的模型说每笔 5 bps,你的实盘成本更接近每笔 10 bps。相应地计划。
真实的失败案例(隐去名字)
一家量化机构在美股上用 5000 万 AUM 跑了一条动量策略。回测 Sharpe:1.8。18 个月后的实盘 Sharpe:0.4。差距:78%。
原因:
- 滑点是回测估计的 2.5 倍(模型假定 4 bps,实盘是 10 bps)。
- 容量比建模的低(策略集中在 ADV 2000 万的中盘名字上;5000 万 AUM 下,每个名字参与率 8%)。
- Regime 切换:2022 年的利率冲击把动量打得鼻青脸肿。
教训:用现实的滑点、保守地建模容量、不要假设未来 regime 跟回测 regime 一样。
另一家机构在美股上用 2 亿 AUM 跑了一条统计套利策略。回测 Sharpe:2.1。12 个月后的实盘 Sharpe:0.9。差距:57%。
原因:
- 选择过拟合(PBO 45%,策略很可能过拟合了)。
- 滑点接近模型估计(策略交易的是流动性好的大盘股)。
- 容量在 2 亿 AUM 下够。
教训:即使有现实的滑点和容量,选择过拟合也能造成 50% 的差距。部署之前跑 PBO。
总结
实盘表现比回测差。差多少取决于你的回测有多诚实、你建模了多少滑点、你部署进的是什么 regime、你的 AUM 相对容量有多大。
参考文献:McLean and Pontiff (2016), “Does Academic Research Destroy Stock Return Predictability?” Journal of Finance, 71(1). López de Prado, Advances in Financial Machine Learning, Ch. 13 (Backtesting on Synthetic Data), ISBN 978-1-119-48208-6. Bailey and López de Prado (2014), “The Deflated Sharpe Ratio: Correcting for Selection Bias, Non-Normal Returns, and Correlation.” Harris, Trading and Exchanges, Ch. 21 (Market Impact and Transaction Costs), ISBN 978-0-19-514470-3.