单因子ic分析的代码实现

01 因子的ic分析

多数研报里,都会对因子做ic分析。ic分析有成熟的库是alphalens。

alphalens的使用(除了整理数据之外),其实非常简单,就是调用1行代码即可,但我们更重要是搞清楚背后的计算逻辑——其实也不复杂。

使用一个库的前提是,你得知道它的实现逻辑。现在很多框架和库都是开源,这个倒是比较方便。当然最有效的办法是,自己照着代码实现一遍。之前计算风险、收益指标我自己用pandas计算了无数次,后来改成用empyrical,还可以相互验证。

前边的文章已经有介绍。

因子特征工程:alphalens库深度解析

【每周研报复现】AI量化特征工程之alphalens:一套用于分析 alpha 因子的通用工具

qlib框架里自己实现了因子分析的的逻辑,代码比较简洁,可以看看。

def calc_ic(pred: pd.Series, label: pd.Series, date_col="datetime", dropna=False) -> Tuple[pd.Series, pd.Series]:

    df = pd.DataFrame({"pred": pred, "label": label})
    ic = df.groupby(date_col).apply(lambda df: df["pred"].corr(df["label"]))
    ric = df.groupby(date_col).apply(lambda df: df["pred"].corr(df["label"], method="spearman"))
    if dropna:
        return ic.dropna(), ric.dropna()
    else:
        return ic, ric

逻辑很简单,就是预测列pred与标签列label(按天分组groupby(date_col)之间的相关系数。

默认是皮尔森(pearson)相关系数,也就是通常咱们统计学里学的那个相关系数,即协方差/各自标准差之积。

图片

ric=rank ic,即秩相关系数(spearman)。rank IC和IC唯一的不同点就是在求相关系数时,换成秩相关系数,即: rank IC: t 期的因子载荷(因子值)的排序值和 t+1 期的因子收益的排序值之间的相关系数。

求IC两个必要条件就是求到因子值和下一期的股票收益,我们对这两列求相关系数就可以得到该因子在当前股票池范围内的IC值。

单日IC值波动是比较大的,所以在图中提供了IC的月度移动平均线作为参考,而因子的有效性也是通过IC值均值来判断,当IC值均值大于0.03,可以说该因子是有效因子。——注:当样本股票过少时,IC是没有统计意义的。

symbols = ['N225', '000300.SH', 'ADX', '000905.SH', '399673.SZ', 'HSI', 'GDAXI']
from engine.datafeed.dataloader import Dataloader

names = []
fields = []
names += ['roc20']
fields += ['$close/Ref($close,20)-1']

names += ['slope20']
fields += ['Slope($close,20)']

periods = [1, 5, 10, 20]
for p in periods:
    names += ['return_{}'.format(p)]
    fields += ['Ref($close,-{})/$close-1'.format(p)]

df = Dataloader().load_one_df(symbols, names, fields)
df['date'] = df.index
print(df)

for p in periods:
    for f in ['roc20', 'slope20']:
        ic, ric = calc_ic(df[f], df['return_{}'.format(p)], date_col='date')
        print('未来{}天收益,因子:{},ric均值:{}, 风险调整ric:{}'.format(p, f, ric.mean(), ric.mean() / ric.std()))

我们对比两个因子,一个是20日动量,另一个是20日斜率,两个因子都有效。但综合看来,slope20更加有效一些,我们看它对于未来1天,5天,10天,20天的效果。

未来10天收益,因子:roc20,ric均值:0.0515329490574856, 风险调整ric:0.09067399805212739

未来10天收益,因子:slope20,ric均值:0.056021187100794526, 风险调整ric:0.09941842670553885

当然,综合对比来看,20天动量,预测性最好的周期是10天,也就是两周

所以,我们应该按照两周来轮动。

代码在alpha_utils里,大家可前往星球-量化专栏下载

图片

图片

 

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/104192
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注