3. 因子与信号 DWS
因子层的两条底线:结果可复现、物理隔离未来信息。因子实现忠于论文原始定义,筛选与组合只允许依赖历史截面。
作用:批量计算 Alpha101 因子值,再做筛选 → 组合 → 截面排序,产出每个调仓日的目标持仓。
输入与输出的契约
输入是预处理层的干净面板(returns / vwap / cap + OHLCV,见数据预处理)。输出是两样东西:
| 输出 | 形态 | 规模感 |
|---|---|---|
| 因子值 | 每日截面 × 101 个因子 | 上千万行 |
| 目标持仓 | 每个调仓日 Top N 名单 + 合成分 | 每次仅 10 行 |
这一层对下游的承诺:同样的输入永远算出同样的持仓(可复现),且 T 日的持仓只依赖 T-1 及更早的信息(无未来函数)。
决策一:因子实现忠于论文原始定义
101 个因子全部按 WorldQuant 论文的公式实现,不做「自认为更合理」的改动。原因是偏离定义的偏差是静默的:程序不报任何异常,因子值却系统性错误。两个真实教训:
- 论文
adv{d}定义为「平均成交金额(dollar volume)」,早期实现错误地使用了「平均成交股数」。数值天差地别,但代码全程无异常 → 事故档案 · adv 语义错误 - 为防止
rank()/correlation()分母为零引入随机扰动,导致同样的输入每次算出不同的因子值 → 用固定 seed 恢复可复现性,见事故档案 · 随机扰动与不可复现
这两个事故共同的教训:因子层的正确性无法靠「跑通了」验证,只能靠对照定义逐项核对,以及可复现性约束。
决策二:用 IC 筛选并去冗余,而不是全部拿来用
101 个因子不是 101 份独立信号。Alpha101 高度同构(大量因子共享相似的量价结构,见 Alpha101 是什么),直接全用等于给同一个信号重复计权。所以进组合前有两道筛选。
IC 法是完整单因子评估体系(IC/ICIR、分组测试、回归法)中的一环,本系统当前仅实现这一环,分组测试与回归法尚未实现。三个维度的公式、算例与互补关系见单因子有效性评估。
第一道,逐因子评估。对每个因子逐日计算「当期因子值 vs 未来 5 日收益」的截面 Spearman 相关,得到一条 IC 序列,然后设四项条件:
| 条件 | 阈值 | 意图 |
|---|---|---|
| |IC 均值| | ≥ 0.02 | 预测力下限 |
| ICIR(IC 均值 / IC 标准差) | ≥ 0.3 | 预测力的稳定性 |
| IC 方向一致的天数占比 | ≥ 55% | 方向不能来回翻 |
| 有效样本 | ≥ 60 个交易日 | 统计意义下限 |
任一条件不满足即排除。101 个因子筛选后,剩余数量通常大幅减少。
第二道,去冗余。通过筛选的因子两两算相关,> 0.7 视为同质信号,只保留 IC 较高者。
这套筛选的隐含代价要在主线说清楚:IC 用未来 5 日收益评估因子,所以筛选本身是「用历史窗口内的未来」做的。窗口内没问题,但把筛选结果外推到窗口外,就是路线图里「因子衰减监测与自动重训练」要解决的问题。
决策三:合成用 ICIR 加权,方向按 IC 符号统一
通过筛选的因子合成为单一分数,分三步:先做每日截面标准化拉平量纲;再按各因子 IC 均值的符号统一方向(负 IC 因子翻号,表示与收益负相关);最后加权求和,默认按 ICIR 加权——预测越稳定的因子权重越大(等权 / IC 加权作为备选口径保留)。
最后每日对合成分做截面排序取前 10 名,等权各 1/10,连同分数写入目标持仓。
决策四:同一套逻辑,回测与实盘各一个入口
合成分只算一份。回测入口在使用前对信号整体后移一天(T 日只用 T-1 的分);实盘入口在收盘后才运行,天然只有 T-1 及更早的数据。防未来函数不依赖散布在各处的时间判断,而是在入口处物理隔离。这就是 One Codebase 在信号层的形态;三套独立实现导致结果无法复现的教训见事故档案 · 回测实盘路径分叉。
常见错误
- adv 实现为成交股数而非成交金额,静默的系统性偏差 → 事故档案 · adv 语义错误
- 防除零的随机扰动未固定 seed,结果不可复现 → 事故档案 · 随机扰动与不可复现
- MultiIndex 索引对齐错位,下游数据被静默篡改
- 单因子产出 NaN / Inf 未拦截,组合权重失控(现由计算后校验自动拦截)
当前状态
101 个因子全部定义;行业中性化已在因子层使用(按 sector 分组,缺失行业时退化为全市场去均值),但不是 point-in-time 行业分类,历史行业变化仍可能带入未来信息。早期 README「82 可运行」口径已过时,以引擎的可用因子清单为准(见指标口径)。
实现对照
上一层:2. 数据预处理 DWD · 下一层:4. 截面回测引擎
3a46f0f · 因子正交化 #22 · 拥挤度监控 #23