踩坑复盘
随机扰动与不可复现
为防 rank() / correlation() 分母为零而引入的极小随机扰动,让因子结果每次都不一样。#33 事故档案。
层级 DWS · 因子计算 严重度 中 关联 #33 · commit 2ebb979 · operators.py
现象
同一份数据、同一段代码,跑两次因子计算,结果对不上。回测无法复现,调参实验失去意义——你永远不知道指标变化是改动带来的,还是随机噪声带来的。
定位
为了避免 rank() / correlation() 在分母为零或全相等时崩溃,早期代码引入了一点极小的随机扰动来「打破平局」。扰动没有固定随机种子,于是每次运行的微小差异,经过截面排序被放大成了不同的持仓。
根因
为保证数值稳定而引入随机性,代价是牺牲可复现性。可复现性是量化研究的基本要求——不满足此条件,任何 A/B 对比实验均无法获得有效结论。
修复
用固定随机种子收口,保证扰动可复现;同时改进 NaN 处理策略,从源头减少对扰动的依赖。此后「同输入 → 同输出」重新成立。
教训:研究系统中,确定性优先于便利性。任何引入随机性的环节都必须支持固定种子,否则无法区分策略改进与随机噪声。
关联
- 手册:3. 因子与信号 DWS
- 同期修复:adv 的语义背叛