本节摘要:统计锁全过的策略,最后一关是"成本上扛不扛得住"。交易成本是策略的租金:每笔进出都在付费,费率与滑点每恶化一档,利润空间就薄一层。本节先做成本压力测试——把费率与滑点逐级加码,生成敏感性矩阵,找出策略从盈利滑向亏损的"断崖点";再给一张报告红绿灯清单,把前两节的所有检查项压成绿/黄/红三档;最后回答本章的终点问题:什么样的策略值得进入 paper。判读框架延续《量化投资方法论》第 14 章《风险控制与绩效度量》的口径,本节只讲在 QuantDinger 里怎么执行,并附断崖点扫描脚本与高频判读疑问。
成本压力测试(strategy_evolution 内置能力,官方文档口径)的思路很朴素:把 6.1 配置里的费率与滑点按阶梯抬高,每个组合重跑一次回测,观察指标如何衰减。配置示意:
# stress_breakout.yaml —— 成本压力测试配置(示意结构,字段以官方文档为准) base: backtest_breakout.yaml # 继承 6.1 的基础回测配置 stress: fee_taker_grid: [0.0005, 0.001, 0.0015, 0.002, 0.003] # 费率阶梯(示意值) slippage_bps_grid: [0, 5, 10, 20, 40] # 滑点阶梯(示意值) output: metric: net_profit_ratio # 观察指标:净利润比率(名称以官方文档为准)
跑完得到一张敏感性矩阵(下表数字全部为示意值,仅演示读法):
| 净利润比率(示意) | 滑点 0bps | 滑点 5bps | 滑点 10bps | 滑点 20bps | 滑点 40bps |
|---|---|---|---|---|---|
| 费率 0.05% | 0.31 | 0.24 | 0.17 | 0.04 | -0.18 |
| 费率 0.10% | 0.27 | 0.20 | 0.13 | 0.00 | -0.22 |
| 费率 0.15% | 0.23 | 0.16 | 0.09 | -0.04 | -0.26 |
| 费率 0.20% | 0.19 | 0.12 | 0.05 | -0.08 | -0.30 |
| 费率 0.30% | 0.11 | 0.04 | -0.03 | -0.16 | -0.38 |
三个读法要点:
断崖点不必用眼睛在矩阵里找,几行代码就能扫出来(示意实现,矩阵数字为正文教学编造值):
# cliff_finder.py —— 从敏感性矩阵找断崖点(纯标准库,数字为教学示意) FEES = [0.0005, 0.001, 0.0015, 0.002, 0.003] SLIPPAGE_BPS = [0, 5, 10, 20, 40] MATRIX = [ [0.31, 0.24, 0.17, 0.04, -0.18], [0.27, 0.20, 0.13, 0.00, -0.22], [0.23, 0.16, 0.09, -0.04, -0.26], [0.19, 0.12, 0.05, -0.08, -0.30], [0.11, 0.04, -0.03, -0.16, -0.38], ] def first_negative(row): """给定费率行,返回首个由正转负的滑点档;全非负返回 None""" for bps, value in zip(SLIPPAGE_BPS, row): if value < 0: return bps return None if __name__ == "__main__": for fee, row in zip(FEES, MATRIX): print(f"费率 {fee}: 首个转负滑点档 {first_negative(row)} bps(示意)")
扫出来的结果本身就是一条诊断:如果各费率行的断崖滑点档彼此接近,说明策略对两类成本的作用方式均匀;如果某一行提前塌陷,先查那一档费率下的成交假设是不是与别的行不一致——不单调的矩阵常常是配置错误,不是市场真相。
把 6.1 与 6.2 的检查项压成三档。逐项判,任何一项红灯即否决,黄灯要求书面说明后再继续:
| 检查项 | 绿灯 | 黄灯 | 红灯 |
|---|---|---|---|
| 样本量 | 交易笔数充足且跨越多种行情 | 笔数偏少或区间单一 | 极少交易或单边区间 |
| 成交假设 | 滑点保守、费率为真实档位 | 滑点偏乐观但有解释 | 零滑点零费率 |
| 未来函数 | 钩子复查无越界访问 | 存疑字段待验证 | 确认使用了未来数据 |
| walk-forward | 测试段指标保持稳定 | 明显衰减但未归零 | 断崖或为负 |
| PBO | 低于起步门槛 | 门槛附近 | 明显偏高 |
| Deflated Sharpe | 校正后仍显著 | 略低于门槛 | 不显著或未如实填 trials |
| Monte Carlo | 坏分位回撤可承受 | 偏深但有对冲方案 | 深到无法执行 |
| 成本断崖 | 真实成本远离断崖点 | 接近断崖点 | 真实成本已越过断崖点 |
(门槛数值按 6.2 节经验建议执行,团队可书面约定自己的标准,关键是每次判读用同一把尺子。)
这份清单的价值不在单次判读,而在留下判读记录:策略进 paper 时把清单快照一并归档。三个月后你回看"当时为什么放行",靠的是清单而不是记忆——这本身就是《量化投资方法论》第 15 章《批判性思维与研究纪律》强调的研究纪律的落地形式。
全绿之后,再补四个资格条件:
不满足时的正确动作:回 6.2 减参数重来,或修改策略假设,或直接放弃。唯一错误的动作是"先上 paper 再说"——paper 阶段的观察成本很高(以周计),别把它花在统计上已被否决的策略上。
建议为每个通过的策略留一份一页纸记录(示意模板):
# decision_record_breakout.txt —— 进入 paper 前的判读记录(示意模板) 策略: breakout_v2 判读日期: 2026-10-08 四要素: 1h/BTC-USDT/2023-2025/初始资金10000(示意) 四件套: WF测试段夏普保持0.7倍 | PBO 0.14 | DSR 0.96 | MC5%回撤 -18%(示意值) 成本断崖: 滑点20bps(示意) | 真实环境估计: 8bps(示意) | 余量: 充足 红绿灯: 全绿 | 黄灯说明: 无 失效标准: 滚动60日夏普连续两窗为负即停(示意做法) 结论: 允许进入第07章 signal-only 观察
这份记录与配置文件、报告一起进版本管理。它同时是第 07 章 paper 观察的"原假设"——paper 阶段要验证的,正是这里写下的每一条。
| 疑问 | 处置 |
|---|---|
| 断崖点就在真实成本附近 | 换费率档位更优的执行环境或降低交易频率,而不是调参硬救 |
| 矩阵衰减不单调 | 先查数据与撮合假设配置,再谈读数;不单调多为配置错误 |
| 黄灯可以带病进 paper 吗 | 单个黄灯需书面说明与复检计划;两个黄灯按红灯对待(示意纪律) |
| paper 要观察多久 | 以周计起步,至少覆盖判读记录里写明的行情情境(示意做法) |
| 判读记录写完就完了吗 | 它是 paper 阶段的原假设,观察期内每条都要被验证或证伪 |
至此,策略在实验室里能过的关都过了。但实验室没有真正的"现在":没有实时到来的行情、没有决策发生的即时约束、没有网络与撮合的真实延迟。下一章进入模拟交易——先用 signal-only 虚拟账户只记信号不发真单,看策略在实时世界里的第一现场表现。