6.3 结果解读与成本压力测试


6.3 结果解读与成本压力测试

本节摘要:统计锁全过的策略,最后一关是"成本上扛不扛得住"。交易成本是策略的租金:每笔进出都在付费,费率与滑点每恶化一档,利润空间就薄一层。本节先做成本压力测试——把费率与滑点逐级加码,生成敏感性矩阵,找出策略从盈利滑向亏损的"断崖点";再给一张报告红绿灯清单,把前两节的所有检查项压成绿/黄/红三档;最后回答本章的终点问题:什么样的策略值得进入 paper。判读框架延续《量化投资方法论》第 14 章《风险控制与绩效度量》的口径,本节只讲在 QuantDinger 里怎么执行,并附断崖点扫描脚本与高频判读疑问。

学习目标

  • 生成并读懂费率×滑点敏感性矩阵,找出策略的断崖点。
  • 用红绿灯清单对一份回测研究做整体判读。
  • 明确"值得进入 paper"的资格条件与不满足时的正确动作。

一、成本压力测试:费率与滑点敏感性

成本压力测试(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

三个读法要点:

  • 找断崖点。上表中指标在滑点 20bps 附近由正转负——这就是断崖点。断崖点离你真实交易环境的估计成本越远,策略越稳;如果真实成本已在断崖点附近,这个策略本质上是在给交易所打工。
  • 看衰减坡度。从左上到右下衰减平缓的策略对成本不敏感(通常信号少、持有长);衰减陡峭的策略盈利高度依赖理想化成交,paper 阶段大概率露出原形。
  • 对齐真实环境。把你在第 08 章将要接入的交易所实际费率档位、标的真实点差,标到矩阵上,检查落点是否仍在安全区内。

断崖点不必用眼睛在矩阵里找,几行代码就能扫出来(示意实现,矩阵数字为正文教学编造值):

# 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 章《批判性思维与研究纪律》强调的研究纪律的落地形式。

三、什么样的策略值得进入 paper

全绿之后,再补四个资格条件:

  • 一致性:策略逻辑能用三句话说清,且你知道它"应该在什么行情下赚钱、什么行情下亏钱"。说不清赚钱来源的策略,回测再好也只是未解释的相关性。
  • 可执行性:信号频率、下单数量都在目标交易所的现实约束内(最小下单量、精度档位,第 08 章会再核一遍)。
  • 可观测性:报告里能定位每笔交易的信号来源,出了问题能追因(为第 11 章可观测层预留钩子)。
  • 可放弃性:事先写下"什么情况说明策略失效"(例如滚动夏普连续为负的窗口数,示意做法),写不出来的失效标准等于没有退出机制。

不满足时的正确动作:回 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 阶段的原假设,观察期内每条都要被验证或证伪

本节要点回顾

  • 成本压力测试找断崖点:断崖点离真实成本的距离,就是策略的成本安全边际。
  • 红绿灯清单把全部检查压成三档,判读记录必须归档——纪律的可执行形式是书面记录。
  • 进入 paper 需要四个资格条件:一致性、可执行性、可观测性、可放弃性;"先上再说"不是选项。
  • 判读记录是 paper 阶段的原假设,下一段旅程按它验证。
  • 高频疑问:断崖贴脸先换环境、不单调先查配置、黄灯须书面说明。

至此,策略在实验室里能过的关都过了。但实验室没有真正的"现在":没有实时到来的行情、没有决策发生的即时约束、没有网络与撮合的真实延迟。下一章进入模拟交易——先用 signal-only 虚拟账户只记信号不发真单,看策略在实时世界里的第一现场表现。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U