踩坑复盘
周频换手把摩擦放大数倍
回测按 5 日调仓,实盘却每日全额换手。模拟盘亏损的根因不是因子失效,而是调仓频率不一致。#40 事故档案。
层级 ADS · 交易执行 严重度 致命 关联 #40 · commit 05eab94 · run_daily.py
该问题直接推动了系统级的业绩复盘与整改,也是「实盘跑输回测」最典型的成因之一。
现象
回测中 Sharpe 表现良好的策略,部署模拟盘后持续亏损。初步判断倾向于因子失效或市场结构变化,但亏损特征与 Alpha 衰减不符,更符合系统性成本侵蚀的表现。
定位
对比回测与实盘的调仓行为,发现关键差异:
- 回测:
rebalance_freq = 5,每 5 个交易日才调一次仓; - 实盘:每天都按最新目标持仓全额换手。
Alpha101 多是短周期信号,每天的截面排序都在小幅抖动。每日全额跟随这种抖动,意味着把换手率放大了数倍,而换手成本 = turnover × commission_rate × 2(双边)——摩擦成本被成倍放大,足以吃掉全部 Alpha。
根因
再次违反 One Codebase 原则:实盘未复用回测的调仓节奏。回测按周调仓、实盘按日调仓,实质上运行的是一个回测从未验证过的、换手率数倍于预期的策略。亏损来源是交易频率不一致,而非因子失效。
修复
在 run_daily.py 引入 should_rebalance:实盘严格按 rebalance_freq(默认 5)节流,非调仓日持仓不动。配套补齐真实落库与真实滑点计算,让实盘的成本结构与回测对齐。
教训:「实盘跑输回测」应首先排查交易频率与成本口径是否对齐,而非直接归因于因子失效。实践中多数「策略失灵」经排查后均为工程层面的参数不一致问题。
关联
- 手册:5. 交易执行层 ADS · 4. 截面回测引擎
- 根问题:回测实盘三路分叉
- 口径:指标口径与免责声明