4、多因子模型构建:从单因子到多因子,如何合成与加权

单因子研究做完了,你手上可能有十几个看起来都挺靠谱的因子。然后呢?直接扔进模型?别急,这里有个坑——我早年就踩过。

单因子就像一个个独立的侦察兵,各有各的情报。但你要做决策,得把情报汇总起来,让它们互相印证、互相补充。这就是多因子合成的意义。

说白了,多因子模型要解决两个核心问题:用什么方法合,以及每个因子给多大权重。咱们一个一个来拆。

4.1 因子合成:把情报拧成一股绳

合成之前,先得把因子标准化。你想想看,市盈率是几倍到几十倍,换手率是百分之几,动量是涨跌幅——量纲都不一样,怎么直接加?

我个人习惯用Z-score标准化

# Python示例:因子标准化
import pandas as pd
import numpy as np

def zscore_standardize(factor_series):
    """对因子序列做Z-score标准化,并截断极端值"""
    mean = factor_series.mean()
    std = factor_series.std()
    z = (factor_series - mean) / std
    # 截断到[-3, 3],防止极端值干扰
    return z.clip(-3, 3)

标准化之后,常用的合成方法有三种。我按实战频率排个序:

方法 核心思路 我的评价
等权合成 所有因子权重相同,直接平均 简单粗暴,但往往效果不差
IC加权合成 按因子IC值(信息系数)分配权重 比等权好,但IC会变,需定期调整
IR加权合成 按IC的均值/标准差(信息比率)加权 我最常用,兼顾了收益和稳定性

等权合成——别小看它。我在项目中遇到过,有些团队花里胡哨搞了一堆优化,结果还不如等权。为什么?因为因子之间相关性高的时候,复杂的加权方法容易过拟合。等权至少不会犯大错。

IC加权就直观多了:哪个因子最近预测能力强,就多给它点权重。公式很简单:

# IC加权合成示例
def ic_weighted_composite(factors_df, ic_series):
    """
    factors_df: 各因子值,每列一个因子
    ic_series: 各因子的IC值,index与列名对应
    """
    weights = ic_series / ic_series.sum()
    composite = factors_df.dot(weights)
    return composite

IR加权是我个人最推荐的。它不光看IC的均值(预测能力),还看IC的标准差(稳定性)。你想想看,一个因子这周IC是0.1,下周是-0.08,波动这么大,你敢重仓吗?IR加权会自动惩罚这种不稳定的因子。

核心原则:因子合成不是越复杂越好。先跑等权,再试IC加权,最后上IR加权。每一步都做回测对比,别想一口吃成胖子。

4.2 权重优化:从拍脑袋到数学求解

加权方法再往上走,就是优化求解了。说白了,我们要找一个权重向量w,让合成因子的某些指标最优。

最常见的优化目标是最大化合成因子的IR。嗯,这里要注意——这需要用到因子之间的协方差矩阵。我直接给代码:

import numpy as np

def optimize_weights(factor_returns, target_ir=1.0):
    """
    基于因子收益率序列,优化权重以最大化IR
    factor_returns: 各因子每期的收益率,shape=(T, N)
    """
    # 计算因子收益率的协方差矩阵
    cov = np.cov(factor_returns, rowvar=False)
    # 计算因子收益率均值
    mean_ret = np.mean(factor_returns, axis=0)
    
    # 最优权重:均值向量 @ 协方差逆矩阵
    inv_cov = np.linalg.inv(cov)
    weights = inv_cov @ mean_ret
    
    # 归一化,使权重和为1
    weights = weights / np.sum(np.abs(weights))
    return weights

这段代码看着简单,但坑不少。我曾经在实盘里直接用这个,结果权重剧烈波动,换手率高得吓人。后来加了两个约束才稳住:

  • 权重上下限约束:单个因子权重不超过30%,不低于5%
  • 权重变化约束:每次调仓,权重变化不超过10%

避坑指南:我曾经在2018年用纯优化方法做多因子模型,结果权重全压在了动量因子上。那年市场风格切换,动量因子暴跌,组合回撤超过15%。后来我学乖了——优化出来的权重,一定要做敏感性分析。把每个因子权重上下调5%,看看组合表现会不会崩。

4.3 实战中的合成流程

说了这么多理论,咱们看看实际怎么干。我一般按这个流程走:

  1. 因子预处理:去极值、标准化、中性化(市值、行业)
  2. 相关性检查:如果两个因子相关性超过0.7,只留一个,或者做正交化
  3. 初步合成:先用等权合成跑一遍,看整体IC和IR
  4. 加权优化:用IR加权或优化求解,对比等权的结果
  5. 稳定性检验:滚动12个月窗口,看权重是否稳定

下面这张图,是我自己项目里用的多因子合成框架:

多因子合成与加权实战框架 因子1(估值) 因子2(动量) 因子N(质量) 预处理:去极值 → 标准化 → 中性化(市值/行业) 相关性检查:剔除或正交化高相关因子 等权合成(基准) IC/IR加权合成 优化求解(带约束) 最终合成因子

我的小技巧:每次调仓前,我会把合成因子的权重分布画出来。如果某个因子权重突然从20%跳到50%,我会停下来想想——是市场变了,还是数据出错了?多因子模型最怕的就是「黑箱操作」,每一步都要能解释得通。

4.4 别忘了回测验证

合成方法再好,也得用数据说话。我一般做三组对比:

  • 等权 vs IC加权 vs IR加权:看哪个在样本外表现最稳
  • 不同窗口期:用12个月、24个月、36个月的滚动窗口分别算权重
  • 压力测试:把2015年股灾、2018年熊市单独拎出来看

记住一句话:多因子模型不是造出来的,是测出来的。你花在回测上的时间,至少应该是建模时间的3倍。

好了,因子合成和加权这块,核心就是这些。下一节咱们聊聊怎么用这些因子去选股、构建组合——那才是真正见真章的地方。


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