3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化因子研究和多因子模型构建中,原始因子数据常包含极端异常值,这会对后续的因子标准化、中性化以及回归分析产生严重干扰。JoinQuant(聚宽)提供了 winsorize_med 函数,专门用于基于中位数的鲁棒去极值处理。
传统的标准差去极值法(如均值上下 3 倍标准差)对异常值本身非常敏感。而中位数去极值法(也称 MAD 去极值法,Median Absolute Deviation)采用中位数和绝对中位差来界定正常数据区间:
$$\text{边界} = [ \text{med} - \text{scale} \times \text{distance}, \text{med} + \text{scale} \times \text{distance} ]$$
其中:
np.nan。在 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 |
当 data 为 pd.DataFrame 时使用。0 表示对每列做缩尾,1 表示对每行做缩尾。 |
返回经过中位数去极值处理后的因子数据结构(pd.DataFrame 或 pd.Series)。
以下示例展示了如何在聚宽平台获取沪深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)
在构建量化多因子策略时,通常推荐的因子预处理顺序如下:
winsorize_med 或 winsorize 去除异常值。standardlize 进行 Z-score 标准化。neutralize 剔除行业和市值因子的影响。