暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据处理:去极值和标准化

量化分析之路 2020-04-03
5517

对数据的洗择过程称之为数据预处理。根据不同类型的数据有不同的数据预处理方法,其中,针对因子研究,最常用的预处理方法就是:去极值、标准化


为啥要去极值?

去极值就是排除一些极端值的干扰 。

比如上图一 的组上面两个XX 。如果不去除  拟合出来的线可能是线2   而我们发现线1更符合大部分的规律。


还有右图  XX 明显比..的数量少很多 黑线的拟合要比红曲线 波动大很多。

只有排除极端值的干扰,才能更好的发现数据之间的规律。


如何去极值呢?

第一步:找出哪些是极端值

第二步:处理这些极端值

一:极端值的定义方法有很多,一般是先确定一个上下限,超出这个界限的就划为极端值,下面我们介绍经常使用的两种:法和百分位法。

1

 

 

法源于最经典的统计学原则,即正态分布的数分布在(μ-3σ,μ+3σ)中的概率为99.73%,在外的概率是0.27%,也就是图中尾部的那些数。

其中μ代表平均值,σ是标准差,去极值法其实就是把离平均值太远的值算作极端值,那么多远是远呢距离超过3倍标准差以上的就是远了。

 

2、百分位法

百分位法是对所有的观察值按从小到大进行排序,最小的百分之X和最大的百分之X的人就是极端值,通常情况下,这个X一般取2.5,最小的2.5%和最大的2.5%相加,一共5%的数值被去除。

二:处理的方法也有两种:截尾和缩尾

截尾把找出的极端值直接去掉。

缩尾:所有大于上临界值的值全等于上临界值,所有小于下临界值的值全等于下临界值,相当于把超出临界值的点都拽回到边界上

 

优矿的去极值函数winsorize进行演示:

优矿winsorize函数支持和百分位法两种去极值方法,可以分别对相关参数进行调整。


universe = set_universe('A')
print(type(universe))
data_for_winsorize = DataAPI.MktStockFactorsOneDayGet(tradeDate=u"20150227",secID=universe,ticker=u"",field=['secID','LCAP','MFI'],pandas='1').set_index('secID')
print(type(data_for_winsorize))
data_for_winsorize.dropna(inplace=True)
print(data_for_winsorize.describe())
print(data_for_winsorize.head())
复制

我们以去除 LCAP和MFI 中的极值为例。



我们可以看到统计了2341个股票  

 LCAP的平均值为22.78 

 MFI的平均值为68.11在·

#人工去异常边界值
#计算均值
mfi_mean = data_for_winsorize['MFI'].mean()
#计算标准差
mfi_std = data_for_winsorize['MFI'].std()


mfi_upper_limit = mfi_mean+3*mfi_std
mfi_bottom_limit = mfi_mean-3*mfi_std


print('mfi_upper_limit = %f '%mfi_upper_limit)
print('mfi_bottom_limit = %f '%mfi_bottom_limit)


data_higher_than_upper = data_for_winsorize[data_for_winsorize['MFI']>mfi_upper_limit]
data_lowwer_than_bottom = data_for_winsorize[data_for_winsorize['MFI']<mfi_bottom_limit]


print(data_higher_than_upper.head())


print(data_lowwer_than_bottom.head())
复制

data_for_winsorize['MFI'][-50:].plot(color= 'g')
data_for_winsorize['MFI_adjusted'][-50:].plot(color = 'r')
复制

绿色为 极值  红色为缩尾优化后的结果。

文章转载自量化分析之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论