跳到正文

因子衰减:为什么你的信号优势随时间消失

Alpha 因子不会永远持续。因子衰减描述信号预测力如何随更多参与者交易而减弱。以下是如何测量和预测衰减。

第 6 篇 · 共 10 篇 约 3 分钟

量化金融的历史充满了在数年表现出色然后崩溃的因子。价值在 1980 和 1990 年代表现出色,然后在 2000 年代显著下降。动量在 1990 年代有效,在 2000 年代崩溃,在 2010 年代回归。

每个因子都会衰减。问题是:多快,能做什么?

为什么因子会衰减

竞争: 当因子被发现并被许多基金交易时,套利活动消除了它所利用的错误定价。优势消失。

市场微观结构变化: 十进制化、高频交易和市场结构变化可能使某些因子过时。基于 1990 年代有效的买卖价差反弹的因子在电子市场时代可能无效。

结构性变化: 在高波动结构性有效的因子可能在低波动结构性无效。市场结构性变化时,因子有效性也变化。

数据挖掘: 回测中发现的许多「因子」从来不是真正的优势——它们是统计伪影,一旦你交易就消失。

测量因子衰减

测量衰减的正确方法是查看作为收益衡量范围的函数的 IC(信息系数)。

对于范围 h(天):

IC(h)=corr(factor_valuet,returnt→t+h)IC(h) = \text{corr}(factor\_value_t, return_{t \to t+h})

绘制 h = 1, 5, 10, 20, 60 天的 IC(h)。这个曲线的形状告诉你关于你的因子:

快速衰减(IC 在 h=1 急剧下降): 因子预测力非常短暂。可能是捕获微观结构噪声而非基本信号。高换手率的交易成本可能会侵蚀优势。

慢速衰减(IC 在 h=20+ 保持稳定): 因子捕获持久的基本关系。这是你想要的那种因子。

半衰期概念

来自信号处理的有用概念:因子的 半衰期 是 IC(h) = 0.5 × IC(1) 的范围 h。

例如,如果 IC(1) = 0.04 且 IC(10) = 0.02,半衰期约为 10 天。

半衰期 < 5 天的因子是微观结构驱动的。需要极低的交易成本才可行。半衰期 > 20 天的因子更稳健。

为什么时间范围对策略设计重要

如果你的因子快速衰减(半衰期 = 3 天),你需要频繁再平衡以捕获信号。但频繁再平衡意味着高交易成本。净优势可能为零或负。

如果你的因子慢速衰减(半衰期 = 30 天),你可以每月再平衡仍然捕获大部分信号。更低交易成本,更多净优势。

这就是为什么 信号半衰期是策略设计的关键输入。 不要围绕半衰期 2 天的因子设计周再平衡组合。

在 Python 中计算因子衰减曲线

import numpy as np
from scipy.optimize import curve_fit

def fit_decay_curve(ic_by_horizon, horizons):
    """
    拟合 IC 随范围衰减的指数曲线。

    IC(h) = IC_0 * exp(-lambda * h)
    半衰期 = ln(2) / lambda
    """
    def decay_fn(h, ic0, lam):
        return ic0 * np.exp(-lam * h)

    popt, _ = curve_fit(decay_fn, horizons, ic_by_horizon, p0=[ic_by_horizon[0], 0.1])
    ic0, lam = popt
    half_life = np.log(2) / lam

    return {
        'ic0': ic0,
        'lambda': lam,
        'half_life': half_life
    }


def compute_ic_by_horizon(factor_values, returns, max_horizon=60):
    """
    计算多个范围的 IC。

    对每个范围 h,将时间 t 的因子值与 t+h 的收益对齐,
    计算跨资产的相关系数。
    """
    ic_by_horizon = []
    horizons = list(range(1, max_horizon + 1))

    for h in horizons:
        aligned_factors = []
        aligned_returns = []

        for i in range(len(factor_values) - h):
            fv = factor_values.iloc[i]
            ret = returns.iloc[i + h]

            common = fv.index.intersection(ret.index)
            if len(common) > 10:
                aligned_factors.extend(fv[common].values)
                aligned_returns.extend(ret[common].values)

        if len(aligned_factors) > 30:
            ic = np.corrcoef(aligned_factors, aligned_returns)[0, 1]
            ic_by_horizon.append(ic)
        else:
            ic_by_horizon.append(np.nan)

    return np.array(ic_by_horizon), np.array(horizons)


def analyze_decay(factor_values, returns, max_horizon=60):
    """
    综合衰减分析。
    """
    ic_by_horizon, horizons = compute_ic_by_horizon(factor_values, returns, max_horizon)

    # 过滤 NaN
    valid = ~np.isnan(ic_by_horizon)
    ic_valid = ic_by_horizon[valid]
    h_valid = horizons[valid]

    if len(ic_valid) < 5:
        return {'error': 'Insufficient data'}

    # 拟合衰减曲线
    decay_result = fit_decay_curve(ic_valid, h_valid)

    # 计算每个范围的 IC
    results = {
        'ic_by_horizon': dict(zip(h_valid, ic_valid)),
        'half_life': decay_result['half_life'],
        'ic_initial': decay_result['ic0'],
        'decay_rate': decay_result['lambda']
    }

    return results

衰减对因子组合的影响

组合因子时,衰减曲线影响权重:

def decay_adjusted_weights(factor_decay_dict, decay_profile):
    """
    根据衰减曲线调整因子权重。

    衰减慢的因子应获得更高权重,
    因为它们在低再平衡频率下仍然有效。
    """
    weights = {}
    for name, decay in decay_profile.items():
        half_life = decay['half_life']
        ic_initial = decay['ic_initial']

        # 权重与半衰期和初始 IC 成正比
        score = ic_initial * half_life
        weights[name] = score

    total = sum(weights.values())
    if total > 0:
        weights = {k: v / total for k, v in weights.items()}

    return weights

常见错误

报告 IC(1) 但以月再平衡交易。 如果你在日频测量 IC 但以月频再平衡,你没有捕获你测量的信号。在你实际使用的再平衡频率上测量 IC。

组合因子时忽略衰减。 如果你组合快速衰减因子(半衰期 = 5 天)和慢速衰减因子(半衰期 = 30 天),在月再平衡组合中慢速衰减因子应获得更多权重。等权重忽略了衰减差异。

将噪声与信号混淆。 h=1(每日)时非常高的 IC 通常反映微观结构——买卖价差反弹、短期反转等——不是真正的预测信号。检查 IC(5) 和 IC(10) 是否仍然显著。

将衰减与死亡混淆。 因子可能衰减到新的均衡水平并保持稳定。这不是「死亡」——这是正常竞争。如果你看到 IC 从 0.05 衰减到 0.02 并稳定,这可能是因子的新均衡。

在知识体系中的位置

因子衰减是组合构建的关键输入。Turnover analysis 测量你的组合在不同时间范围的排名变化程度。因子组合应根据衰减曲线加权因子。Regime detection 识别衰减加速的时期(市场结构变化或危机)。

参考文献

  • López de Prado, Advances in Financial Machine Learning, 第 4 章. Wiley, 2018. ISBN: 978-1-119-48208-6.
  • Ang, Asset Management, 第 9 章. Oxford University Press, 2014. ISBN: 978-0-19-995932-3.
  • Hsu, “What Factor Models Work in Real Markets?” Journal of Portfolio Management, 2016.