3. 因子构建基础:因子定义与数学表达、单因子测试框架、IC/IR分析、分组回测与多空收益

各位同学,欢迎来到因子构建的实战环节。说实话,很多人在这一步就开始犯怵了——觉得数学公式太复杂,或者觉得回测框架太玄乎。其实没那么可怕。我做了这么多年量化,最深的体会就是:因子构建的核心,是把你对市场的某种直觉,翻译成计算机能理解的数学语言。今天我们就来拆解这个过程。

3.1 因子定义与数学表达

什么是因子?说白了,因子就是一个能预测股票未来收益的特征变量。比如市盈率、动量、换手率,这些都是因子。但光有名字不行,你得把它写成数学公式。

我个人习惯把因子分为三类:

  • 基础因子:直接来自行情或财务数据,比如 close / open - 1 就是日内收益率因子
  • 衍生因子:对基础因子做运算,比如过去20天的平均换手率
  • 复合因子:多个因子加权组合,比如 0.3 * 动量 + 0.7 * 低波

举个例子。假设你想定义一个「日内反转因子」——就是今天涨得多的股票,明天容易跌。数学表达很简单:

# 因子定义:日内收益率(今日收盘/今日开盘 - 1)
factor_daily_ret = (close_today / open_today) - 1

# 因子方向:负向(值越大,预期未来收益越低)
# 所以实际使用时,我们取负值或做排序反转
factor_reversal = -factor_daily_ret

嗯,这里要注意:因子定义必须明确方向。我在项目中遇到过有人把因子符号搞反了,结果回测收益翻倍,实盘直接亏成狗。你想想看,一个正向因子你当负向用,那不就是反向指标吗?

核心原则:每个因子必须回答两个问题——① 它衡量什么?② 值越大,预期收益越高还是越低?

3.2 单因子测试框架

因子定义好了,怎么知道它有没有用?这就需要单因子测试框架。我建议你把它想象成一个「质检流水线」:

  1. 数据准备:对齐因子值和未来收益(比如T日因子值,对应T+1日收益)
  2. 去极值:把异常值拉回来,我一般用MAD(中位数绝对偏差)法
  3. 标准化:让因子变成均值为0、标准差为1的分布
  4. 中性化:剔除市值、行业等干扰因素
  5. 测试指标:IC、IR、分组收益、多空收益

为什么要中性化?举个例子。小市值因子本身很赚钱,但如果你测试一个「换手率因子」,发现它也很赚钱——其实只是因为小市值股票换手率高。中性化就是帮你剥离这种「伪相关」。我曾经吃过这个亏,后来学乖了。

# 伪代码:单因子测试流程
def single_factor_test(factor, forward_return):
    # 1. 去极值
    factor = winsorize(factor, limits=[0.01, 0.99])
    # 2. 标准化
    factor = (factor - factor.mean()) / factor.std()
    # 3. 中性化(对市值和行业做回归,取残差)
    factor_neutral = neutralize(factor, ['market_cap', 'industry'])
    # 4. 计算IC
    ic = spearmanr(factor_neutral, forward_return)[0]
    return ic
小技巧:标准化后的因子,IC值可以直接比较大小。IC绝对值超过0.05就算不错了,超过0.1就是很优秀的因子。

3.3 IC/IR分析

IC(信息系数)和IR(信息比率)是衡量因子预测能力的核心指标。我简单解释一下:

  • IC:因子值与未来收益的秩相关系数。范围[-1, 1],正数表示正向预测,负数表示反向预测。
  • IR:IC的均值除以IC的标准差。衡量因子预测的稳定性。

为什么用秩相关而不是皮尔逊相关?因为秩相关对异常值不敏感。你想想看,如果某只股票因为黑天鹅事件暴跌100%,皮尔逊相关会被严重扭曲,但秩相关只看排名顺序,影响小得多。

我个人习惯看两个东西:

  1. IC序列图:看IC随时间是否稳定。如果IC忽正忽负,说明因子不稳定。
  2. IC累计曲线:如果曲线稳步向上,说明因子持续有效;如果走平或向下,说明因子失效了。
指标 优秀 一般
IC均值 |IC| > 0.05 0.02 < |IC| < 0.05 |IC| < 0.02
IR IR > 0.5 0.2 < IR < 0.5 IR < 0.2
IC稳定性 正IC占比 > 60% 50% ~ 60% < 50%
避坑指南:我曾经见过一个因子IC均值高达0.12,但IR只有0.1。为什么?因为IC波动极大——有时候0.3,有时候-0.2。这种因子你敢用吗?反正我不敢。记住:稳定性比强度更重要

3.4 分组回测与多空收益

IC分析告诉你因子「有没有预测能力」,但分组回测告诉你「能不能赚钱」。这是两码事。

分组回测的做法很简单:

  1. 每个月把所有股票按因子值从小到大分成10组(或5组)
  2. 计算每组下个月的等权平均收益
  3. 观察组1到组10的收益是否单调递增或递减

如果组1收益最低、组10收益最高,说明因子正向有效。如果收益曲线是U型(两头高中间低),说明因子有非线性效应——这种情况我遇到过,需要做特殊处理。

多空收益就是做多组10、做空组1的收益。这是衡量因子「纯预测能力」的黄金标准。为什么?因为它对冲掉了市场整体波动,只保留因子本身的选股能力。

# 分组回测伪代码
def group_backtest(factor, forward_return, n_groups=10):
    # 按因子值分组
    groups = pd.qcut(factor, n_groups, labels=False)
    # 计算每组平均收益
    group_returns = forward_return.groupby(groups).mean()
    # 多空收益 = 最高组 - 最低组
    long_short_return = group_returns.iloc[-1] - group_returns.iloc[0]
    return group_returns, long_short_return
实战经验:我一般要求多空收益的年化夏普比率超过1.0,才考虑把这个因子纳入组合。低于0.5的因子,说实话,噪音太大。

3.5 本章知识体系

下面这张图总结了因子构建与测试的完整流程。你可以把它当作一个检查清单:

因子构建与测试知识体系 因子定义 数学表达 + 方向明确 数据预处理 去极值 → 标准化 → 中性化 IC/IR分析 预测能力评估 分组回测 10组收益 → 单调性检验 多空收益 做多最高组 - 做空最低组 关键指标速查 • IC > 0.05:优秀 • IR > 0.5:稳定 • 多空夏普 > 1.0:可用 • 分组单调:有效 • 正IC占比 > 60%:稳健

这张图把整个流程串起来了。你从因子定义出发,经过数据预处理,然后做IC/IR分析判断预测能力,最后用分组回测和多空收益验证实际赚钱能力。每一步都有明确的输出和判断标准。

好了,这一章的内容就到这里。因子构建是量化投资的基石,打好这个基础,后面做因子组合和权重优化才能得心应手。记住:好的因子,经得起IC检验,也经得起分组回测的考验


公众号:蓝海资料掘金营,微信deep3321