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

本文介绍了在金融数据分析中处理因子数据时的去极值方法,包括MAD法、σ法(3σ原则)和百分位法,以及标准化(如Z-score法)的重要性,以确保不同量纲和数量级的因子数据能有效比较和用于回归分析。
摘要由CSDN通过智能技术生成
一. 去极值

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

因子去极值的处理方法:

  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 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 σ \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 * 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. 百分位法

处理步骤:

  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()

在这里插入图片描述

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据预处理是数据分析中非常重要的一个环节,它可以让原始数据更加适合用于各种分析和建模任务。常见的数据预处理包括数据清洗、缺失值处理、异常值处理、特征选择、特征缩放和特征变换等。下面我们将介绍一些常见的数据预处理方法。 1. 数据清洗 数据清洗是指在数据中去除不合理、重复或者无效的数据,保证数据的完整性和准确性。常见的数据清洗方法包括: - 删除重复数据 - 去除异常值 - 去除不合理数据 - 填充缺失值 2. 缺失值处理 缺失值是指数据集中某些数据缺失的情况。常见的缺失值处理方法包括: - 删除缺失值 - 插值法填补缺失值 - 使用平均值、中位数、众数等统计量填补缺失值 3. 异常值处理 异常值是指数据集中不符合正常规律的数据。常见的异常值处理方法包括: - 删除异常值 - 修改异常值 - 使用插值法填补异常值 4. 特征选择 特征选择是指从原始数据中选择最具有代表性的特征,以便用于分析和建模。常见的特征选择方法包括: - 过滤式特征选择 - 包裹式特征选择 - 嵌入式特征选择 5. 特征缩放 特征缩放是指将不同量纲的特征缩放到相同的范围内。常见的特征缩放方法包括: - 标准化 - 归一化 - 对数变换 6. 特征变换 特征变换是指通过对原始数据进行某些变换,使得数据更适合用于分析和建模。常见的特征变换方法包括: - 主成分分析(PCA) - 线性判别分析(LDA) - 因子分析 以上就是一些常见的数据预处理方法,通过对数据进行适当的预处理,可以提高数据分析和建模的准确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值