做过量化的人都知道:找到一个能赚钱的因子,比找到一个能上实盘的因子容易十倍。
回测曲线漂亮得发光,一旦上线就跑崩——这在量化圈子里叫”回测过拟合”,几乎每个量化研究员都在这上面交过学费。今天我不讲某个具体因子,而是把因子挖掘的工程化全流程拉通讲一遍:从数据到信号、从验证到上线,每一步有哪些坑、什么是可落地的标准。

Step 1:数据准备——“垃圾进垃圾出”的原始起点#
因子挖掘的第一步永远是数据,但也是被新手最轻视的一步。
你以为的数据:一个 CSV 文件,干干净净,每行一天。真实的数据:缺失值、重复行、复权错误、停牌日涨跌停板、除权除息扰动、ST 股票、新股首日——每一项都能让你的因子”看起来好”但”实际上没信号”。
数据层面必须做的事#
- 复权处理:用后复权价格(adj close),别用前复权。前复权会让历史价格每次除权都变,破坏时序一致性。
- 停牌/涨跌停过滤:停牌日的”零收益率”不该进样本,涨跌停日的价格没有充分反映信息,标为 NA 或剔除。
- 幸存者偏差:必须用 point-in-time 数据,即每个截面只包含当时还在交易的股票。不能把 2026 年还活着的股票放到 2016 年的截面里——那些 2018 年退市的股票被你”幸存者偏差”抹掉了。
- 异常值处理:对连续变量做 winsorize(缩尾),一般取 1%/99% 分位数截断,或者 MAD(中位数绝对偏差)方法。
# 示例:MAD 方法去极值
import numpy as np
def mad_winsorize(series, n=5):
median = np.nanmedian(series)
mad = np.nanmedian(np.abs(series - median))
upper = median + n * mad * 1.4826 # 1.4826 是正态性修正
lower = median - n * mad * 1.4826
return np.clip(series, lower, upper)pythonStep 2:因子构造——来自经济直觉的信号#
一个好的因子必须有一个说得通的经济故事。
不是说”这个公式在回测中好用”就够了。你得能回答:为什么这个信号能预测未来收益?是行为偏差(投资者过度反应/反应不足)?是风险补偿(对小盘股、低流动性股票的补偿)?还是信息摩擦(某些信息需要时间扩散)?
常见因子类别#
| 类别 | 代表性因子 | 经济逻辑 |
|---|---|---|
| 价值 | B/P, E/P, C/P | 便宜的公司长期回归均值 |
| 动量 | 12-1 月动量 | 赢家继续赢(短期)/ 长期反转 |
| 质量 | ROE, 应计利润 | 高盈利、低操控的公司更持久 |
| 低波动 | 过去 1 年波动率/贝塔 | 低风险股票有”博彩偏好”溢价 |
| 流动性 | Amihud, 换手率 | 交易成本高的股票需要补偿 |
| 情绪/另类 | 新闻舆情、社交媒体 | 非结构化数据的信号提取 |
Step 3:因子检验——别只看 IC 和 t 值#
新手检验因子的五个最常见错误:
错误 1:只看 IC 均值,不看 IC_IR#
IC(Information Coefficient,因子值与下期收益的秩相关系数)均值 > 0.02 可能只是运气。要结合 IC_IR = mean(IC) / std(IC),它告诉你因子的”信噪比”稳定程度。IC 均值 0.03、标准差 0.15(IC_IR=0.2),远不如 IC 均值 0.02、标准差 0.04(IC_IR=0.5)的因子可靠。
错误 2:不分市值组直接算 IC#
小市值股票的噪音远大于大市值。一个因子可能在全体样本上 IC 显著,拆开看——小市值组 IC=0.04(t=3.5),大市值组 IC=0.01(t=0.8)。这个大市值组的”无效”才是你该关注的。
错误 3:没有做单调性检验#
分组回测不能只看 top-bottom 对冲收益。你要看:Q1 到 Q5,收益率是否呈单调递减?如果收益在 Q2 反而高于 Q1,说明这个因子在中间有非线性——你的线性相关系数 IC 在骗你。
错误 4:忽视了行业中性#
很多信号其实是行业信号。一个”高 ROE”因子可能只是重仓了消费行业。行业中性化(回归掉行业虚拟变量后再取残差)是最低要求。
错误 5:没有做因子拥挤度监控#
一个因子被越来越多的人交易,它就会”拥挤”,超额逐渐衰减。监控指标包括:因子组合的换手率趋势、因子在不同市值组的容量变化、配对交易收益的衰减速度。

Step 4:组合构建——从因子到持仓#
有了因子值,怎么变成实际持仓?这不是简单的”排名前 10% 买入”。
多空 vs 纯多#
学术论文爱用多空组合(long top, short bottom),因为信号最干净。实盘中 A 股很难做空,多数只能用纯多组合(long only),信号的对称性假设就破了——你能证明”排名靠后的会跌”吗?如果不能,你的纯多组合只是买入了一批”勉强还行”的股票。
权重方案#
- 等权:最简单,但无视市值差异,小盘股被过度放大
- 市值加权:流动性最高,但信号强度被稀释
- 风险平价/等风险贡献:每个持仓贡献等量风险,回撤更平滑
- 最优化:在约束下最大化期望收益,但输入参数误差会放大,Michaud 建议重抽样
容量约束#
你的策略能容纳多大资金?每只股票的日均成交额的 5%-10% 是上限(流动性约束)。超过这个阈值,你自己的订单就在推价格——这是”市场冲击”。
Step 5:实盘前的最后一步——样本外与纸上交易#
在真正拿钱跑之前,先做至少 3-6 个月的”纸上交易”(paper trading)。
纸交不是走形式,而是验证:你的信号值在当天能算出来吗(没有 look-ahead bias)?成交价能按你假设的”收盘价”执行吗(滑点问题)?你的换手率假设合理吗(交易成本在吃掉多少 alpha)?
总结#
因子挖掘的关键不是公式,而是工程化的流程意识。
数据清洗、样本外验证、分组单调性、行业中性化、拥挤度监控、容量评估——这些才是一个因子从”回测好看”到”实盘赚钱”的桥梁。大多数初学者卡在”我找到 100 个 IC 显著的因子”,而专业量化研究员卡在”这 100 个里只有 3 个经过完整的流程验证”。
少即是多,流程比灵感更值钱。