#因子合成的实践和方法
使用GPlean训练出来的一些因子表达式存在很高的相关性,当卡掉相关性以后我们要做因子合成来提高信息的有效性,这次介绍一些常见的合成方法。
1.1 因子相关性处理
这一步的核心在于我们如何发现刻画并解决因子间的多重共线性(风格集中暴露)的问题。并最终实现alpha之间相互对冲关系。
首先是识别共线性问题,可以使用VIF检验
VIF检验(方差膨胀因子检验)
VIF(Variance Inflation Factor) 是用于量化回归模型中自变量之间多重共线性严重程度的指标。它衡量了由于自变量之间的相关性,导致回归系数估计的方差(不确定性)增大的倍数。核心思想:如果自变量之间高度相关,模型参数估计的方差会显著增大,导致结果不稳定,难以解释。
那么如何处理共线性问题呢,分为2种:
1、删除变量:移除VIF过高的冗余变量(需结合业务意义)。
2、正交化处理:通过施密特正交或者对称正交删除重复表达信息。
参考代码
# VIF检验
ic_df_pass = ic_df_test[factor_names_pass]
VIF = {}
for i in tqdm(ic_df_pass.columns.tolist()):
y = ic_df_pass[i]
x = ic_df_pass.drop(i,axis = 1)
VIF[i] = 1 / (1 - sm.OLS(y.astype(float),x.astype(float),hasconst=False, missing='drop').fit().rsquared)
VIF = pd.DataFrame([VIF]).T
VIF.columns = ['VIF']
VIF.sort_values(by = 'VIF',ascending=False)
1.2 加权等权合成
上图是生成出来的因子表达式的累计IC图,我们要合成一个因子可以卡一个相关性,如下图:
得到低相关的因子后,做一个等权操作,参考代码如下:
# 等权
combo_ew = pd.DataFrame()
for i in factor_names:
df = value_dict_train[i]
combo_ew = combo_ew.add(standardize(df),fill_value=0)
等权可以得到以上效果,我们在做一个IC/IR加权看看。
不同的因子过往预测的能力有所区别,具体体现在IC 或者 IR 的不同上。因此对于模型的贡献权重也应该需要进行调整,给有更高IC 或 IR 的因子更高的权重。
计算方法:滚动过去N期的IC序列计算因子IC mean 或者 IR 表现,作为权重
缺点:不同类型的因子IC 或 IR 上有较大区别。例如基本面因子和量价因子,量价因子的IR普遍偏高。容易高估模型的对于量价因子的权重。
如果做加权,训练的时候一定要做多期滚动,不然会有未来函数。
以下是回测曲线:
1.3 后续研究方向
1.可以使用聚类算法进行因子分类在合成,比如等权加权
2.使用机器学习进行因子合成