这是什么
"回测年化 40%,敢上实盘吗?"——本技能用统计方法回答这个问题。对策略回测结果做显著性检验与多重检验校正,量化"这个回测有多大程度是过拟合"。
解决什么问题
- 回测指标漂亮但样本外失效,是量化最典型的隐性风险
- 参数调优试了 500 组,挑最好的一组报告——多重检验偏差让夏普虚高
- 团队缺少统一的"回测可信度"判定标准
核心能力(检验方法全家桶)
| 方法 | 回答的问题 |
|---|---|
| PSR / DSR(紧缩夏普) | 扣除运气成分后,夏普还显著吗? |
| PBO(CSCV 交叉验证) | 过拟合概率有多大? |
| Haircut Sharpe | 夏普应该"打折"到多少? |
| MinBTL 最小回测长度 | 这么高的夏普至少需要多长回测期才可信? |
| MinTRL 最小业绩记录长度 | 实盘多久才能验证该策略? |
| 样本内外衰减 | 样本外掉了多少? |
| Bootstrap 置信区间 | 指标的置信区间多宽? |
输出:风险等级判定 + 可执行治理清单(walk-forward 验证、参数敏感性、样本外保留等)。
快速开始(示例指令)
- "这是我策略的回测结果和交易明细,帮我检验一下过拟合风险"
- "我试了200组参数,最好的夏普2.1,这个结果可信吗?"
- "回测3年夏普1.8,需要多长实盘记录才能验证?"
常见问题
Q: 需要提供什么输入?
回测的收益序列(或交易明细)与基本参数(回测区间、尝试的参数组数等);输入不全时会提示最小可用数据集。
Q: 只有一个夏普比率数字能用吗?
可以给出 MinBTL/DSR 的粗判,但建议提供收益序列以获得完整诊断。
Q: 输出什么?
风险等级(低/中/高)+ 各检验统计量 + 治理清单,可直接用于投决会材料。
Q: 与同系列技能的关系?
《Vibe Trading 自然语言回测》产出回测 → 本技能检验可信度 → 《因子正交化》处理因子冗余,构成完整量化研究链。
更新日志
- v1.1.0:补齐详情页与 FAQ;增强输入数据不足时的降级诊断
- v1.0.1:Initial release
析衡量化 · 回测过拟合诊断(xiheng-backtest-overfit)
对「策略回测是否可信」给出可量化、可复核的结论。核心逻辑:单条漂亮净值曲线的信息量极低——只有在扣除了"试验次数"与"选择偏差"之后仍然显著的夏普,才值得进入实盘评估。
适用场景
| 编号 | 场景 | 关键问题 | 使用命令 |
|---|---|---|---|
| S1 | 单策略显著性检验 | 这段回测的夏普是否显著为正? | psr / mintrl |
| S2 | 参数网格调优后评估 | 试了 200 组参数选了最好的一组,还显著吗? | dsr |
| S3 | 策略池 / 多品种比较 | 从 N 个配置里挑出来的冠军,样本外还灵吗? | pbo |
| S4 | 批量因子/因子挖掘 | 挖了 50 个因子,哪些是真发现? | haircut |
| S5 | 综合体检 | 一整套指标 + 风险等级 + 治理建议 | report |
核心指标与判读阈值
| 指标 | 含义 | 阈值(工程经验) |
|---|---|---|
| PSR | 夏普大于基准的概率(校正偏度/峰度) | ≥0.95 通过;<0.90 存疑 |
| DSR | 扣除试验次数后的 PSR | ≥0.95 通过 |
| PBO | 样本内最优配置在样本外跌出中位数的概率 | <0.30 低;0.30–0.50 中;>0.50 高 |
| Haircut | 多重检验校正后夏普被"砍掉"的比例 | <30% 可接受 |
| MinTRL | 达到显著所需的最小样本长度 | 实际样本 < MinTRL 则样本不足 |
| MinBTL | N 次试验下,伪装出目标夏普所需的最短回测年限 | 实际回测年数 < MinBTL 则疑似数据窥探 |
| OOS 衰减 | 1 − 样本外夏普 / 样本内夏普 | 衰减 >50% 高风险 |
工作流(四步)
- 确认输入口径 — 需要逐期收益率序列(日频/周频/月频均可),不要只给累计净值;多配置场景需要
T×N收益矩阵(行=时间,列=配置)。 - 单策略显著性 — 先跑
psr/mintrl,确认基础显著性成立。 - 扣除选择偏差 — 有试验次数就上
dsr(需试验夏普的方差或试验矩阵),有配置池就上pbo,有多假设就上haircut。 - 汇总定级 — 用
report输出风险等级与治理建议;结果以 JSON 落盘便于复核留痕。
命令速用
# S1 单策略显著性(PSR + 年化夏普)
python scripts/backtest_overfit.py psr --input assets/sample_single_strategy.csv --column strategy_return --periods-per-year 252
# S2 参数调优后的紧缩夏普(试验矩阵自动提取试验次数与方差)
python scripts/backtest_overfit.py dsr --input assets/sample_single_strategy.csv --column strategy_return --trials assets/sample_trials_matrix.csv
# S3 冠军策略的样本外存活率(PBO,CSCV)
python scripts/backtest_overfit.py pbo --input assets/sample_trials_matrix.csv --n-blocks 10
# S4 多因子/多策略的多重检验校正
python scripts/backtest_overfit.py haircut --input assets/sample_trials_matrix.csv --alpha 0.05 --periods-per-year 252
# S5 综合体检报告
python scripts/backtest_overfit.py report \
--input assets/sample_single_strategy.csv --column strategy_return \
--trials assets/sample_trials_matrix.csv --periods-per-year 252 \
--json out/overfit_report.json
算法要点
- PSR / DSR — Bailey & López de Prado(2012/2014)。DSR 用
E[max SR_N] ≈ √V[SR]·[(1−γ)Z⁻¹(1−1/N) + γZ⁻¹(1−1/(N·e))]作为基准,γ 为欧拉常数。 - PBO — Bailey 等(2014)CSCV:把样本切成 S 个等长块,枚举
C(S, S/2)种"半样本作 IS / 其余作 OOS"的组合,统计 IS 最优配置在 OOS 的相对排名落入后半的比例。 - Haircut — Harvey & Liu(2015):用校正偏度/峰度后的 t 统计量做 Bonferroni / Holm / BHY 校正,反解"校正后仍需达到的夏普",比率即为被砍掉的部分。
- MinTRL / MinBTL — 样本长度是否足够支撑当前夏普;以及给定试验次数下,"纯运气"能造出的夏普上限。
与同系列其他技能的关系
> 本技能属于 析衡量化 系列,统一入口见 xiheng-quant-toolkit:
> series.py list 看系列全景,series.py route <场景> 定位技能,series.py chain <场景> 看整条调用链。
| 方向 | 技能 | 衔接方式 |
|---|---|---|
| 上游 | xiheng-vibe-trading 策略回测 |
回测产出的收益序列与参数组合族,是过拟合诊断的直接输入 |
| 上游 | xiheng-factor-orthogonalize 因子正交化 |
正交化过程本身引入的选择偏差,可交由本技能检验 |
| 下游 | — | 系列末端环节,产出直接交付使用 |
> 系列地图维护在 xiheng-quant-toolkit/assets/series.json;本技能在该地图中的条目(slug/stage/role/feeds/triggers)应保持同步。
目录结构
xiheng-backtest-overfit/
├── SKILL.md
├── scripts/
│ ├── backtest_overfit.py # 主程序(psr / mintrl / dsr / pbo / haircut / report)
│ └── make_sample_data.py # 示例数据生成器(固定种子,可复现)
├── references/
│ ├── metrics_guide.md # 指标公式、阈值与判读方法
│ └── diagnosis_workflow.md # 诊断流程、决策树、红旗清单与治理措施
└── assets/
├── sample_single_strategy.csv # 单策略逐期收益(756 期,含基准列)
├── sample_trials_matrix.csv # 120 组配置试验矩阵(504 期)
└── sample_report_output.json # report 命令的完整输出示例(可作为字段参考)
注意事项
- 必须用逐期收益率,累计净值无法还原波动率与高阶矩;样本频率需与实际调仓频率一致。
- 试验次数 N 常被严重低估——同一想法改过数据区间、universe、阈值、止损、样本过滤,每次都算一次试验;建议按"代码版本 + 参数组合数"保守放大 2–3 倍。
- PBO 要求配置之间同质可比(同一标的池、同一时间轴、同类策略),拿股票策略与商品策略混在一起算 PBO 没有意义。
- PBO 与 DSR 侧重点不同:PBO 反映"样本内外排名的继承性",DSR 反映"扣掉多次试验后的绝对显著性"。两者可以结论不一致——PBO 低但 DSR 不通过(配置间存在真实差异,但绝对水平仍不足以抵消试验次数),此时应以 DSR 结论为准并补充样本外验证。
- 不构成投资建议:本 skill 输出的是统计可信度判定,不预测策略未来收益。
- 样本长度不足以支撑 S≥6 分块时,PBO 结果不稳定,应改用较少的块数并在报告中标注。