数据处理是有效性分析中至关重要的一步。比如说有100个数其中的99个都在0-1区间范围内,但有一个突然达到了1000,我们能够明显的感受到这1000是一个异常值,它出现的概率是非常小的,但在数据分析的时候它严重的拉大了均值、标准差等数据,使我们没有办法对整个数据有一个正确的判断,所以为了得到更加有效的处理,我们在分析有效性之前,第一步要进行的就是数据分析。
数据处理分为以下几个步骤
1、数据筛选
2、对异常值的处理
3、对缺失值的处理
4、数据的标准化
第一步、数据筛选:我们要选择想要测试的数据范围
一般情况下会选取全体A股的数据,同时为了使测试结果更加符合投资逻辑,通常情况下还会制定3条样本筛选规则:
(1)剔除选股日的ST/PT股票;
(2)剔除上市不满一年的股票;
(3)剔除选股日由于停牌等原因而无法买入的股票、
这三条原因主要是因为我们想要获得因子的真实变动,符合大家投资的心态,而不是存在太多异常数值从而对我们的分析造成影响。
P.S.这三条并不是固定的筛选规则,比如说在探讨该因子在对ST/PT股票的有效性时,我们的选股范围就要变成ST股,而不是全体A股,更不用说是剔除掉了。
第二步、对异常值的处理
目的我就不再重复阐述了,这里主要介绍对异常值处理的几个常用方法
1、固定比例法
固定比例法的想法是把数据从小到大排列,去掉最小和最大的固定比例数据在排除异常值。
但是这种方法对历史数据较长的情况下可能不太可行,而且强行删除固定比例的数据反而会面临不太必要的信息损失。这种方法只能作为一种粗略的算法,以获得对异常值数据影响的初步认识,接下来会介绍更加精细的异常值侦测工具
2、三倍标准差法
三倍标准差法是对把数据的合理范围取在[μ?3σ,μ 3σ],其中μ是均值,σ是标准差。这个方法的前提是数据为正态分布,在该分布下,99.73%的数据均会被包含在内。也就是说在三倍标准差之外发生的概率大概是千分之二到三,这在实际情况下也是合理的范围。
但是该方法的缺点也是显而易见的,对于股票的数据来说大多都是尖峰后尾的情况,而不符合正态分布,当我们再用正态分布的假设去处理数据可能会把过量的数据认定为异常点。同时我们注意到在计算合理范围时,用的均值和标准差都不是稳健统计量,其本身受极值的影响就非常大,所以可能会出现一种情况,那就是我们从数据分布图上能非常明显的看到异常点,但按照上面的方法,这个异常点可能仍在合理范围内。所以说三倍标准差法也是存在着一定的缺陷的
3、MAD法(绝对中位数法,最常用)
MAD法是一种更为稳健的方法,它并不受正态分布的限制,也就是说对非正态分布的数据也是十分有效的。计算方法为:
首先计算因子值的中位数Medianf,并定义绝对中位值为:MAD=median(∣∣fi?Medianf∣∣)采取与3σ法等价的方法,
我们将[Medianf?3?1.4826?MAD,Medianf 3?1.4826?MAD]定义为合理范围。
和三倍标准差方法相比,MAD法不受极端异常值的影响,结果是更加稳健的。现在大多数对异常值的处理方法都选择MAD法。
```python
MAD法
def MAD(data):
for i in range(len(data.columns)):
MAD=median(abs(data.iloc[:,i]-median(data.iloc[:,i])))
MAX=median(data.iloc[:,i]) 31.4826MAD
MIN=median(data.iloc[:,i])-31.4826MAD
data.iloc[:,i][data.iloc[:,1]>MAX]=MAX
data.iloc[:,i][data.iloc[:,1]
/opt/conda/envs/python3new/lib/python3.6/site-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
from pandas.core import datetools