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 单因子测试框架
因子定义好了,怎么知道它有没有用?这就需要单因子测试框架。我建议你把它想象成一个「质检流水线」:
- 数据准备:对齐因子值和未来收益(比如T日因子值,对应T+1日收益)
- 去极值:把异常值拉回来,我一般用MAD(中位数绝对偏差)法
- 标准化:让因子变成均值为0、标准差为1的分布
- 中性化:剔除市值、行业等干扰因素
- 测试指标: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
3.3 IC/IR分析
IC(信息系数)和IR(信息比率)是衡量因子预测能力的核心指标。我简单解释一下:
- IC:因子值与未来收益的秩相关系数。范围[-1, 1],正数表示正向预测,负数表示反向预测。
- IR:IC的均值除以IC的标准差。衡量因子预测的稳定性。
为什么用秩相关而不是皮尔逊相关?因为秩相关对异常值不敏感。你想想看,如果某只股票因为黑天鹅事件暴跌100%,皮尔逊相关会被严重扭曲,但秩相关只看排名顺序,影响小得多。
我个人习惯看两个东西:
- IC序列图:看IC随时间是否稳定。如果IC忽正忽负,说明因子不稳定。
- 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% |
3.4 分组回测与多空收益
IC分析告诉你因子「有没有预测能力」,但分组回测告诉你「能不能赚钱」。这是两码事。
分组回测的做法很简单:
- 每个月把所有股票按因子值从小到大分成10组(或5组)
- 计算每组下个月的等权平均收益
- 观察组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
3.5 本章知识体系
下面这张图总结了因子构建与测试的完整流程。你可以把它当作一个检查清单:
这张图把整个流程串起来了。你从因子定义出发,经过数据预处理,然后做IC/IR分析判断预测能力,最后用分组回测和多空收益验证实际赚钱能力。每一步都有明确的输出和判断标准。
好了,这一章的内容就到这里。因子构建是量化投资的基石,打好这个基础,后面做因子组合和权重优化才能得心应手。记住:好的因子,经得起IC检验,也经得起分组回测的考验。
公众号:蓝海资料掘金营,微信deep3321