第 2 章 · 02 单因子测试流程 本节摘要:有了候选因子,下一步不是直接拿去选股,而是先做「单因子测试」——用标准化的流程检验因子到底有没有预测力,以及它的收益分布长什么样。华泰多因子系列第 1 篇与海通选股因子系列方法论部分确立了一套通用流程:先对原始因子做预处理(去极值、标准化、行业市值中性化),剔除数据噪声与已知的收益来源;再按因子值把股票分若干组(常用五分组或十分组);最后统计各组未来收益、计算多空收益与单调性。本节讲透这套标准流程的每一步,为后面 IC/IR、因子合成打基础。读完本节,你能独立设计一个干净的单因子测试。 内容来源:仓库研报 华泰多因子系列第 1 篇 + 海通选股因子系列方法论,知识结构化整理。
本节摘要:有了候选因子,下一步不是直接拿去选股,而是先做「单因子测试」——用标准化的流程检验因子到底有没有预测力,以及它的收益分布长什么样。华泰多因子系列第 1 篇与海通选股因子系列方法论部分确立了一套通用流程:先对原始因子做预处理(去极值、标准化、行业市值中性化),剔除数据噪声与已知的收益来源;再按因子值把股票分若干组(常用五分组或十分组);最后统计各组未来收益、计算多空收益与单调性。本节讲透这套标准流程的每一步,为后面 IC/IR、因子合成打基础。读完本节,你能独立设计一个干净的单因子测试。
内容来源:仓库研报 华泰多因子系列第 1 篇 + 海通选股因子系列方法论,知识结构化整理。
⚠️ 学习提示:很多初学者跳过预处理直接回测,得到的「有效因子」其实是行业/市值因子借尸还魂。预处理是单因子测试里最容易被忽视却最关键的一环。
阅读完本节,你应当能够:
候选因子来自理论或数据挖掘,但它「到底有没有预测力、收益分布是否单调、能否稳定」必须用统一流程检验。直接拿去选股会同时混淆几个问题:是因子本身有效,还是它隐含了行业/市值暴露?收益是均匀分布还是只来自极端组?换手和容量能否接受?
单因子测试的目的就是把这些问题逐个拆开。它的标准流程是:
💡 核心心法:单因子测试的核心不是「证明因子有效」,而是「在干净环境里量度它有多有效」。预处理把环境弄干净,分组把效应暴露出来,统计把效应量化。三步缺一不可。
原始因子数据常有极端值——可能是数据错误(如停牌期的虚假值),也可能是真实但异常的极端公司。这些极值会严重扭曲相关系数和回归结果。
常用三种方法:
| 方法 | 公式(文字) | 适用 |
|---|---|---|
| MAD 法(中位绝对偏差) | 先算中位数 median,再算 MAD = median( | x - median |
| 3σ 法 | 均值 ± 3 倍标准差外的值截断 | 简单,但受极值自身影响 |
| 百分位法 | 把 1% 分位以下、99% 分位以上的截到分位值 | 工程上常用 |
A 股因子分布常是厚尾偏态,华泰多因子系列默认推荐 MAD 法——它用中位数做基准,极值本身不影响阈值。
# MAD 去极值示意 median = factor.median() mad = (factor - median).abs().median() bound = n * 1.4826 * mad # n 常取 5 或 3 factor = factor.clip(lower=median - bound, upper=median + bound)
去极值后,因子值的尺度差异巨大(PE 可能是几十,波动率是 0.2),无法直接比较或加权。标准化把不同因子拉到同一尺度。
最常用 Z-score 标准化:
z = (x - mean) / std
标准化后因子均值为 0、标准差为 1,后续分组、加权、回归才有可比性。
💡 关键观察:标准化必须在每个横截面(即每个交易日截面上,所有股票一起算 mean/std)做,不能跨时间序列。否则会引入未来函数——用了未来才知道的均值。
这是单因子测试里最关键也最常被忽略的一步。很多因子表面有效,实际只是隐含了行业或市值暴露。例如低 PE 因子,本质上多分布在金融、地产等大盘行业;若不做中性化,你以为发现的是「估值效应」,实际可能只是「市值/行业效应」。
中性化的做法:把标准化后的因子值对行业哑变量与市值的对数做线性回归,取残差作为「纯净因子值」。
factor_pure = factor_standardized ~ 行业哑变量 + log(市值) 的残差
残差就是因子剥离了行业与市值影响后的「纯 alpha 部分」。海通系列几乎每个因子报告都会同时给出中性化前后的结果对照,这是判断因子「独立贡献」的标准动作。
| 检验方式 | 含义 |
|---|---|
| 未中性化收益 | 因子的原始表现(含行业市值暴露) |
| 行业中性化收益 | 剥离行业影响后的表现 |
| 行业+市值中性化收益 | 同时剥离行业与市值,最严格 |
一个因子若在中性化后失效,就说明它的预测力主要来自行业或市值,自身没有独立 alpha。
预处理拿到纯净因子值后,按因子值把全市场股票等数量分成若干组(常用五分组或十分组),统计每组的未来收益。
预处理的顺序很关键:必须是「去极值 → 标准化 → 中性化」三步串联,顺序不能乱。去极值先剔除异常点,保证后续均值/标准差估计不被污染;标准化把因子拉到同一尺度;中性化在标准化后做回归,残差仍是 0 均值、单位尺度的「纯净因子值」。若顺序颠倒(如先中性化再标准化),残差结构会被破坏,失去尺度一致性。
多空收益 = 第 5 组(多头)收益 − 第 1 组(空头)收益,是因子预测力的核心度量。
分组的几个细节:
💡 关键观察:回看对齐这一条是最容易被忽略的陷阱。若误用「t 日因子值对应 t 日起的收益」,等于用了当日收盘价(当天才知道)对应当天收益,引入轻微未来函数。正确做法是 t 日因子值 → t+1 到 t+N 日的收益,与第 3 章第 04 节
shift(-N)的逻辑严格一致。
理想的因子应具备两个性质:
若中间几组收益混乱、只有某一组极端,因子质量较差——它可能是被极端值驱动,而非整体有效。
分组后,除了看多空收益,还要从多个角度交叉验证:
海通系列还特别强调分年度看收益——一个因子可能 10 年平均多空年化 10%,但其中 8 年贡献为 0,全部收益来自 2 个特殊年份(如某次金融危机)。这种「靠少数年份撑起平均」的因子,实战可靠性差,需要警惕。
下面是一份典型的单因子测试报告(以假想的低 PE 因子为例):
| 指标 | 全市场 | 沪深 300 | 中证 500 |
|---|---|---|---|
| 多空年化收益(未中性化) | 12.5% | 5.2% | 9.8% |
| 多空年化收益(行业+市值中性) | 6.3% | 1.1% | 4.5% |
| 月均 Rank IC | 0.052 | 0.028 | 0.041 |
| 年化 IR | 0.62 | 0.21 | 0.48 |
| 多头月换手率 | 35% | 22% | 40% |
读这张表能得出几个判断:(1) 中性化后多空收益大幅下降,说明原始效果很大程度来自行业市值暴露;(2) 在沪深 300 上几乎失效,因子更适合中小盘;(3) 换手率 35% 偏高,扣成本后实际收益会更低。这种「多维度交叉检验」正是单因子测试的价值所在。
补充一个常被问到的细节:「多空收益」与「IC」不一致怎么办? 例如某因子 IC 显著为正但多空收益平淡。常见原因是因子只在中间组有效、极端组拉开不够,导致 IC(整体相关性)正而多空(极端组之差)小。这种因子质量差,实战中宁可放弃。
⚠️ 学习提示:卖方研报的单因子测试结果普遍存在「幸存者偏差」与「回测期挑选」问题。看到漂亮的分组收益曲线,先问:这些组里的股票是否都可交易?回测期是否覆盖多种市场状态?多空收益是否扣了交易成本?
下一节,我们看怎么把这套分组检验浓缩成两个核心数字——信息系数 IC 与信息比率 IR,以及更严格的分层回测。