因子数据预处理-去极值和标准化

一. 去极值

因子数据中过大或过小的值会影响分析结果,特别是在回归时,离群值会严重影响因子和收益率之间的相关性估计结果。

因子去极值的处理方法:

  1. 确定上下限
  2. 将上下限外的数据修改为上下限值

常见的去极值方法有三种,分别是MAD法,3 σ \sigma σ法,百分位法

1. MAD法

处理步骤:

  1. 找出所有因子的中位数 F m e d i a n F_{median} Fmedian
  2. 得到每个因子与中位数的绝对偏差值 ∣ F i − F m e d i a n ∣ |F_i - F_{median}| FiFmedian
  3. 得到绝对偏差值的中位数 M A D MAD MAD
  4. 确定阈值参数 n n n,对超出范围 [ F m e d i a n − n ∗ M A D , F m e d i a n + n ∗ M A D ] [F_{median} - n * MAD, F_{median} + n * MAD] [FmediannMAD,Fmedian+nMAD]的因子值做调整
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import baostock as bsdef 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 * nlower = median - mad * nreturn 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 σ \sigma σ

处理步骤:

  1. 计算出因子的平均值 m e a n mean mean与标准差 δ \delta δ
  2. 确定阈值参数 n n n(默认为3),对超出范围 [ m e a n − n δ , m e a n + n δ ] [mean - n\delta, mean + n\delta] [meannδ,mean+nδ]的因子值做调整
# 3 sigma法
def extreme_nsigma(factor, n):mean = factor.mean()std = factor.std()upper = mean + n * stdlower = mean - n * stdreturn 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. 百分位法

处理步骤:

  1. 找出因子值的上限分位数和下限分位数(一般为97.5%和2.5%)
  2. 对大于上限分位数和小于下限分位数的因子值进行调整
# 百分位数去极值
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法

处理步骤:

  1. 计算因子的均值和标准差
  2. 因子值减去均值后再除以标准差得到的值即是标准化后的因子值
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()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588020.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络请求避坑,私有网络请求(Private Network Access)

前言 网络请求,大家肯定熟悉的不能再熟悉,网络请求失败,大家也肯定很熟悉。排查网络请求,也是我们必备的技能,对不,兄弟。 我坦言,最怕两种网络请求失败。 第一种:PC端模拟没有异常…

2012年认证杯SPSSPRO杯数学建模A题(第一阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现: 第一阶段问题   世界上生存着许多种类的蜘蛛,而其中的大部分种类都会通过结网来进行捕食。请你建立合理的数学模型,说明蜘蛛网织成怎样的结构才是最合适的。 整体求解过程概述(摘要…

【面试八股总结】传输控制协议TCP(三)

参考资料 :小林Coding、阿秀、代码随想录 一、TCP拥塞控制⭐ 1. 慢启动 – Slow Start 慢启动是指TCP连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了网络通道的秩序。 慢启动算法: 初始拥塞窗口…

【EasyExcel】—— 实现excel动态表头设置、多个sheet

引入jar <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version></dependency>代码 public static void main(String[] args) {//选择存储地址String fileName "/User…

构建第一个ArkTS应用(FA模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

OSError: Can‘t load tokenizer for ‘bert-base-chinese‘

文章目录 OSError: Cant load tokenizer for bert-base-chinese1.问题描述2.解决办法 OSError: Can’t load tokenizer for ‘bert-base-chinese’ 1.问题描述 使用from_pretrained()函数从预训练的权重中加载模型时报错&#xff1a; OSError: Can’t load tokenizer for ‘…

axios 封装 http 请求详解

前言 Axios 是一个基于 Promise 的 HTTP 库&#xff0c;它的概念及使用方法本文不过多赘述&#xff0c;请参考&#xff1a;axios传送门 本文重点讲述下在项目中是如何利用 axios 封装 http 请求。 一、预设全局变量 在 /const/preset.js 中配置预先设置一些全局变量 window.…

算法错题本

这里写目录标题 错题本注意数据的耦合性对于无解情况的处理思路一组数据以0为结束标记&#xff0c;如何输入到数组中&#xff0c;并计数多个数据进行比较链表删除重复元素的启发循环体里谨慎写类型定义并初始化&#xff08;一般写上就是错&#xff09;队列中读取队尾元素数组当…

Java项目:85 springboot智能物流管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本美发门店管理系统有管理员和用户两个角色。 用户功能有项目预定管理&#xff0c;产品购买管理&#xff0c;会员充值管理&#xff0c;余额查询管理。…

vue3鼠标向下滑动,导航条改变背景颜色和logo的封装

代码中使用了element-plus组件&#xff0c;需先安装 向下滑动前 向下滑动后&#xff08;改变了logo 字体 背景颜色&#xff09; <script lang"ts" setup> import router from /router; import { ArrowDown } from element-plus/icons-vue import { ref, …

VScode debug python(服务器)

方法一&#xff1a; 创建launch.json文件&#xff1a; launch.json文件地址&#xff1a; launch.json文件内容&#xff1a; {"version": "0.2.0", //指定了配置文件的版本"configurations": [{"name": "Python: Current File&…

基于kmeans的聚类微博舆情分析系统

第一章绪论 1.1研究背景 如今在我们的生活与生产的每个角落都可以见到数据与信息的身影。自从上十世纪八十年代的中后期开始&#xff0c;我们使用的互联网技术已经开始快速发展&#xff0c;近些年来云计算、大数据和物联网等与互联网有相领域的发展让互联网技术达到了史无前例…