因子半衰期模型:指数衰减模型、半衰期计算、实际案例
好,咱们接着聊因子衰减。上一章我们讲了因子衰减的几种常见形态,这一章我重点说说怎么量化这个衰减过程。说白了,就是给因子的“寿命”定个标尺。
我个人习惯用半衰期模型来做这件事。为什么?因为它直观,而且计算起来不复杂。你想想看,一个因子从有效到失效,不是突然“啪”一下就没用了,而是慢慢衰减的。半衰期就是衡量这个“慢慢”到底有多慢。
指数衰减模型:最常用的假设
在实际量化工作中,我们最常假设因子的预测能力是按指数形式衰减的。这个假设不是拍脑袋,而是有实证基础的。我在项目中测试过几十个因子,大部分都符合这个规律。
指数衰减的数学表达式很简单:
IC(t) = IC₀ × exp(-λ × t)
其中:
- IC(t):t时刻的IC值
- IC₀:初始IC值(刚构建时的预测能力)
- λ:衰减速率常数
- t:时间(通常以月或交易日为单位)
嗯,这里要注意一点:λ越大,衰减越快。这个参数就是我们后面计算半衰期的关键。
核心理解:指数衰减模型的核心假设是——因子的预测能力每过一个固定时间,就衰减到原来的一半。这个“固定时间”就是半衰期。
半衰期计算:从λ到T₁/₂
半衰期(Half-life,记作T₁/₂)的计算其实就一个公式:
T₁/₂ = ln(2) / λ ≈ 0.693 / λ
举个例子:假设你算出一个因子的λ=0.1(按月计),那么它的半衰期就是0.693/0.1 ≈ 6.93个月。也就是说,大约7个月后,这个因子的预测能力就只剩下一半了。
我曾经踩过一个坑:直接用日频数据算λ,然后换算成月频半衰期。结果发现算出来的半衰期特别短,只有几天。后来才意识到,日频数据噪声太大,需要先做平滑处理。这个教训让我养成了一个习惯——计算半衰期前,先看数据的时间尺度是否匹配。
实用技巧:如果你用Python做回测,可以用scipy的curve_fit来拟合指数衰减曲线,直接得到λ和半衰期。代码大概长这样:
import numpy as np
from scipy.optimize import curve_fit
def exp_decay(t, ic0, lam):
return ic0 * np.exp(-lam * t)
# 假设你有时间序列t和对应的IC值ic_values
t = np.array([0, 1, 2, 3, 4, 5, 6]) # 月份
ic_values = np.array([0.08, 0.065, 0.05, 0.04, 0.03, 0.025, 0.02])
params, _ = curve_fit(exp_decay, t, ic_values, p0=[0.08, 0.1])
ic0_fit, lam_fit = params
half_life = np.log(2) / lam_fit
print(f"拟合初始IC: {ic0_fit:.4f}")
print(f"衰减速率λ: {lam_fit:.4f}")
print(f"半衰期: {half_life:.2f} 个月")
这段代码我用了好几年,基本没出过问题。不过要提醒一句:拟合前最好把异常值剔除掉,不然结果会偏得离谱。
实际案例:一个动量因子的半衰期分析
说个真实案例吧。去年我帮一家私募做因子诊断,他们有一个12个月动量因子,回测表现一直不错,但最近半年突然失效了。我拿到数据后,第一件事就是算半衰期。
数据是这样的(按月统计):
| 月份 | Rank IC | 累积衰减比例 |
|---|---|---|
| 0(构建时) | 0.082 | 0% |
| 1 | 0.071 | 13.4% |
| 2 | 0.063 | 23.2% |
| 3 | 0.055 | 32.9% |
| 4 | 0.048 | 41.5% |
| 5 | 0.042 | 48.8% |
| 6 | 0.036 | 56.1% |
用上面的代码拟合后,得到λ≈0.12,半衰期≈5.8个月。这意味着什么?这个因子在构建后的第6个月,预测能力已经跌了一半以上。而他们还在用12个月的持仓周期,难怪会失效。
避坑指南:我曾经见过有人把半衰期当成固定值,一年都不更新。这是大忌!市场环境在变,因子的半衰期也在变。我建议每季度重新计算一次,动态调整。
后来我给他们的建议是:把调仓周期从12个月缩短到6个月,同时加入半衰期预警机制——当因子IC衰减到初始值的30%以下时,自动触发调仓。调整后,这个因子的夏普比率从0.6回升到了1.2左右。
半衰期模型的局限性
说实话,指数衰减模型也不是万能的。我在实际工作中发现几个问题:
- 非线性衰减:有些因子不是平滑衰减的,而是先快速下降,然后趋于平稳。这时候用指数模型拟合,误差会比较大。
- 市场冲击:当大量资金都盯着同一个因子时,它的衰减速度会突然加快。这就是所谓的“拥挤效应”。指数模型没法捕捉这种突变。
- 周期性复苏:有些因子在衰减一段时间后,会因为市场风格切换而重新有效。指数模型假设的是单调衰减,处理不了这种情况。
所以我的建议是:把半衰期模型当作一个参考工具,而不是绝对真理。用它来指导调仓节奏,但别完全依赖它。
下面这张图展示了指数衰减模型的核心逻辑,我画了个简单的流程图:
好了,关于半衰期模型就聊这么多。记住一句话:因子半衰期不是算出来就完事了,关键是怎么用它来指导调仓。下一章我会详细讲动态调仓的具体实现,到时候会用到今天讲的这些内容。
本章要点:
- 指数衰减模型是量化分析中最常用的因子衰减假设
- 半衰期 = ln(2)/λ,计算简单但要注意数据尺度
- 实际案例表明,半衰期分析能有效指导调仓周期优化
- 模型有局限性,需要结合市场环境动态调整
公众号:蓝海资料掘金营,微信deep3321