摘要:
量化研究就像烹饪美食,不同类型的数据好比各种食材,在入锅之前都需要洗菜、择菜,而对数据的洗择过程称之为数据预处理。根据不同类型的数据有不同的数据预处理方法,其中,针对因子研究,最常用的预处理方法就是:去极值、标准化和中心化。
本期将分别对上述三种常用的因子预处理方法的含义进行介绍,并使用优矿数据预处理函数对市盈率因子进行预处理。
一、去极值
为啥要去极值?
顾名思义,去极值就是排除一些极端值的干扰,为什么要排除极端值呢?为更好的帮助大家理解,本期邀请了著名的灵魂画手:
第一幅图是去极值的情况:对X与Y进行线性拟合,就可以清晰的发现X和Y之间的线性规律
第二幅图是保留极值的情况:图上部黄圈内是两个明显的极端值,如果未去极值直接进行线性回归,拟合出来的橘色线2明显无法很好的解释X和Y之间的规律。
因此,只有排除极端值的干扰,才能更好的发现数据之间的规律。
如何去极值呢?
第一步:找出哪些是极端值
第二步:处理这些极端值
第一步:
极端值的定义方法有很多,一般是先确定一个上下限,超出这个界限的就划为极端值,下面我们介绍经常使用的两种:3σ法和百分位法。
1、3σ法
3σ法源于最经典的统计学3σ原则,即正态分布的数分布在(μ-3σ,μ+3σ)中的概率为99.73%,在3σ外的概率是0.27%,也就是图中尾部的那些数。
其中μ代表平均值,σ是标准差,3σ去极值法其实就是把离平均值太远的值算作极端值,那么多远是远呢?距离超过3倍标准差以上的就是远了。
2、百分位法
百分位法是对所有的观察值按从小到大进行排序,最小的百分之X和最大的百分之X的人就是极端值,通常情况下,这个X一般取2.5,最小的2.5%和最大的2.5%相加,一共5%的数值被去除。
第二步:
处理的方法也有两种:截尾和缩尾
截尾:把找出的极端值直接去掉。
缩尾:所有大于上临界值的值全等于上临界值,所有小于下临界值的值全等于下临界值,相当于把超出临界值的点都拽回到边界上。
实际操作:
下面我们使用优矿的去极值函数winsorize进行演示:
优矿winsorize函数支持3σ和百分位法两种去极值方法,可以分别对相关参数进行调整。
以2019年8与15日的沪深300成分股市盈率因子数据为例:
核心代码如下:(完整代码请见文章结尾百度云链接)
pe['winsorized PE'] = winsorize(pe['PE'], win_type='NormDistDraw', n_draw=5)
其中,winsorized PE一列是去极值以后的结果,明显可以看到第三行-167.6097这个PE值太小了,为极端值,处理结果是-53.0572,说明优矿的去极值函数采用的是缩尾的极值处理方法。
为了更直观的观察去极值的效果,我们把上面的表格画成图像,蓝线是未去极值的PE数据,绿线是去极值之后的数据,可以看到去极值后,数据更为集中,这有利于我们继续研究发现数据背后的规律。
二、标准化
为啥要标准化?
标准化的目的是量级不同的数据可以放在一起比较。
举个例子,当我们研究股票价量关系对股票收益率的影响时,我们常会用到股价和成交额两个数据,一只股票的股价一般是几元或者几十元,A股最高价格的贵州茅台也就1000元,但是股票一天的成交额往往最少也有几百万,大盘股甚至有几十亿的成交额,如果不加任何处理直接把几十元的价格数据和几十亿元的成交额数据放在一起进行回归,那么股价的影响力量就很容易被掩盖,从而无法挖掘出正确的规律。
因此,需要使用一些方法把量级不同的数据放在同一个量级水平进行比较。
如何标准化?
标准化的方法较多,比如:
l 对数法:对股价和成交额求对数,相当于比较两者的增长率,增长率的值往往比较小,可以比较。
l min-max标准化:
(观察值 – 最小值)/(最大值 – 最小值)
这个方法有点类似之前百分数法,先把这组数据的最大值和最小值之差求出来,然后看观察值超出的最小值的值占大小之差的百分数,如果观察值是最大值,则这个值为1,如果是最小值,则为0,也就是所有观测者都会落在[0,1]之间。
l 本期主要介绍的是因子研究中最常用的
标准化方法——z-score
财务里也有一个z-score,是通过对各项财务指标加权求和得出破产指数,用来评估企业运行状况,和这里的z-score显然是不一样的。
z-score公式如下:
(观测值 – 平均值)/标准差
通过公式可以看到z-score是计算观测值和平均值的差是标准差的几倍。
为什么要除以标准差?计量上当讨论两个数的远近时,无法用绝对数进行衡量,比如相距一米算远吗?不一定,放在航程测量时,一米可以忽略不计,但是如果奥运射击赛场上,偏一米就射到别人靶上了,只有以衡量波动的标准差才能确定偏离的幅度是大是小。
除以了标准差,这个比率就会大幅缩小,正态分布在3个标准差以外的概率是0.27%,也就是说如果观测值服从正态分布,那么99.73%的观测值的z-score会落在[-3,3]区间之内。
标准化的z-score会围绕0上下波动,这个值大于0,说明观测值高于平均水平,反之亦然。
这个计算方法优点在于计算简便,但是如果总体均值、方差未知或是非正态分布时计算就可能出问题。
实操开始:
z-score计算公式非常简单,可以编写公式计算,也可以直接使用优矿提供的标准化函数standardize。
我们继续对之前去极值的市盈率因子进行标准化操作,得出的standardize PE一列就是标准化以后的市盈率因子。
从图像中也可以看到大部分数据都转化为大小在[-3,3]区间内的值。
三、中性化
与去极值和标准化两种处理手段相比,中性化在其他数据分析中并不是很常用。
为什么要中性化?
因子研究中的中性化其实就是起到一个提纯的作用。处理的问题有点类似于计量中对多重共线性。
以一个基础的线性模型为例:
Y = a0 + a1 * X1 + a2 * X2 + e
模型的目的是研究X1和X2两个因素对Y的影响,影响的大小其实就是求系数a1和a2的值,通常情况,通过最小二乘法就可以估计出a1和a2的值,但是如果X1和X2之间是相关的,比如两者存在这样的关系:
X1 = m1 * X2 + m2 * X3 +e
X1一部分是受X2的影响,另一部分是这个因素的独立影响因素,如果直接把X1的数据代入模型,估计出来的系数是不准的,因此要先把X1中有关X2的影响剔除出去,然后再带入模型之中,这个提纯的步骤就是中性化。
在实际中,两个最典型的中性化例子就是市值中性化和行业中性化。
比如日成交额这个数据,其实是受市值的影响很大,市值大的股票通常每日的成交额较大,如果同时将成交额和市值两个因子放入模型,就会出现多重共线性问题,无法准确估计出影响力的大小。
因此,代入模型之前先要对成交额因子提纯,排除市值的影响。具体方法是将成交额和市值进行线性回归,减去市值的影响,剩下的残差就是独立的影响因子。
同样,行业对因子的影响也很普遍,比如前期提到的股息率因子就受不同行业特征的影响,需要通过行业中性化先排除行业的影响,具体方法是将行业设为虚拟变量,本期这里就不细讲了。
实操开始:
优矿提供了一步式中性化函数neutralize,一步就可以剔除市值、行业等风格因子,完成中性化操作。
具体代码如下:
函数之中可以自行设置行业类型和不做中性化的因子列表两个参数。
l 行业类型可以选择是根据申万一级行业或是二级行业进行行业中性化操作。
l 排除一种列表是选择不做中性化处理的风格因子,可选'BETA'贝塔,'RESVOL'残差波动率,'MOMENTUM'动量,'SIZE'市值等,具体可以查看优矿帮助文档网页链接
重点:
获取完整代码请关注公众号:爱喝豆汁的量化投资者 微信号:investorSean
查看历史文章:第十期,文章尾部有代码链接,感谢支持
2019年8月16日
写于北京外国语大学
$上证指数(SH000001)$$沪深300(SH000300)$ $中证500(SH000905)$
@量化哥-优矿Uqer
不求取悦他人,但求愉悦自己
想了解更多请关注公众号:爱喝豆汁的量化投资者
微信号: investorSean
同步更新在雪球:
作者:爱喝豆汁的投资者
链接:https://xueqiu.com/2680567071/131257752