对于量化研究而言,拿到一份基础数据,首先需要对数据做预处理,以便于更好的探究数据规律,基于不同目标有不同处理环节,其中去极值、标准化、中性化这三点经常被放在一起讨论。整理网络资料,理解如下。
-
去极值
数据(单个因子的时间序列数据)中存在异常值,可能会导致拉大标准差、拉偏统计规律…
常规处理理念就是确定此数据指标(比如某个因子)的上下限阈值,然后超过(或低于)此限度的数据均设置为阈值,以提高数据结论的准确性。
上下限的判定方法有三种:MAD、 3 σ 3\sigma 3σ法、百分位法。
-
MAD(Median Absolute Deviation, 绝对值差中位数法)
MAD,先计算所有因子与平均值之间的距离总和来检测离群值。
-
计算所有因子的中位数 X m e d i a n X_{median} Xmedian
-
计算每个因子与中位数的绝对偏差值 X i − X m e d i a n X_i-X_{median} Xi−Xmedian
-
计算绝对偏差值的中位数 M A D MAD MAD
-
确定参数 n n n,从而确定合理的范围为 [ X m e d i a n − n ∗ M A D , X m e d i a n + n ∗ M A D ] [X_{median}-n*MAD,X_{median}+n*MAD] [Xmedian−n∗MAD,Xmedian+n∗MAD],针对超出合理范围的值做如下调整:
X i ′ = { X m e d i a n + n ∗ M A D        i f    X i > X m e d i a n + n ∗ M A D X m e d i a n − n ∗ M A D        i f    X i < X m e d i a n − n ∗ M A D X i                                                              i f    X m e d i a n − n ∗ M A D < X i < X m e d i a n + n ∗ M A D X_i'=\begin{cases}X_{median}+n*MAD\;\;\;if \;X_i>X_{median}+n*MAD\\X_{median}-n*MAD\;\;\;if\;X_i<X_{median}-n*MAD \\ X_i\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;if \;X_{median}-n*MAD<X_i<X_{median}+n*MAD \end{cases} Xi′=⎩⎪⎨⎪⎧Xmedian+n∗MADifXi>Xmedian+n∗MADXmedian−n∗MADifXi<Xmedian−n∗MADXiifXmedian−n∗MAD<Xi<Xmedian+n∗MAD
# 代码实现 def mad(series,n): median = series.quantile(0.5) diff_median = ((series - median).abs()).quantile(0.5) max_range = median + n * diff_median min_range = median - n * diff_median return np.clip(series, min_range, max_range)
-
-
3 σ 3\sigma 3σ法
3 σ 3\sigma 3σ法又称为标准差法。
标准差本身可以体现因子的离散程度,是基于因子的平均值 X m e a n X_{mean} Xmean而定的。可以通过 X m e a n ± n ∗ σ X_{mean}\pm n*\sigma Xmean±n∗σ来衡量因子与平均值的距离。
-
计算出因子的平均值与标准差;
-
确认参数 n n n;
-
确认因子值的合理范围为 [ X m e a n − n ∗ σ , X m e a n + n ∗ σ ] [X_{mean}-n*\sigma,X_{mean}+n*\sigma] [Xmean−n∗σ,Xmean+n∗σ],并对因子值做如下的调整:
X i ′ = { X m e a n + n ∗ σ        i f    X i > X m e a n + n ∗ σ X m e a n − n ∗ σ        i f    X i < X m e a n − n ∗ σ X i                                                              i f    X m e a n − n ∗ σ < X i < X m e a n + n ∗ σ X_i'=\begin{cases}X_{mean}+n*\sigma\;\;\;if \;X_i>X_{mean}+n*\sigma\\X_{mean}-n*\sigma\;\;\;if\;X_i<X_{mean}-n*\sigma \\ X_i\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;if \;X_{mean}-n*\sigma<X_i<X_{mean}+n*\sigma \end{cases} Xi′=⎩⎪⎨⎪⎧Xmean+n∗σifXi>Xmean+n∗σXmean−n∗σifXi<Xmean−n∗σXiifXmean−n∗σ<Xi<Xmean+n∗σ
# 代码实现 def three_sigma(series,n): mean = series.mean() std = series.std() max_range = mean + n * std min_range = mean - n * std return np.clip(series, min_range, max_range)
-
-
百分位法
将因子值进行升序排列,对排位百分位高于97.5%或低于2.5%的因子值,进行类似于MAD、 3 σ 3\sigma 3σ的操作。
# 代码实现 def percentile(series, min= 0.025, max= 0.975): series = series.sort_values() q = series.quantile([min, max]) return np.clip(series, q.iloc[0], q.iloc[-1])
-
-
标准化
对于多因子策略,不同因子的量纲和数量级不同,为实现不同指标的可加性,需要对原始指标数据进行标准化处理。
数据标准化方法分类:
数据标准化处理主要包括:
数据标准化原理是将数据按比例缩放,使所有数据落入一个小的特定区间。最常见的就是归一化,将数据统一映射到[0,1]之间。
归一化是标准化的特例,标准化是特征缩放的特例。
数据标准化的具体方法:
-
最小-最大标准化(Min-max normalization)离差标准化
Min-max normalization又称为离差标准化,是常见的归一化处理
-
Z-score标准化
标 准 化 后 数 据 = 原 始 数 据 − 单 个 指 标 内 所 有 值 的 均 值 单 个 指 标 内 所 有 值 的 标 准 差 标准化后数据=\frac{原始数据-单个指标内所有值的均值}{单个指标内所有值的标准差} 标准化后数据=单个指标内所有值的标准差原始数据−单个指标内所有值的均值
# 代码实现 def standard_z_score(series): std = series.std() mean = series.mean() return (series-mean)/std
-
按小数定标标准化
-
-
中性化
中性化目的:为了在用某一个因子时能剔除其他因素的影响,使得选出的股票更加分散。相比而言,标准化使不同量级指标之间需要互相比较或者数据需要变得集中。
主要处理方式为:利用回归得到一个与风险因子线性无关的因子。即通过简历线性回归,提取残差作为中性化后的新因子。这样处理后的中性化因子与风险因子之间的相关性严格为零。
F a c t o r i = β M ∗ l n ( M k t V a l i ) + ∑ j = 1 n β j ∗ I n d u s t r y j , i + ϵ i Factor_i=\beta_M*ln(MktVal_i)+\sum^n_{j=1}\beta_j*Industry_{j,i}+\epsilon_i Factori=βM∗ln(MktVali)+j=1∑nβj∗Industryj,i+ϵi