因子数据预处理:去极值和标准化方法详解
创作时间:
作者:
@小白创作中心
因子数据预处理:去极值和标准化方法详解
引用
CSDN
1.
https://blog.csdn.net/cl2010abc/article/details/137218003
因子数据预处理是量化投资和数据分析中的重要环节,其中去极值和标准化是两个关键步骤。本文将详细介绍这些方法的具体实现,并通过Python代码和图表展示其应用效果。
一. 去极值
因子数据中过大或过小的值会影响分析结果,特别是在回归时,离群值会严重影响因子和收益率之间的相关性估计结果。
因子去极值的处理方法:
- 确定上下限
- 将上下限外的数据修改为上下限值
常见的去极值方法有三种,分别是MAD法、3σ法和百分位法。
1. MAD法
处理步骤:
- 找出所有因子的中位数Fmedian
- 得到每个因子与中位数的绝对偏差值|Fi - Fmedian|
- 得到绝对偏差值的中位数MAD
- 确定阈值参数n,对超出范围[Fmedian - n * MAD, Fmedian + n * MAD]的因子值做调整
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import baostock as bs
def get_hs300_stocks():
lg = bs.login()
# 获取沪深300成分股
rs = bs.query_hs300_stocks()
hs300_stocks = []
while (rs.error_code == '0') & rs.next():
hs300_stocks.append(rs.get_row_data())
# 获取沪深300成分股数据
result = pd.DataFrame()
for element in hs300_stocks:
print(element[1])
rs = bs.query_history_k_data_plus(element[1], "code,peTTM, pbMRQ",
start_date='2024-03-29', end_date='2024-03-29',frequency="d", adjustflag="3")
#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():
data_list.append(rs.get_row_data())
result = result.append(pd.DataFrame(data_list), ignore_index=True)
result.columns = ['code','pe', 'pb']
result['pe'] = result['pe'].astype('float64')
result['pb'] = result['pb'].astype('float64')
result.set_index('code', inplace=True)
return result
# 获取沪深300所有成分股2024-02-29的市盈率和市净率
factor_data = get_hs300_stocks()
# MAD去极值
def extreme_mad(factor, n):
median = factor.quantile(0.5)
mad = (factor - median).abs().quantile(0.5)
upper = median + mad * n
lower = median - mad * n
return factor.clip(lower = lower, upper = upper, axis = 1)
# 对比用MAD法去极值后与原始数据的数据分布
fig, ax = plt.subplots(figsize = (10, 8))
factor_data['pe'].plot(kind = 'kde',label='pe')
extreme_mad(factor_data, 5)['pe'].plot(kind = 'kde', label = 'pe_mad')
ax.legend()
2. 3σ法
处理步骤:
- 计算出因子的平均值mean与标准差δ
- 确定阈值参数n(默认为3),对超出范围[mean - nδ, mean + nδ]的因子值做调整
# 3 sigma法
def extreme_nsigma(factor, n):
mean = factor.mean()
std = factor.std()
upper = mean + n * std
lower = mean - n * std
return factor.clip(lower = lower, upper = upper, axis = 1)
# 对比用3 sigma法去极值后与原始数据的数据分布
fig, ax = plt.subplots(figsize = (10, 8))
factor_data['pe'].plot(kind = 'kde',label='pe')
extreme_nsigma(factor_data, 3)['pe'].plot(kind = 'kde', label = '3sigma_pe')
ax.legend()
3. 百分位法
处理步骤:
- 找出因子值的上限分位数和下限分位数(一般为97.5%和2.5%)
- 对大于上限分位数和小于下限分位数的因子值进行调整
# 百分位数去极值
def extreme_percentage(factor, lower_pencentage, upper_percentage):
lower = factor.quantile(lower_pencentage)
upper = factor.quantile(upper_percentage)
return factor.clip(upper = upper, lower = lower, axis = 1)
# 对比用百分位法去极值后与原始数据的数据分布
fig, ax = plt.subplots(figsize = (10, 8))
factor_data['pe'].plot(kind = 'kde',label='pe')
extreme_percentage(factor_data, 0.025, 0.975)['pe'].plot(kind = 'kde', label = 'percent_pe')
ax.legend()
二. 标准化
一般不同因子数据的量纲和数量级可能会存在较大的差别,比如市盈率和成交量这两个因子之间会差好几个数量级,这样会放大数值大的因子,削弱数值小的因子。因此需要对因子数据进行标准化处理。
经过标准化处理后,因子数据会出现如下变化
- 原始数据从有量纲数据转换为无量纲数据,
- 各指标数据处于同一数量级上,数据更加集中
- 不同的指标能够进行比较和回归,可以进行综合测评分析
1. Z-score法
处理步骤:
- 计算因子的均值和标准差
- 因子值减去均值后再除以标准差得到的值即是标准化后的因子值
def standlize_z(factor):
mean, std = factor.mean(), factor.std()
return (factor - mean) / std
fig, ax = plt.subplots(figsize = (10, 8))
extreme_mad(factor_data, 5)['pe'].plot(kind = 'kde',label='pe_mad')
standlize_z(extreme_mad(factor_data, 5))['pe'].plot(kind = 'kde', label = 'pe_standlize')
ax.legend()
热门推荐
美国海军的救星,年产270万吨的日本造舰能力能战胜中国吗?
红豆绿豆减肥粥:健康减肥的美味选择
咖啡产业精品化 “村咖”有了新玩法——普洱市思茅区咖啡庄园焕新记系列报道
一味十分奇妙的中药,除了清热凉血、散瘀止痛外,它还可以清肝火
甘蓝种植时间和方法详解(从选种到收割,你需要知道的关键信息)
骆驼祥子主要内容及章节概括
【车管小课堂】免检≠不检,“六年免检”政策解读看这里!
可以尝试的23个低成本爱好
榴莲什么时候最好吃最便宜 各种榴莲成熟时间汇集
电工胶布使用方法
薄荷应该如何摆放才能够起到改运效果
蛀牙只剩残根怎么办?拔牙难度与修复方法全解析
玉树的养殖方法和注意事项
文旅部推荐的这些湖南美食,有你家乡的吗?
中国最受欢迎的八道特色家常菜,色香味俱全,你都吃过哪些
浓香型白酒的搭配与美食之缘
诺贝尔奖得主论衰老与永生
揭秘人类寿命极限:细胞分裂、端粒与永生之梦
新“交通大学”,投资100亿
华中科技大学2024年非全日制研究生复试分数线公布!附历年考研复试分数线
原油市场走势分化 关税与伊朗制裁影响交织?
咸鸭蛋要放在冰箱里冷藏吗?
牡蛎散和玉屏风散区别是什么
2025年高考体检时间、体检项目及标准!哪些病影响高考录取?
七彩神仙鱼的适宜温度,适宜的生长温度在25-30℃之间
【防紫外线眼镜】如何鉴别太阳镜的防紫外线功能 防紫外线眼镜是什么镀膜
克服写作惰性的10个技巧
《水浒传》及其四种优秀整理版本
心理小说与社会心理学的联系
怎么优化客诉处理流程以提高客户满意度?