量化研究基础设施与回测审计
quantlab:期货量化研究框架
在 Nautilus Trader 上,按 López de Prado《金融机器学习》的方法自建期货研究与回测框架。目标不是「找到赚钱的策略」,而是让每个结论都经得起检验。
- 16 年CME 分钟数据:2,211 个合约、1.64 亿根 bar
- 2,135个自动化测试,库代码约 2.9 万行
- 81.75 GB → 0.10 GB唯一性权重计算的内存峰值
- 0研究侧与 Nautilus 回测引擎逐 bar 对拍的不一致数(受控测试数据)
- CME 分钟数据
- 合约清洗与连续化
- 信息驱动的 bar
- 特征与事件采样
- 三重障碍标签
- 交叉验证与回测
- 按预注册判据下结论
背景
早年我用参数优化做 CTA 策略,结果在样本外站不住。于是转向《金融机器学习》的验证方法,自建了这套框架:数据、标签、交叉验证、回测,每一层都有测试守着。
我做了什么
- 导入 CME 16 年的分钟数据,做期货连续合约(ETF trick)、信息驱动的 bar、特征和事件采样。
- 实现 purged K-fold、组合式交叉验证、walk-forward、压力测试,以及三重障碍标签和 meta-labeling。
- 研究流程上做到预注册判据、来源一致性检查、多重检验校正和独立审查。
难点和解法
- 长历史数据的三个坑:一位年份的合约代码每十年复用;合约到期当月,代码就被回收给新合约;同一个
instrument_id跨年代被分给别的产品(白银的数据会被写进标普期货)。全部改成按「代码 + 有效时间区间」识别,写盘前由守卫检查。 - 连续合约逐位一致:16 个品种 1,386 次换月,离线构建和在线逐 bar 驱动的输出逐位相同。
- 批量与在线一致:113 个特征的批量计算和在线计算逐位一致;研究侧回测和 Nautilus 回测引擎在受控测试数据上逐 bar 对拍,0 个不一致。
- 内存:把样本唯一性权重从稠密矩阵改为差分数组加前缀和,单进程内存从 81.75 GB 降到 0.10 GB。
- 上游 bug:发现 Nautilus Trader 1.222 的数据目录查询里,按 bar 类型过滤的参数被静默忽略。
如实的结论
在 12 个 CME 期货、16 年数据上,按预注册判据检验了 11 类因子共 77 个配置和 6 种趋势过滤器,相对被动做多基准都没有显示稳健、显著的超额收益,所以我没有把任何策略投入实盘。这正是回测审计的价值:在投入真钱之前,把过拟合和数据泄漏找出来。
可以为你做的
- 期货或股票的数据管线:导入、清洗、连续合约、数据有效性检查
- 回测审计:未来信息、样本重叠、成本口径、多重检验
- Nautilus Trader 的回测与策略搭建
技术栈
Python · pandas · NumPy · Numba · scikit-learn · PyArrow / Parquet · Nautilus Trader · Databento · pytest