3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在多因子选股模型中,因子的预处理(去极值、标准化、中性化)是消除异常值影响、统一量纲并剔除行业与市值暴露的关键步骤。聚宽(JoinQuant)平台在其 jqfactor 库中提供了高效的内置函数,支持一站式完成这三步预处理。
以下是在聚宽中对自定义因子进行预处理的标准流程与实战代码:
第一步:去极值(Winsorization)
winsorize_med。第二步:标准化(Standardization / Z-score)
standardlize。第三步:中性化(Neutralization)
neutralize。以下代码展示了如何获取沪深300成分股的原始因子数据,并依次进行中位数去极值、Z-score标准化以及行业与对数市值中性化:
import pandas as pd
import numpy as np
from jqdata import *
# 导入聚宽因子预处理专用库
from jqfactor import winsorize_med, standardlize, neutralize
def preprocess_my_factor(context):
# 1. 获取目标股票池(以沪深300为例)及当前日期
date_str = context.current_dt.strftime('%Y-%m-%d')
stocks = get_index_stocks('000300.XSHG', date=date_str)
# 2. 获取您的自定义因子数据(此处以聚宽因子库中的 'Skewness60' 偏度因子作为示例)
from jqfactor import get_factor_values
raw_factor_dict = get_factor_values(
securities=stocks,
factors=['Skewness60'],
start_date=date_str,
end_date=date_str
)
# 提取 DataFrame,行索引为日期,列索引为股票代码
df_raw = raw_factor_dict['Skewness60']
# 3. 因子预处理三步法
# 【第一步】中位数去极值 (MAD)
# scale=1 表示边界设为 [med - 3 * 1.4826 * MAD, med + 3 * 1.4826 * MAD]
# axis=1 表示对每一行(即每天的横截面数据)进行处理
df_winsorized = winsorize_med(df_raw, scale=1, inclusive=True, inf2nan=True, axis=1)
# 【第二步】Z-score 标准化
# 将去极值后的数据进行标准化,使其均值为0,标准差为1
df_standardized = standardlize(df_winsorized, inf2nan=True, axis=1)
# 【第三步】行业与市值中性化
# how 传入中性化基准:'jq_l1' 代表聚宽一级行业,'market_cap' 代表总市值
# 内部会自动将市值转化为对数市值进行回归
df_neutralized = neutralize(
df_standardized,
how=['jq_l1', 'market_cap'],
date=date_str,
axis=1
)
# 4. 输出处理后的纯净因子值
log.info("原始因子样例:\n", df_raw.iloc[0].head())
log.info("预处理后因子样例:\n", df_neutralized.iloc[0].head())
return df_neutralized
date 参数必须传入当前逻辑日期(如 context.current_dt),切勿跨日期缓存或使用未来日期,否则会引入未来函数。