证明多时间框架回测中没有look-ahead:扰动未来,证明过去看不到它
多时间框架回测会通过一根仍在形成中、尚不存在最终收盘价的高时间框架K线泄露未来信息。仅靠代码审查无法建立信心——必须实际测试。我们精确复现了实盘机器人的closed-bar规则,然后用一个“未来偏移探针”证明没有信息泄露:扰动每一根未来K线,并断言每一个过去的信号和交易都逐位不变。25/25项一致性检查全部通过,而且这个探针确实有效(并非一个永远不会失败的空测试)。
Nothing found. Try a different query.
多时间框架回测会通过一根仍在形成中、尚不存在最终收盘价的高时间框架K线泄露未来信息。仅靠代码审查无法建立信心——必须实际测试。我们精确复现了实盘机器人的closed-bar规则,然后用一个“未来偏移探针”证明没有信息泄露:扰动每一根未来K线,并断言每一个过去的信号和交易都逐位不变。25/25项一致性检查全部通过,而且这个探针确实有效(并非一个永远不会失败的空测试)。
GPU 相对 CPU 的领先幅度随批量大小增长——在我们的多时间框架指标预计算上,从每次调用一个组合时的 54.5x 一路升到 61 个组 合时的 359.6x——因为一次小规模扫描无法摊薄内核启动和传输开销。我们把一个 167x 的头条数字拆解为一个同样惠及 CPU 的 27x 算法收益,乘以一个 6.2x 的硬件收益,指出 GPU 相对最佳 CPU 的真实领先在单时间框架下只有 3.2x、在多时间框架下只有 6.2x,并给出一份决策指南:一次扫描要宽到什么程度,才值得为 GPU 掏钱。
Apple 的 Metal GPU 没有 float64。把一个向量化回测天真地移植过去,那个诱人的前缀和 WMA 就会在 fp32 下溢出——最大相对误差 211 倍——但它依然能跑 完全程,还返回看起来说得过去的数字。修复的办法不是提高精度,而是换一种公式:直接的窗口卷积,fp32 下精度可达 8×10⁻⁷,比单线程 numba 快 55.9 倍。这篇文章讲清楚陷阱本身、背后的算术,以及如何证明自己没有掉进去。
下钻式/多保真度搜索(ASHA、逐次减半、Hyperband)以低成本方式筛选成千上万个配置, 只将存活者提升到昂贵的完整评估阶段。这是一种真实的加速——但如果低保真度的排序与高保真度的排序不一致,它就会悄无声息地崩溃。我们测量了折数-排序相关性:在只用一折时,Spearman ρ 可能低至 0.03(排序几乎是随机的),随着折数累积,逐步升高到 0.43、0.67、0.78、0.91。修复方法是设置一道强制性关卡——先测量 ρ(廉价, 完整),并自动将最低保真度提升到 ρ ≥ 0.5 的第一个档位。
当单次回测很便宜时,简单的打乱 Sobol 序列在原始吞吐量上碾压所有"智能"采样器——TPE、CMA-ES、ASHA 要缴纳 Python ask/tell 税,导致速度下降 20 倍,在相同墙 钟时间内评估的点数远远更少,因而落败。让每次评估变得昂贵(多时间框架 + walk-forward 折)之后,交叉点就翻转了。我们测量了这两种情形,以及为什么折叠排名保真度(ρ@1 从 0.03 升至 0.43)是剪枝能否奏效的前提条件。
并非所有参数的搜索成本都相同。一个策略的参数会分裂为一条昂贵轴(指标——需要在整个序列上重新计算)和一条廉价轴(决策阈值——对预计算信号做一次 O(n) 遍历)。由于指标对阈值不变,你只需计算一次,就能以约 5,600 cfg/s 的速度扫描数千种阈值配置——比每种配置都重新计算大约便宜 1,600 倍。这是对维度灾难的一次重新定价。
我们在同一个参数扫描任务上对八个回测引擎进行了基准测试——15万根K线、80个HMA交叉组合、交易笔数严格锁定在2707笔。两个最受欢迎的事件驱动框架的速度居然比手 写的 pandas 循环还慢,而一个向量化/编译型引擎完成同样的工作快了约13000倍。这是一篇关于主流库从未被设计用来摊销的逐K线开销的研究。