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
\