4. IC的时间序列分析:IC的时序图、IC的自相关性、IC的平稳性检验、IC的周期性与季节性
各位同学,咱们今天聊点硬核的。因子IC分析做到一定程度,你会发现一个尴尬的事实:光看IC的均值和中位数,根本不够用。
为什么?因为IC本身是一个时间序列。它今天高、明天低,后天又回来——这背后的规律,才是我们真正要挖的矿。我个人习惯把IC的时间序列分析称为「因子体检报告」,它能告诉你这个因子到底有没有「心脏病」或者「神经衰弱」。
4.1 为什么要看IC的时序图?
先问个问题:你见过IC的走势图吗?
很多新手拿到因子,第一件事就是算IC均值。0.05,不错,正收益。然后直接上策略。结果实盘一跑,亏得亲妈都不认识。
为什么?因为IC均值0.05,可能前半年是0.15,后半年是-0.05。你刚好踩在了后半段。
IC时序图,说白了就是把IC值按时间画成一条线。它能直观告诉你:
- 因子表现是否稳定?
- 有没有明显的趋势或突变?
- 是否存在某些时间段因子完全失效?
我在项目中遇到过一件事:有个因子IC均值0.06,看起来不错。但一画时序图,发现2020年3月到6月IC连续为负。那段时间正好是疫情后的反弹行情,因子完全失效。如果只看均值,你根本不知道这个坑。
核心观点:IC时序图是因子分析的「第一道防线」。不看时序图,别谈因子质量。
4.2 IC的自相关性:因子会「惯性」吗?
好,时序图画出来了。接下来我们要问:今天的IC和昨天的IC有关系吗?
这就是IC的自相关性。说白了,就是看IC序列是否存在「记忆效应」。
你想想看,如果一个因子今天的IC很高,明天大概率也高——那这个因子就有正自相关。反过来,如果今天高明天就低,那就是负自相关。
为什么这个重要?因为自相关性直接影响你的换仓频率和风险控制。
- 正自相关:IC有趋势,可以适当降低换仓频率,吃趋势的钱。
- 负自相关:IC来回震荡,适合高频换仓,或者做反转策略。
- 无自相关:IC是白噪声,老老实实按均值做就行。
计算自相关很简单,用Python的autocorr函数就行:
import pandas as pd
import numpy as np
# 假设ic_series是你的IC时间序列
ic_series = pd.Series(np.random.randn(100))
# 计算滞后1期的自相关系数
lag1_autocorr = ic_series.autocorr(lag=1)
print(f"滞后1期自相关系数: {lag1_autocorr:.4f}")
# 画自相关图
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(ic_series, lags=20)
我曾经遇到一个因子,自相关系数高达0.6。一开始我还挺高兴,觉得有趋势。结果仔细一看,是因为因子本身有严重的行业暴露,导致IC被行业因子「绑架」了。嗯,这里要注意:自相关高不一定是好事,要排除结构性因素。
小技巧:一般看滞后1-5期的自相关系数就够了。如果滞后5期还有显著自相关,说明因子有较长的记忆效应,需要警惕过拟合。
4.3 IC的平稳性检验:因子会「变心」吗?
自相关看完了,下一个问题:IC序列是平稳的吗?
平稳性,说白了就是IC的统计性质(均值、方差)会不会随时间变化。如果IC的均值从0.05慢慢漂移到-0.02,那这个因子就是非平稳的。
非平稳的因子很危险。因为你用历史数据算出来的IC均值,对未来完全没有参考价值。
常用的检验方法是ADF检验(Augmented Dickey-Fuller test):
from statsmodels.tsa.stattools import adfuller
# ADF检验
result = adfuller(ic_series.dropna())
print(f"ADF统计量: {result[0]:.4f}")
print(f"p值: {result[1]:.4f}")
if result[1] < 0.05:
print("IC序列平稳,因子表现稳定")
else:
print("IC序列非平稳,因子可能存在结构性变化")
我记得有一次,一个同事跑过来跟我说他的因子IC均值0.08,特别兴奋。我让他做ADF检验,p值0.3。后来一查,因子在2018年之前表现很好,2019年之后就不行了。这就是典型的非平稳——均值发生了漂移。
避坑指南:我曾经因为没做平稳性检验,把一个「伪因子」上线了三个月。结果那三个月IC持续为负,亏了不少钱。从那以后,ADF检验成了我的必选项。
4.4 IC的周期性与季节性:因子也有「生物钟」
最后,我们聊聊IC的周期性和季节性。这个很多人会忽略,但实战中特别重要。
什么叫周期性?就是IC每隔一段时间会重复某种模式。比如:
- 月度效应:某些因子在月初表现好,月末表现差。
- 季度效应:季报披露前后,基本面因子IC会显著提升。
- 年度效应:春节前、国庆后,某些因子会有规律性变化。
季节性更具体一些,比如:
- 低波动因子在每年1月表现特别差(因为1月效应)。
- 动量因子在每年12月容易反转(因为机构调仓)。
怎么检测周期性?可以用周期图(Periodogram)或者自相关函数的多期分析:
from scipy.signal import periodogram
# 计算周期图
freq, power = periodogram(ic_series.dropna())
# 找到功率最大的周期
max_period = 1 / freq[np.argmax(power)]
print(f"IC序列的主要周期: {max_period:.2f} 个交易日")
我个人习惯把IC按月份分组,画一个箱线图。这样一眼就能看出哪些月份因子表现好,哪些月份表现差。
举个例子,我曾经分析过一个「换手率因子」,发现它在每年3月、6月、9月、12月(季末)IC特别高。后来一查,是因为机构在季末有调仓需求,换手率因子正好捕捉到了这个行为。这就是典型的季节性。
实战建议:如果你发现因子有显著的周期性或季节性,可以考虑做「择时」——在因子表现好的时间段加大权重,表现差的时间段降低权重。但注意,不要过度拟合历史数据。
4.5 本章知识体系总览
说了这么多,咱们用一张图来总结一下IC时间序列分析的核心逻辑:
这张图把IC时间序列分析的四个维度串起来了。你想想看,从时序图到自相关,再到平稳性,最后到周期性——这是一个层层递进的过程。每一步都在回答一个核心问题:这个因子到底靠不靠谱?
好了,关于IC的时间序列分析就聊到这里。记住,别只看均值,多画画图、做做检验。这些看似繁琐的步骤,往往能帮你避开大坑。
公众号:蓝海资料掘金营,微信deep3321