4、线性融合方法:等权加权、IC加权、IR加权、最大化ICIR的优化加权

好,咱们进入正题。因子融合这件事,说白了就是把几个信号拧成一股绳。高频因子和低频因子,一个快一个稳,怎么搭配最合适?我这些年试过不少路子,今天把最经典的四种线性融合方法掰开揉碎讲清楚。

核心观点:线性融合不是简单的“加一加”,而是给每个因子分配一个权重,让组合后的信号更稳定、更有效。权重怎么定,决定了你的策略是吃肉还是喝汤。

4.1 等权加权——最朴素,但别小看它

等权加权,就是给每个因子相同的权重。比如你有3个因子,每个权重就是1/3。听起来简单吧?但我告诉你,很多实盘策略跑下来,等权加权往往能跑赢那些花里胡哨的优化方法。

为什么?因为等权加权天然具备“分散化”的效果。你想想看,如果某个因子在某段时间失效了,其他因子还能顶上。我在项目中遇到过好几次,用IC加权优化出来的组合,回测曲线漂亮得不行,一上实盘就崩——就是因为过度依赖了某个因子。

我的经验:等权加权适合作为“基准线”。每次做因子融合,我都会先跑一遍等权加权的结果,看看其他方法到底有没有显著提升。如果提升不大,那我宁愿用等权,省心。

# 等权加权示例
import pandas as pd
import numpy as np

# 假设有3个因子:高频动量、低频估值、低频波动
factors = ['high_freq_momentum', 'low_freq_value', 'low_freq_volatility']
weights = np.array([1/3, 1/3, 1/3])

# 因子数据(已标准化)
factor_data = pd.DataFrame({
    'high_freq_momentum': [0.2, -0.1, 0.5, ...],
    'low_freq_value': [0.3, 0.4, -0.2, ...],
    'low_freq_volatility': [-0.1, 0.2, 0.1, ...]
})

# 融合信号
combined_signal = factor_data.dot(weights)

4.2 IC加权——让历史表现说话

IC(Information Coefficient)衡量的是因子预测能力。IC加权,就是用因子过去一段时间的IC值作为权重。IC越高,权重越大。

这个方法比等权加权进了一步,但有个坑——IC本身波动很大。我记得有一次做回测,某个因子过去3个月的IC高达0.08,我给了它40%的权重,结果接下来一个月IC直接变成-0.03,组合收益被拖累得很惨。

避坑指南:IC加权对窗口期非常敏感。窗口太短(比如20天),权重波动剧烈;窗口太长(比如1年),又反应迟钝。我一般用60-120天的滚动窗口,并且会做一次“IC衰减加权”——近期的IC给更高权重。

# IC加权示例
def ic_weighted_fusion(factor_data, returns, window=60):
    """
    factor_data: 因子值矩阵 (T x N)
    returns: 未来收益 (T,)
    window: 滚动窗口
    """
    weights = []
    for t in range(window, len(factor_data)):
        # 计算过去window天的IC
        ic = factor_data.iloc[t-window:t].corrwith(returns.iloc[t-window:t])
        # 归一化权重
        w = ic / ic.sum()
        weights.append(w)
    
    # 用最新权重融合
    latest_weights = weights[-1].values
    combined = factor_data.iloc[-1].dot(latest_weights)
    return combined

4.3 IR加权——兼顾预测能力和稳定性

IR(Information Ratio)是IC的均值除以IC的标准差。说白了,IR加权不仅看因子“准不准”,还看它“稳不稳”。

我个人非常喜欢IR加权。为什么?因为IC高的因子可能只是运气好,而IR高的因子才是真正有持续预测能力的。我在做高频因子和低频因子融合时,发现高频因子的IC往往不低,但波动极大;低频因子IC中等,但很稳定。IR加权会自动给低频因子更高的权重,这正好符合我们的直觉。

因子类型 平均IC IC标准差 IR IR加权权重
高频动量 0.06 0.12 0.50 0.25
低频估值 0.04 0.05 0.80 0.40
低频波动 0.05 0.07 0.71 0.35

你看这个表格,高频因子IC最高,但IR最低,所以权重反而最小。这就是IR加权的魅力——它帮你过滤掉那些“虚高”的因子。

4.4 最大化ICIR的优化加权——理论最优解

前面三种方法都是启发式的,而最大化ICIR的优化加权,是从数学上求解最优权重。目标很明确:让融合后的ICIR最大。

具体来说,假设我们有N个因子,每个因子的IC序列已知,那么融合后的ICIR可以写成:

ICIR_combined = (w^T * μ) / sqrt(w^T * Σ * w)

其中:
w: 权重向量
μ: 各因子IC的均值向量
Σ: 各因子IC的协方差矩阵

这个优化问题有解析解:w* = Σ^(-1) * μ。嗯,这里要注意,Σ必须是正定的,否则解不稳定。我在项目中遇到过协方差矩阵奇异的情况,尤其是因子数量多、历史数据短的时候。

我曾经踩过的坑:直接用原始IC序列算协方差矩阵,结果优化出来的权重全是极端值(比如某个因子权重1.2,另一个-0.3)。后来我加了L2正则化,才让权重变得合理。说白了,优化加权虽然理论最优,但对输入数据质量要求极高。

# 最大化ICIR的优化加权
import numpy as np
from scipy.optimize import minimize

def max_icir_weights(ic_matrix, lambda_reg=0.1):
    """
    ic_matrix: 各因子IC序列 (T x N)
    lambda_reg: 正则化系数
    """
    N = ic_matrix.shape[1]
    mu = ic_matrix.mean(axis=0)
    Sigma = np.cov(ic_matrix, rowvar=False)
    
    # 加入L2正则化
    Sigma_reg = Sigma + lambda_reg * np.eye(N)
    
    # 解析解
    w = np.linalg.solve(Sigma_reg, mu)
    w = w / np.sum(np.abs(w))  # 归一化
    
    return w

# 示例
ic_series = np.random.randn(100, 3)  # 100天,3个因子
optimal_weights = max_icir_weights(ic_series)
print(f"最优权重: {optimal_weights}")

四种方法对比总结

我画了一张图,把这四种方法的核心逻辑串起来,方便你理解它们之间的关系。

线性融合方法对比 等权加权 w_i = 1/N IC加权 w_i = IC_i / ΣIC IR加权 w_i = IR_i / ΣIR 优化加权 w* = Σ⁻¹μ 复杂度递增 → 优点对比 • 等权:最稳健,不易过拟合 • IC加权:简单有效,反映预测能力 • IR加权:兼顾预测能力和稳定性 • 优化加权:理论上最优,考虑因子间相关性 适用场景建议 • 等权加权:因子数量少(3-5个),或对稳定性要求极高 • IC加权:因子IC稳定,且历史数据充足(>1年) • IR加权:高频+低频混合场景,因子稳定性差异大 • 优化加权:因子数量多(>10个),且相关性结构清晰

我的最终建议:别一上来就用优化加权。先跑等权加权,再试试IR加权,看看效果。如果IR加权已经比等权加权有明显提升,那优化加权带来的边际收益可能并不大。毕竟,在量化交易里,简单的东西往往更可靠。


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