繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168财经网>人物频道>帖子

检测因子之间的多重共线性

作者/量化王者 2019-05-10 06:23 0 来源: FX168财经网人物频道

这是一个多重共线性检测函数的例子

背景知识:方差扩大(膨胀)因子法是通过考察给定的解释变量被方程中其他所有解释变量所解释的程度,以此来判断是否存在多重共线性的一种方法。方程中的每一个解释变量都有一个方差扩大(膨胀)因子(variance inflation factor,VIF),它反映的是多重共线性在多大程度上增大估计系数方差的指标。

注意:

该算法同样有一些限制,数据行数要大于条目数量,如日期序列数量要大于要分析的因子数量,  至于这东西有啥效果说不清,可以间接了解下,vif 同样可以使用相关系数矩阵求逆或者协方差逆矩阵的 .diagonal()方法得到,当然我只是知道并且实验结果貌似一样,但是很少见到这样的用法,并不确定是否有别的问题,包括可以通过检查特征值方式也可以,只不过误差更大,哦哦 话扯远了,继续谈这个问题,最大化IC/IR优化,就是通过对协方差矩阵求逆(因为行数如果小于列数时矩阵不可逆,因此就有了协方差矩阵压缩估计,这是另外的问题)作为权重 x IC,在我接触算法中最大化优化可以排到首要位置,因为算法简单快速,效果立竿见影,一般对最大化优化的介绍都回说这种方式同时考虑了信号强度,稳定性,相关性等,为此我做了个简单的小实验,在最大化优化求逆最后在加上 x (1/.diagonal()) 也就是,最小共线性加权,结果似乎对最大化优化没有任何影响,也许说明了最大化优化本身已经包含了对多重共线性的的处理。【也就是说如果你使用了最大化优化加权或者类似矩阵求逆等方式对因子相关性做了解释,那么就没必要在做多重共线性剔除】

更新:2019-2-09  该函数的最短版本

np.diag(np.linalg.inv(np.corrcoef(x, rowvar=0))


一些基本面因子是高度相关的,比如估值因子,PE,PB,PCF等相关度很高;成长性因子中,营收增长和利润增长的相关度很高;¶

分析师预期的增长速度,往往是目前数据的线性外推,跟最新的增长数据相关度也很高。多重共线性会造成参数估计的方差和置信区 间变大,假设检验容易作出错误的判断。从很多文章和例子中我们得知,最简单的办法就是计算因子相关系数矩阵,寻找强相关的因子剔除以避免这个问题,但是多重共线性和强相关并不是完全等比关系,所以这里试图给出一个标准的解决办法。

以下是一个基于 statsmodels 的相关性检测函数,貌似和 R语音 vif(方差膨胀系数)具有相似的结果,大体可以认为,因子的 vif 值大于 5-10 就可以认为该因子存在强烈多重共线性,一般做法是剔除。

from statsmodels.regression.linear_model import OLSdef vif(self):''' vif : variance inflation factors '''exog = self - np.nanmean(self,0);   variables = np.arange(exog.shape[1])vifs = np.r_[[OLS(exog[:,i], exog[:,variables!=i]).fit().rsquared for i in variables]]return 1/(1.-vifs)

下面获取实际股票数据¶

from jqfactor import Factor,calc_factors,winsorize,standardlize,get_factor_valuesstocks = get_index_stocks('000300.XSHG', date='2019-01-01')factors = ['VOL20', 'VOL60', 'VOL240','VSTD20','VMACD','turnover_volatility','AT*']start_date = '2018-01-01'end_date   = '2019-01-01'fvalues = {}for na in factors:fvalue = get_factor_values(stocks, na, start_date=start_date, end_date=end_date)[na]    fvalue = fvalue.fillna(fvalue.mean())fvalue = winsorize(fvalue, qrange=[0.05,0.93],inclusive=True,axis=1)       # 去极值fvalues[na] = standardlize(fvalue,axis=1)                                  # 标准化price = get_price(stocks, start_date=start_date, end_date=end_date, fields=['close'], fq='pre')['close']returns = price.pct_change().iloc[1:]returns = winsorize(returns, qrange=[0.03,0.97],inclusive=True,axis=1)       # 去极值
import pandas as pdfrom scipy import statsics = []for factor in factors:fvalue = fvalues[factor]ic = returns.fillna(returns.mean()).apply(lambda row: stats.pearsonr(row, fvalue.loc[row.name])[0],axis=1,)ics.append(ic)ic = pd.concat(ics, axis=1, keys=factors)IC = ic.values                        # 取出IC
v1 = vif(IC)v1
array([65.02495713, 44.1501352 , 17.78896889,  2.58317267,  1.11742527,
       21.44855175,  4.5050331 ])
从上面结果可以清晰的看到 第1,2,6号因子存在强共线性。剔除后剩余4个因子
np.array(factors)[v1<20]
array(['VOL240', 'VSTD20', 'VMACD', 'AT*'], dtype='<U19')
分享到:
举报财经168客户端下载

全部回复

0/140

投稿 您想发表你的观点和看法?

更多人气分析师

  • 张亦巧

    人气2144文章4145粉丝45

    暂无个人简介信息

  • 梁孟梵

    人气2152文章3177粉丝39

    qq:2294906466 了解群指导添加微信mfmacd

  • 指导老师

    人气1856文章4423粉丝52

    暂无个人简介信息

  • 李冉晴

    人气2296文章3821粉丝34

    李冉晴,专业现贷实盘分析师。

  • 刘钥钥1

    人气2016文章3119粉丝34

    专业从事现货黄金、现货白银模似实盘操作分析指导

  • 张迎妤

    人气1896文章3305粉丝34

    个人专注于行情技术分析,消息面解读剖析,给予您第一时间方向...

  • 金泰铬J

    人气2320文章3925粉丝51

    投资问答解咨询金泰铬V/信tgtg67即可获取每日的实时资讯、行情...

  • 金算盘

    人气2696文章7761粉丝125

    高级分析师,混过名校,厮杀于股市和期货、证券市场多年,专注...

  • 金帝财神

    人气4728文章8329粉丝118

    本文由资深分析师金帝财神微信:934295330,指导黄金,白银,...