AI量化知识树

AI可视化的数据清洗

由ypyu创建,最终由qxiao 被浏览 363 用户

AI可视化的因子特征数据清洗

清洗流程

大部分的金工报告中第一步都是提取因子数据,随后就是对这些因子特征数据的清洗。以华泰证券的金工报告为例,数据清洗的标准流程大概包括:

  • 缺失值处理(删除或者用行业均值填充)
  • 因子异常值处理(固定比例法、均值标准差法、MAD法)
  • 行业市值中性化处理(将因子暴露以行业哑变量和市值为变量做线性回归,抽取截距项)
  • PCA分析

清洗的目的是使得因子数据摆脱异常值、行业、市值和多重共线性的影响。

特征因子数据清洗模块

def bigquant_run(input_1, input_2, input_3):

# 1、获取特征数值
df = input_1.read_df()   
df = df[df['industry_sw_level1_0']>0]                # 去除没有查出行业的股票
industry_List = df['industry_sw_level1_0'].unique()          # 所有行业代码
factors_all=df.columns    #获取因子列表

# 2、获取用来中性化的因子列表 通常是行业和市值
factor0 = input_2.read_pickle()                         

#3、需要做清洗的因子列表 
factors_need_cal=[k for k in set(factors_all)-set(factor0) if k!='date' and k!='instrument' and k[:2]!='m:' and k!='label']

#4、缺失值处理 按中信一级行业相同个股的平均值填充
for fac in factors_need_cal:
    df['fac_mean'] = df[['date']+['industry_sw_level1_0']+[fac]].groupby(['date','industry_sw_level1_0']).transform(np.mean)
    df[fac]=df[fac].fillna(df['fac_mean'])
    del df['fac_mean']

#5、因子异常值处理  
#  固定比例法
#for fac in factors_need_cal:
   # df[fac][df[fac]>df[fac].quantile(0.99)]=df[fac].quantile(0.99)
    #df[fac][df[fac]<df[fac].quantile(0.01)]=df[fac].quantile(0.01)
#  均值标准差法
#print(df[factors_need_cal].head())
#for fac in factors_need_cal:
    #df[fac][df[fac]>df[fac].mean()+3*df[fac].std()]=df[fac].mean()+3*df[fac].std()
    #df[fac][df[fac]<=df[fac].mean()-3*df[fac].std()]=df[fac].mean()-3*df[fac].std()
#  MAD法
#print(df[factors_need_cal].head())
for fac in factors_need_cal:
    median = np.median(list(df[fac]))
    MAD = np.mean(abs(df[fac]) - median)
    df[fac][df[fac]>median+6*MAD] = median+6*MAD  # 剔除偏离中位数6倍以上的数据
    df[fac][df[fac]<median-6*MAD] = median-6*MAD
         
#计算行业哑变量
dfTmp = df.copy()  #copy一份用于计算行业哑变量
for n in range(len(industry_List)):                         # 行业哑变量赋值
    dfTmp['industry_%d' % n] = 0
    dfTmp['industry_%d' % n][df['industry_sw_level1_0']==industry_List[n]]=1
                      
# 准备线性回归参数
from sklearn.linear_model import LinearRegression
model0 = LinearRegression()
X = dfTmp[list('industry_%d' % n for n in range(len(industry_List)))+factor0] #组装行业哑变量列和中性化因子列矩阵
del X['industry_sw_level1_0'] #删去中性化因子中的行业列

#需要计算中性化的因子列表
factors_need_cal=[k for k in set(factors_all)-set(factor0) if k!='date' and k!='instrument' and k[:2]!='m:' and k!='label']

# 逐个特征进行行业市值中性化
from sklearn.preprocessing import scale
for fac in factors_need_cal:
        y = df[fac] #获取需要中性化的因子暴露值
        model0.fit(X, y)
        df[fac] = y-model0.predict(X)  # 计算因子暴露相对于行业哑变量和中性化因子回归后的残差
        #df[fac]=(df[fac]-np.mean(df[fac]))/np.std(df[fac])#一种与scale基本等效的处理
        df[fac] = scale(df[fac])
         #对残差取Z-Score标准化将计算后的结果返回给df中的各列,即完成中性化后的结果

#多重共线性分析
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
pca = PCA(n_components=len(factors_need_cal))
pca.fit(df[factors_need_cal])
var= pca.explained_variance_ratio_ #计算每个因子解释程度
var1=np.cumsum(np.round(pca.explained_variance_ratio_, decimals=4)*100)#累计解释程度
plt.plot(var1)
print(var)
data_1 = DataSource.write_df(df)
print(data_1)
return Outputs(data_1=data_1, data_2=None, data_3=None)

策略案例


https://bigquant.com/experimentshare/704855ca17444a2a9632e2e75751ede1

\

标签

数据清洗缺失值处理
{link}