如何用 Rademacher Anti-Serum 做回测多重检验校正
如何用 Rademacher Anti-Serum 做回测多重检验校正【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading你回测了一组候选策略——比如对 lookback、holding period、持仓数三个轴做网格搜索——选出 Sharpe 最高的那个但选出的结果被试过多少个这件事污染了。Rademacher Anti-SerumRAS就是针对这个场景的校正它不给单一冠军打折而是对整个候选类收费输出的是一个有限样本下的下界而不是概率。在 machine-learning-for-trading 仓库里这套流程由ml4t-diagnostic库实现完整演示在 13_ras_protocol 中属于第 16 章 §16.7strategy-level overfitting control。本文按跑通演示 → 读懂输出 → 套到自己的候选集三步展开环境是仓库文档支持的 Dockerml4t镜像或本地uv环境本地路径要求 Python 3.14细节见 docs/installation.md。运行环境准备RAS 演示不需要下载任何数据集——notebook 里的收益路径全部由代码内的合成随机数生成只依赖ml4t-diagnostic、NumPy、SciPy、Plotly。所以环境就绪后可以直接跑不用先跑数据下载脚本。两条路径任选其一命令都从仓库根目录执行# Docker 路径文档推荐 git clone https://github.com/stefan-jansen/machine-learning-for-trading.git cd machine-learning-for-trading cp .env.example .env docker compose pull ml4t # 本地 uv 路径 uv sync验证安装是否就绪用文档给出的 PASS/FAIL 门槛# Docker docker compose run --rm ml4t python scripts/verify_installation.py # 本地 uv uv run python scripts/verify_installation.py每行组件输出PASS/FAIL全部 PASS 即可继续。运行 13_ras_protocol 并读取输出# Docker 路径 docker compose run --rm ml4t python 16_strategy_simulation/13_ras_protocol.py # 本地 uv 路径无显示环境时加渲染变量避免图形窗口阻塞 MPLBACKENDAgg PLOTLY_RENDERERjson uv run python 16_strategy_simulation/13_ras_protocol.py也可以用 Papermill 测试模式快速跑见 docs/running-notebooks.mdtests/overrides.yaml 给这个 notebook 配置的超时是 180 秒uv run pytest tests/test_chapter_notebooks.py -v -k 13_ras_protocolnotebook 的参数单元使用生产默认值N_SIMULATIONS 5000Monte Carlo 随机符号向数的抽取次数只控制复杂度估计的精度、CONFIDENCE 0.05δ即界允许失效的概率——文档说明 δ 越小保证越强、收费越贵、SEED 42。复杂度对候选间依赖的敏感度演示第 1 节固定 100 个候选、252 个周期只改变候选之间的相关性结构独立 / 相关 / 完全相同文档示例输出Candidates in each class: 100, over 252 periods Massart bound for this count and scale: 0.1912 Independent candidates: 0.1575 (82%) Correlated candidates: 0.0166 (9%) Identical candidates: 0.0008 (0%)这是 RAS 与纯计数校正如 DSR的核心区别同样 100 个候选共享结构越强经验 Rademacher 复杂度 R̂ 越低收费越轻。R̂ 的定义是候选类拟合随机符号向量的能力$$\hat{R} \mathbb{E}_\epsilon\left[\max_n \frac{\epsilon^T x^n}{T}\right]$$其中 ε 是等概率 ±1 的独立随机符号向量。Massart 界max_norm * sqrt(2 * log(N)) / T只取决于候选数与列范数是每一类的共同参照线。500 候选扫描上的收费幅度演示第 2 节对 500 个相关候选路径504 天做波动率标准化后应用界文档示例输出Candidates: 500 over 504 days Largest observed annualized Sharpe: 1.281 Rademacher complexity of this candidate class: 0.0631 Candidates whose Sharpe is positive: As a point estimate: 311/500 (62%) As a lower bound: 0/500 (0%) Largest observed candidate: Point estimate: 1.281 Lower bound: -9.632 Charged: 10.913判读方式下界分布整体左移于点估计分布移动量就是复杂度 有限样本不确定性两项收费。一个被选中的 Sharpe 要存活必须让它的下界过决策门槛而不是点估计。RAS 与 DSR 在同一组输入上的对照演示第 3 节notebook 内置了一个本地 DSR 实现并与库函数deflated_sharpe_ratio_from_statistics做了对照文档示例本地实现 0.2929ml4t-diagnostic0.1022——两者在方差项的取值点上不同行为一致但数字不必逐位相同。对第 2 节同一批候选的最优者文档示例输出Best observed Sharpe: 1.281 DSR Analysis: Expected max (E[max]): 1.041 DSR probability: 0.632 p-value: 0.3677 RAS Analysis: Rademacher complexity: 0.0631 Adjusted SR: -9.632 Adjustment magnitude: 10.913 Positive 95% lower bound: No两者回答不同问题DSR 输出相对选择基准的尾部概率RAS 输出有限样本下界。notebook 的对照表归纳为维度DSRRAS相关性处理原始试验数需另做有效试验数调整直接使用候选表现矩阵假设渐近 Sharpe 采样近似有限样本 sub-Gaussian 下界输出高于选择基准的尾部概率下界计算试验统计量已知后闭式解Monte Carlo 复杂度估计把三步调用套到自己的候选集上notebook 结尾给出了可直接复用的调用顺序三个函数都来自ml4t.diagnostic.evaluation.statsfrom ml4t.diagnostic.evaluation.stats import ( rademacher_complexity, ras_sharpe_adjustment, ras_ic_adjustment, ) # Step 1: 按列做波动率标准化不去均值再算 native 频率下的估计 standardized candidate_returns / candidate_returns.std(axis0, ddof1) observed_native standardized.mean(axis0) R_hat rademacher_complexity(standardized, n_simulations5000) # Step 2: 应用 RAS 调整 adjusted_native ras_sharpe_adjustment( observed_native, complexityR_hat, n_samplesn_periods, n_strategiesn_candidates, deltaconfidence, ) # Step 3: 只有在 native 单位下应用完界之后才做年化 adjusted_sharpe adjusted_native * np.sqrt(periods_per_year) positive_lower_bound adjusted_sharpe 0需要替换的变量candidate_returns是 T×N 矩阵T 个周期 × N 个候选策略的每期收益n_periods、n_candidates即其形状confidence即 δ演示用 0.05periods_per_year按数据频率取日频 252小时频 24×365。完整 notebook 中rademacher_complexity的实际调用形如rademacher_complexity(standardized_returns, N_SIMULATIONS, SEED)比上面多传一个 SEED 用于复现。两个必须守住的约束notebook 专门用两节演示年化只能放在最后。界里每一项都是每期波动率标准化单位先在 native 频率上算界、再缩放。演示第 6 节用小时频数据说明方向反了的后果小时频的年化因子是sqrt(24 × 365) ≈ 93.6而不是sqrt(252)先年化再减每期复杂度会按这个频率约六分之一的收费。试验数是各轴乘积。演示第 5 节把 7 个 lookback × 5 个 holding × 4 个持仓数展开成 140 个候选文档示例最大观测 Sharpe 0.520下界 -9.315过 0.5 门槛的候选从 1 个变 0 个并给出结论网格搜索的试验数要包括扫过一次又丢弃的轴喂给校正的若是你记得跑过的策略数那不算校正。如果你的对象是信号 IC 而不是收益路径用同一模式换成ras_ic_adjustment演示第 4 节传入观测 IC 均值向量、rademacher_complexity(ic_matrix, N_SIMULATIONS, SEED)算出的复杂度、n_samples、delta和一个kappa参数演示用 0.1。文档示例50 个信号中 5 个带真实值原始均值过 0.01 门槛的为 5/50下界过门槛的为 0/50——真实信号 5 个原始全过、加界后 0 过。notebook 强调这只是有限样本搜索不确定性的诊断不声称这些合成信号可盈利交易。限制与适用边界演示数据是合成 IID 路径用于隔离公式。notebook 的 Limitations 明确真实交易收益常有序列相关与机制变化需要 dependence-aware 的重采样或集中不等式设计演示也省略了交易成本和组合构建。合成数据 ≠ 结论可外推。演示里下界全部为负是 504 天数据支撑 500 个候选时的正常表现notebook 的原话是它不是说策略差而是说证据不足以排除它差。选 RAS 还是 DSRnotebook 给出的对照表独立低相关试验——两者对比并各自写明假设相关参数扫描——用 RAS或先估计有效试验数再用 DSR快速诊断——用 DSR 但注明原始试验数的局限要发布的科研结果——同时报告诊断量、输入与假设。按 16_strategy_simulation/README.md 的章节顺序本节16.7之后的下一步是 14_cost_sensitivity检验被选出的策略在执行成本假设变化后是否仍然成立。【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考