关于「因子分数波动」的说明
由hxgre创建,最终由hxgre 被浏览 8 用户
一、这个分数是怎么算出来的
因子评估里的 ModelScore 来自一个 Elastic Net 多因子滚动回归,而不是单因子独立打分。核心流程如下:
-
回归目标:每只股票的 T+1 收益,按每个交易日做截面 z-score 标准化
y_{i,t} = (r_{i,t+1} - μ_t) / σ_t -
滚动拟合:以 60 个交易日为窗口、20 天为步长滚动,在每个窗口内把你提交的所有因子一起放进同一个 Elastic Net 回归,共同竞争权重:
L = ‖y - F·w‖² + λ₁‖w‖₁ + λ₂‖w‖² -
打分:对每个因子在所有窗口上的权重绝对值序列 |w|,计算
ModelScore_i = mean(|w_i|) / (std(|w_i|) + eps)即该因子权重的信噪比——权重既要大、又要在各个窗口之间稳定,分数才高。
关键点:这是一个「联合回归」,不是「单因子独立测试」。 每个因子的分数取决于它在整个因子集合里的边际贡献,而不是它单独的表现。因此,同一个因子,在不同的因子组合里,分数天然就会不同。
二、为什么加了新因子后,原因子分数会大幅下降
这是联合回归的预期行为,通常由以下一个或多个原因造成:
1. 因子间共线性(最常见原因)
如果新加入的因子与原因子高度相关(相关系数高),回归会把原本集中在一个因子上的权重,拆分到多个相关因子上。
- 单个因子拿到的 mean(|w|) 变小 → 分子变小;
- 更麻烦的是,L1 正则(稀疏性)会让这些相关因子在不同窗口里轮流被选中——这个窗口给 A 权重、下个窗口给 B 权重——导致每个因子的权重在窗口间大幅跳动;
- std(|w|) 变大 → 分母变大。
分子变小、分母变大,ModelScore 双向被压低。这也是为什么报告里会附带因子相关性热力图和 selection_rate(因子在各窗口权重非零的占比)——用来诊断这种情况。
2. 信息被更强的因子替代
如果新因子对收益的解释力更强,且覆盖了原因子的部分信息,回归会把权重更多地分配给新因子,原因子的权重被自然压缩甚至归零。这说明原因子在新组合里的增量信息有限。
3. 稀疏性带来的「非零即零」跳变
Elastic Net 的 L1 项会主动把冗余因子的权重压到 0。当因子数增多、彼此可替代时,某个因子可能只在部分窗口被选中、其余窗口权重为 0,selection_rate 下降,|w| 序列波动加大,信噪比自然走低。
4. 维度上升导致有效窗口减少
窗口内的最小样本要求为 max(50, 因子数 × 5)。因子数量显著增加时,部分样本不足的窗口会被跳过,可用于统计的窗口变少,也会让分数不稳定。
三、结论与建议
-
分数下降不代表原因子「失效」,而是反映它在新的因子集合中边际贡献变小了——多数情况是与新因子信息重叠。
-
单因子分数高、组合内分数低,恰恰是这个评估想要暴露的信息:因子之间是否冗余。
-
建议排查方向:
- 查看报告中的因子相关性热力图,确认新老因子是否高度相关;
- 关注 selection_rate——若明显下降,说明该因子在多数窗口已被其他因子替代;
- 如果目标是评估单个因子的独立有效性,请单独提交该因子或与低相关因子组合;如果目标是构建组合,则应关注组合整体的表现,而非单一因子的绝对分数。
简言之:这套评估衡量的是因子在组合中的独立增量价值。因子越多、越相关,单因子被稀释是正常且符合设计预期的结果。