信息系数(IC,Information Coefficient)时间序列起作用需要其后的一系列数理统计分析。
这里尝试基于开源资料,尝试还原和梳理这一分析过程,并给出计算示例代码。
1 数理分析
1.1 描述性统计
这里主要探索一阶与二阶矩,这是最基础的统计量,用于刻画IC序列的中心位置和离散程度。
1)算术均值(Mean)
ic.mean(),衡量IC的平均水平,反映因子的平均预测能力。
2)样本标准差(Std)
ic.std(),Pandas默认使用样本标准差,分母为n-1。
std衡量IC的波动性,代表因子收益率的稳定性风险。
3)极值(Min/Max):
ic.min()/ic.max(),反映因子在历史上最好和最差的表现区间。
1.2 信息比率
信息比率是风险调整后绩效指标,包括ICIR。
ICIR(Information Coefficient Information Ratio),这时标准化均值的概念,计算公式为:
ICIR衡量单位波动风险所能获得的超额预测能力。
一般会在代码中额外添加1e-10用于数值稳定化处理,防止标准差为0时引发除零错误。
1.3 显著性检验
这里主要指统计推断与假设检验,包括统计量、小样本截断处理。
1)t统计量(单样本t检验)
计算公式为
分母即为均值标准误(Standard Error of the Mean, SEM)
依据中心极限定理(CLT),用于检验原假设总体均值是否显著不为0。
该统计量不仅反映IC的绝对值大小,还综合考虑了样本量n带来的估计精度。
2)小样本截断处理
这是一个基于大数定律和统计稳健性的启发式规则。
if len(ic) < 5: return nan
样本量过小时,t检验功效不足,且高阶矩(如峰度)估计极不可靠,因此直接返回空值。
1.4 分类/伯努利分布
分类/伯努利分布主要用于估计方向准确率。
比如Hit Rate(命中率),计算IC为正值的周期占比。
这属于符号检验(Sign Test)的思想,将连续的IC值映射为正确方向的二值变量(伯努利分布)。
它不依赖IC的幅度,能稳健地反映因子择时方向的准确度。
1.5 分布形状特征
分布形状特征,比如高阶矩
1)偏度(Skewness):
stats.skew(),计算三阶中心矩除以标准差的三次方,衡量分布的非对称性。
正偏表示IC右尾较长(存在极端大正收益),负偏则相反。
2)峰度(Kurtosis)
stats.kurtosis()
这里默认采用Fisher峰度(即正态分布的峰度定义为0),计算四阶中心矩除以方差平方再减3。
若峰度 > 0,表明分布具有尖峰厚尾特征,意味着IC存在更多极端值(极好或极差表现),这对投资组合的风险管理至关重要。
1.6 数据预处理
1)缺失值处理
dropna()移除NaN,确保所有统计函数在纯净数值序列上运行。
2)数值稳定性(EPS正则化)
在除法和t统计计算中引入 `1e-10`,属于岭回归正则化思想应用,避免浮点数溢出或除零异常。
3)返回值维度
返回字典包含n_periods,即统计推断中对自由度(Degrees of Freedom)和样本量。
使用者可据此评估统计结果的置信度。
2 代码示例
以下是上述数理分析的代码示例
def compute_ic_summary(ic_series: pd.Series) -> Dict[str, float]:
"""
Summary statistics for an IC time series.
Returns dict with:
mean_ic, std_ic, icir (IC IR = mean/std), t_stat,
hit_rate (% positive), skew, kurtosis, min, max
"""
ic = ic_series.dropna()
if len(ic) < 5:
return {k: np.nan for k in [
"mean_ic", "std_ic", "icir", "t_stat",
"hit_rate", "skew", "kurtosis", "min_ic", "max_ic", "n_periods"
]}
mean_ic = ic.mean()
std_ic = ic.std()
icir = mean_ic / (std_ic + 1e-10)
t_stat = mean_ic / (std_ic / np.sqrt(len(ic)) + 1e-10)
hit_rate = (ic > 0).sum() / len(ic)
return {
"mean_ic": mean_ic,
"std_ic": std_ic,
"icir": icir,
"t_stat": t_stat,
"hit_rate": hit_rate,
"skew": stats.skew(ic.values),
"kurtosis": stats.kurtosis(ic.values),
"min_ic": ic.min(),
"max_ic": ic.max(),
"n_periods": len(ic),
}
该函数不仅给出了IC的平均水平,还通过标准差、t值、峰度、命中率等刻画因子预测能力稳定性、显著性和极端风险,这正是量化多因子模型中因子筛选与加权所依赖的核心依据。
reference
IC测试与因子有效性检验实例