01 因子的ic分析
多数研报里,都会对因子做ic分析。ic分析有成熟的库是alphalens。
alphalens的使用(除了整理数据之外),其实非常简单,就是调用1行代码即可,但我们更重要是搞清楚背后的计算逻辑——其实也不复杂。
使用一个库的前提是,你得知道它的实现逻辑。现在很多框架和库都是开源,这个倒是比较方便。当然最有效的办法是,自己照着代码实现一遍。之前计算风险、收益指标我自己用pandas计算了无数次,后来改成用empyrical,还可以相互验证。
前边的文章已经有介绍。
【每周研报复现】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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!