Alpha-Online
踩坑复盘

周频换手把摩擦放大数倍

回测按 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)节流,非调仓日持仓不动。配套补齐真实落库与真实滑点计算,让实盘的成本结构与回测对齐。

教训:「实盘跑输回测」应首先排查交易频率与成本口径是否对齐,而非直接归因于因子失效。实践中多数「策略失灵」经排查后均为工程层面的参数不一致问题。

关联

On this page