定位
vnpy.alpha.dataset.ts_function.py → ts_decay_linear(decay_func + polars.Series.rolling_map),根源在 polars 对整数 dtype 序列的 rolling_map 算术。

对同一列 {0,1} 序列(唯一 1 在 idx14,30 行),分别以 Int64 / Float64 跑 vnpy 的 decay:

位置 Int 列 Float 列 数学正确值
idx14 0 0.0083 0.0083
idx16 0 0.025 0.025
idx28 0 0.125 0.125
Int 列下 rolling_map(decay_func,15) 恒为 0(正确应为非零加权均值),Float 列则与正确值逐位一致。这就是 vnpy/polars 的 bug。

为什么是这个 bug
ts_decay_linear.decay_func 里 (s * weights).sum() / denominator 用的是 weights = pl.Series(range(window,0,-1))(整数)。当上游列是整型时,整型×整型的算术在 rolling_map 窗口内返回 0,而不是加权均值。

触发条件与受影响因子
上游 quesval2(...,1,0) / quesval(...,-1,1) 的 then/otherwise 是 int 字面量 1/0,输出列 dtype=整型,再喂给 ts_* 滚动算子即触发。受影响的因子:alpha92、alpha75、alpha74、alpha81(corr 掉到 0.48~0.85 那批正是它们)。

与之不同,ts_rank/ts_mean/ts_std 把 polars 序列交给 scipy/numpy(不乘整数权重),所以不受此 bug 影响。