3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这是一个非常经典且常见的单因子分析疑问。在 JoinQuant 的 analyze_factor 函数中,设置 weight_method='avg'(等权)或 weight_method='mktcap'(市值加权)后,得到的 clean_factor_data 和 ic 序列完全一样,这并不是代码或系统出了问题,而是由单因子分析的数学逻辑决定的。
以下是详细的原因解析:
ic 序列是一样的?IC(Information Coefficient,信息系数)衡量的是“因子值”与“股票未来收益率”之间的截面相关性(通常使用 Spearman 秩相关系数 Rank IC)。
clean_factor_data 是一样的?clean_factor_data 是一个经过清洗和对齐的基础数据表(DataFrame),它主要包含以下信息:
结论:这个表是用来做后续所有收益和 IC 计算的底层基础数据。weight_method 参数决定的是“如何利用这些基础数据去计算分组收益”,而不是去改变基础数据本身。因此,底层清洗好的因子值和收益率数据自然是完全相同的。
weight_method 到底影响了什么?weight_method 参数(加权方式)真正影响的是分位数投资组合的收益率计算。具体来说,当你调用以下属性时,你会发现它们的数据是截然不同的:
far.mean_return_by_quantile(按分位数分组加权平均因子收益)far.mean_return_std_by_quantile(按分位数分组加权因子收益标准差)far.mean_return_spread_by_quantile(最高分位减最低分位收益)far.calc_cumulative_return_by_quantile()(各分位数每日累积收益)举个例子:
假设第一分位数(Q1)里有两只股票:A(市值100亿,涨停10%)和 B(市值1000亿,跌停-10%)。
weight_method='avg'(等权):Q1 的当日收益率是 (10% + -10%) / 2 = 0%。weight_method='mktcap'(市值加权):B 的权重是 A 的 10 倍,Q1 的当日收益率会被 B 严重拖累,变成约 -8.18%。你可以尝试打印 far.mean_return_by_quantile,就能明显看到 avg 和 mktcap 带来的数据差异了。