🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 因子清洗:winsorize_med 中位数去极值详解与 Python 示例

joinquant | 发布时间: 2026/7/23
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 因子清洗:winsorize_med 中位数去极值详解

Question: 如何在 joinquant 中对量化因子进行中位数去极值处理?

解决方案

joinquant 因子清洗:winsorize_med 中位数去极值详解

在量化因子研究和多因子模型构建中,原始因子数据常包含极端异常值,这会对后续的因子标准化、中性化以及回归分析产生严重干扰。JoinQuant(聚宽)提供了 winsorize_med 函数,专门用于基于中位数的鲁棒去极值处理。


1. 什么是中位数去极值(MAD 去极值)?

传统的标准差去极值法(如均值上下 3 倍标准差)对异常值本身非常敏感。而中位数去极值法(也称 MAD 去极值法,Median Absolute Deviation)采用中位数和绝对中位差来界定正常数据区间:

$$\text{边界} = [ \text{med} - \text{scale} \times \text{distance}, \text{med} + \text{scale} \times \text{distance} ]$$

其中:

  • $\text{med}$ 为因子值的中位数(Median)。
  • $\text{distance}$ 为因子值偏离中位数的绝对偏差的中位数(即 MAD)。
  • 超过上下边界的数值将被替换为边界值或 np.nan

2. winsorize_med 函数 API 详解

在 JoinQuant 中,可以通过 jqfactor 模块导入并使用 winsorize_med

from jqfactor import winsorize_med

winsorize_med(series, scale=1.0, inclusive=True, inf2nan=True, axis=1)

参数说明

参数 类型 默认值 说明
data pd.Series / pd.DataFrame / np.array - 待去极值缩尾处理的因子序列。
scale float 1.0 倍数大小。缩尾边界为 [med - scale * distance, med + scale * distance]
inclusive bool True 是否将超出边界的值替换为边界值。若为 True 则替换为边界值;若为 False 则替换为 np.nan
inf2nan bool True 是否在去极值前将 np.inf-np.inf 替换为 np.nan
axis int 1 datapd.DataFrame 时使用。0 表示对每列做缩尾,1 表示对每行做缩尾。

返回值

返回经过中位数去极值处理后的因子数据结构(pd.DataFramepd.Series)。


3. 代码示例

以下示例展示了如何在聚宽平台获取沪深300成分股的因子数据并使用 winsorize_med 进行清洗:

import pandas as pd
import numpy as np
from jqdata import get_index_stocks
from jqfactor import get_factor_values, winsorize_med

# 1. 获取沪深300成分股列表及因子数据
stocks = get_index_stocks('000300.XSHG', date='2023-01-01')
factor_dict = get_factor_values(
    securities=stocks, 
    factors=['PE'], 
    start_date='2023-01-01', 
    end_date='2023-01-05'
)
pe_df = factor_dict['PE']  # 行索引为日期,列索引为股票代码

# 2. 对每日因子数据(按行方向)进行中位数去极值处理
cleaned_pe = winsorize_med(pe_df, scale=1.0, inclusive=True, inf2nan=True, axis=1)

print("原始因子数据形状:", pe_df.shape)
print("清洗后因子数据形状:", cleaned_pe.shape)

4. 因子预处理标准流程提示

在构建量化多因子策略时,通常推荐的因子预处理顺序如下:

  1. 去极值:使用 winsorize_medwinsorize 去除异常值。
  2. 标准化:使用 standardlize 进行 Z-score 标准化。
  3. 中性化:使用 neutralize 剔除行业和市值因子的影响。