匡醍量化|大富翁量化

因子预处理 FAQ:去极值、缺失值、标准化与中性化怎么做

English 📅 2026-10-08 因子策略课程 进阶 👁 本月阅读 —

因子检验的质量首先取决于预处理。本文从《因子分析与机器学习策略》第 2 章「因子预处理流程」提炼出 7 个关键问题,覆盖因子数据来源、生成,以及去极值、缺失值处理、分布调整、标准化与中性化的原理和实操要点。

常见问题

因子的原始数据从哪里来?小资金该重点用什么数据?

因子的原始数据来源包括:交易数据、财务数据、另类数据、公告事件、盈利预期、行业特色、股东持股、公募持仓、新闻舆情、指数成分和衍生产品等。

关键背景是拥挤效应:对同样的数据用相同技术手段挖掘,往往会得到相似的因子,使用者一多收益就被摊薄——这是另类数据的价值来源(例如全球气象数据之于农产品、App Store 榜单之于游戏公司、搜索趋势榜)。但对资金量小的个人或小型机构,另类数据性价比不高(便宜时往往已广泛使用)。建议把主要精力放在行情数据和财务数据上,通过改进算法或跨界融合发现新价值——Banz 发现小市值因子时,引用的数据已存在 40 多年。数据质量不佳的市场中,更应聚焦量价因子,因为一切信息最终都会反映在价格上。

什么是技术指标的「冷启动期」?

技术指标类因子常因窗口计算而产生冷启动:例如计算 6 日 RSI,最前面 6 行是 NaN。但更值得注意的是,RSI 最初约 win × 3 条记录(含 NaN)都不够准确——不只是 NaN 部分。如果对因子评估要求较高,应在提取因子时把冷启动期整体置为 NaN,按缺失值处理。

异常值有哪几种修正方法?分别适用于什么场景?

异常值常见于财务数据(例如净利润增长率因分母趋近 0 而爆表)。不修正会显著干扰中性化回归与 IC 等指标。三种方法:

  1. 均值标准差修正法(3σ 法):把偏离均值 3 倍标准差的数据拉回边界,用 np.clip 实现。注意:数据量小时,个别离群值会显著影响标准差,导致 3σ 失效(所有点都落在边界内);
  2. 分位数修正法(Winsorize/缩尾):排序后按分位数把头尾数据拉回,scipy.stats.mstats.winsorize 可直接实现,支持对称(如 [0.1, 0.1])与非对称缩尾,结果在 .data 属性中;
  3. 中位数极值法(MAD 法):把偏离中位数若干倍 MAD 的值拉回。绝对中位差 MAD = median(|Xi − median(X)|);取比例因子 k ≈ 1.4826 时 MAD 与正态分布的标准差一致,此时 3 倍 MAD 近似对应 5 倍标准差。MAD 对离群值更稳健,是实践中常用方案。

缺失值怎么处理?删除、填充还是剔除?

超过 70% 公司的基本面因子都存在缺失(Bryzgalova 等对资产定价中 45 个流行特征因子的研究)。一般做法是将缺失值所在行直接删除,只保留有效值;需要保留时再考虑替换:

  • 财务因子:延用上期因子值(PIT 口径);
  • 其他因子:截面中位数替代、相似公司替代、插值(pandas 的 fillna / ffill / bfill / interpolate);
  • 缺失比例过高导致覆盖度过低时,应考虑剔除该因子或数据。

两个容易踩的坑:① 填充(尤其是均值/中位数)会改变数据分布,去极值与缺失值处理的先后顺序不同,最终结果可能不同;② pandas 的 fillna(method=...) 写法已不推荐,直接用 ffill / bfill。

什么情况下要做分布调整(如对数化)?

理想情况下因子在截面上的暴露应接近正态分布。明显偏离时,可用对数法或开根号调整后再使用。典型例子是 A 股市值因子:小票众多、少数股票市值巨大,原始分布右偏、尖峰、厚尾,取对数后接近正态。做法是先做分布推断(如画直方图),再决定是否调整。

什么时候需要标准化?单因子检验要不要做?

标准化(z-score,Z = (x − μ) / σ)的目的是消除不同因子的量纲差异,让线性模型中的权重可以公平比较。是否需要,取决于下游模型:

  • 单因子检验不需要:Alphalens 不对因子做标准化,也不要求标准化;
  • 线性回归类模型必须做;
  • 树模型(决策树、XGBoost、LightGBM)对量纲不敏感,不需要。

前提条件:标准化假设因子近似正态分布,若该假设不成立,直接标准化没有意义(可用统计检验判断)。另外注意 z-score 服从 N(0,1) 的含义是均值 0、标准差 1——不是取值在 (0,1),而是 |Z| 落在 [1,2] 区间的概率小于 5%、大于 2 的概率小于 0.3%。

中性化是什么?行业和市值中性化分别怎么做?

许多因子会因行业、市值不同而有系统性差异——这些差异不反映公司好坏,只反映行业差异和经济周期。不做中性化会出现「伪 Alpha」:例如 2022 年用低市盈率因子选股,选出来的几乎全是银行股,赚的是行业贝塔而不是选股 Alpha。

行业中性化有两种常用方案:

  1. 行业均值差法(demean):ε = Y − Ȳ_industry,即个股因子值减去所属行业的因子均值;
  2. 哑变量回归法:Y = β × Industry + α + ε,用行业哑变量(0/1)做线性回归,取残差 ε 作为中性化后的因子;该方案可与市值中性化合并进行。

市值中性化用回归形式:Y = β × log(市值) + α + ε,同样取残差。行业哑变量与 log 市值可拼接进同一个设计矩阵,一次性完成双重中性化(fit_intercept 一般保留)。

选择建议:Ehsani 等 2022 年的研究认为,做多空对冲的投资者应进行行业中性化,单纯做多的投资者则应避免。另外注意区分:市值分布调整(对数化)作用在个体市值上、不需要整体样本;市值中性化是减去均值/回归取残差的过程——两者是不同操作。

如何做因子预处理(标准步骤)

以 10 日动量因子为例,推荐的预处理顺序:

  1. 去极值:用 MAD 3 倍截断(mad_clip)——按截面(行)方向操作,同一天内处理,避免未来数据;
  2. 缺失值处理:缺失率低于阈值(如 20%)的截面用中位数填充,否则删除该期;缺失过多的标的剔除。必须先处理缺失值,否则后续标准化和中性化无法计算;
  3. 分布调整(按需):对明显右偏的因子(如市值)取对数或开根号;
  4. 标准化(按需):z-score 按截面标准化——线性模型需要,树模型和单因子检验不需要;
  5. 中性化:构造 [log 市值 + 行业哑变量] 设计矩阵,逐期回归取残差,得到中性化后的干净因子。

这套流程与本课程第 3 章单因子检验中的 get_clean_factor 实现一一对应,也是理解 Alphalens 预处理逻辑的基础。

延伸阅读

以上内容系统覆盖在《因子分析与机器学习策略》课程的第 2 章「因子预处理流程」中,完整大纲见课程大纲。