处理数据有三宝——极值化、标准化、中性化

题目中的三种方法都可以归类到无量纲化处理中。

无量纲化处理是综合评价步骤中的一个环节。

目前常见的无量纲化处理方法主要有极值化、标准化、均值化以及标准差化方法,而最常使用的是标准化方法。但标准化方法处理后的各指标均值都为0,标准差都为1,它只反映了各指标之间的相互影响,在无量纲化的同时也抹杀了各指标之间变异程度上的差异,因此,标准化方法并不适用于多指标的综合评价中。而经过均值化方法处理的各指标数据构成的协方差矩阵既可以反映原始数据中各指标变异程度上的差异,也包含各指标相互影响程度差异的信息。

 

在处理金融事件序列的数据时,经常性会遇到极值的情况存在,极值会影响数据的适用程度,比如拉大标准差、造成统计偏见等问题。

我们生成一组mean为50,std为30,长度100的数据,

array([ 66.16328909, 51.84639776, 71.07442396, 15.26774869,
68.28244943, 59.50559233, 79.05807807, 48.11829347,
71.91798955, 87.06759905, 118.69150417, 94.65095156,
52.75089061, 65.69426004, 54.65187034, 9.15739289,
50.99852253, 53.886494 , 21.58339001, 59.68230446,
25.17009391, -10.96345305, 75.90114652, 27.96581834,
-1.87284457, 28.87661484, 33.5856661 , 70.24972791,
34.6435637 , 30.63306152, 75.80528191, 36.03325008,
96.45386425, 1000. , 26.09352194, 87.5854527 ,
67.59996262, 99.81348535, 38.69525659, 47.89437267,
21.39065538, 33.33313311, 36.76082266, 66.21398849,
33.94027229, 50.57739856, 24.70357476, 64.87470591,
25.66668216, -25.69902613, 53.96283578, 38.87559227,
101.19808589, 35.31075384, 13.26082567, 39.28952555,
57.89254317, 59.21673824, -20.53589085, 37.19360256,
50.48979105, 71.37986682, 11.69141135, 44.5874284 ,
-11.4484093 , 5.53003244, 30.46619184, 8.8625734 ,
17.35790145, 81.49410792, 93.93030432, 75.97133512,
71.62773012, 74.97939853, 99.29858863, 8.53572248,
50.23784379, 60.7664748 , 50.29113103, 28.18074054,
73.43688181, 104.84233701, 11.72626029, 47.23521926,
79.57432031, 21.72014708, 44.66964391, 40.71785683,
73.90239349, 52.29523315, 59.18459432, 72.31662136,
40.32093854, 49.62135064, 48.14769909, 49.3005601 ,
47.00592351, 66.60559807, 72.45800621, 111.03867563])

 

绘图如下:

00a

我们往里面添加一个奇异值,比如:a[33]=1000(把第34个数据改为1000),图形如下:

00b

此时数据的基本数据:mean=59.2799,std = 98.8897,如果一组数据里有那么两三个这样的值,差异将会更大。

 

如何处理极值的情况?

业内常用所谓的“(3{sigma})”原则,即为了消除因子极值对因子实际效果造成的不必要影响,根据样本计算出标准差,然后将其中大于 ({mu+3sigma}) 的样本以({mu+3sigma})填充,将小于({mu-3sigma})的样本以({mu-3sigma})填充。

其中,(mu)为样本均值,(sigma)为标准差。

20161014更新:

代码中生成的数组与前文已经不一样了,修改为均值1000,标准差100了。然后修改奇异值。

主要为了方便图形展示。

处理代码:

import numpy as np
import matplotlib.pyplot as plt


def delextremum(array):
    '''
    @param array:<type> numpy.array
    '''
    sigma = array.std()
    mu = array.mean()
    array[array > mu + 3*sigma] = mu + 3*sigma
    array[array < mu - 3*sigma] = mu - 3*sigma
    return array

a = np.random.normal(1000,100,100)
a[33] = 2000
a[88] = 100
mu = a.std()
mean = a.mean()
up = [mean + 3 * mu] * len(a)
down = [mean - 3 * mu] * len(a)
plt.plot(a, 'green', alpha=0.5)

plt.plot(up)
plt.plot(down)

b = delextremum(a)
plt.plot(b, 'red', alpha=0.5)

aab

 

 

中性化处理

标准化处理

z-score方式:

(N={x_i-overline{x}over sigma})

其中,N为长度为n的数组。

评论 (3)
  1. 沙发
    幻月 2017-03-06 01:42

    大神把标准化、中性化补完呀

    • 回复
      kingmo888 2017-03-06 09:05
      @幻月

      额。。中性化更多的做法是对因子分别做行业和市值的中性。

      标准化文中已经提到了。

       

       

      可以留个联系方式与你交流。

  2. 板凳
    滔宝宝 2018-03-15 09:50

    哥,最主要的中性化处理你没说啊。标准化和极值是个大学生都会做啊。
    哥,有相关中性化处理的步骤吗?我的联系方式是:QQ1310185353。