halo 的技术博客

返回

做过量化的人都知道:找到一个能赚钱的因子,比找到一个能上实盘的因子容易十倍

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

因子挖掘全流程

Step 1:数据准备——“垃圾进垃圾出”的原始起点#

因子挖掘的第一步永远是数据,但也是被新手最轻视的一步。

你以为的数据:一个 CSV 文件,干干净净,每行一天。真实的数据:缺失值、重复行、复权错误、停牌日涨跌停板、除权除息扰动、ST 股票、新股首日——每一项都能让你的因子”看起来好”但”实际上没信号”。

数据层面必须做的事#

  1. 复权处理:用后复权价格(adj close),别用前复权。前复权会让历史价格每次除权都变,破坏时序一致性。
  2. 停牌/涨跌停过滤:停牌日的”零收益率”不该进样本,涨跌停日的价格没有充分反映信息,标为 NA 或剔除。
  3. 幸存者偏差:必须用 point-in-time 数据,即每个截面只包含当时还在交易的股票。不能把 2026 年还活着的股票放到 2016 年的截面里——那些 2018 年退市的股票被你”幸存者偏差”抹掉了。
  4. 异常值处理:对连续变量做 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)
python

Step 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:没有做因子拥挤度监控#

一个因子被越来越多的人交易,它就会”拥挤”,超额逐渐衰减。监控指标包括:因子组合的换手率趋势、因子在不同市值组的容量变化、配对交易收益的衰减速度。

因子IC衰减监控

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 个经过完整的流程验证”。

少即是多,流程比灵感更值钱。

因子挖掘全流程:从数据清洗到实盘上线的工程化方法论
https://blog.halo26812.eu.org/blog/factor-mining-pipeline
Author halo
Published at 2026年7月19日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨