3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)平台中,进行因子中性化处理主要通过 jqfactor 模块中的 neutralize 函数实现。若要**同时剔除申万一级行业和市值(风险因子)**的影响,可以通过配置 how 参数传入包含相应因子名称的列表。
在调用 neutralize 时,将 how 参数设置为 ['sw_l1', 'market_cap'](或使用风格风险因子 ['sw_l1', 'size'])即可同时剔除申万一级行业和市值的影响。
from jqfactor import neutralize
# 假设 data 为待中性化的因子 Series 或 DataFrame(index 为股票代码)
# 剔除申万一级行业(sw_l1)与市值(market_cap)的影响
neutralized_data = neutralize(series=data, how=['sw_l1', 'market_cap'], date='2023-01-01')
series / data: pd.Series 或 pd.DataFrame,待中性化的因子序列,索引(index)必须为股票代码(如 '000001.XSHE')。how: 字符串列表(str list),指定中性化时作为回归自变量的因子。支持:
'sw_l1'(申万一级)、'sw_l2'(申万二级)、'jq_l1'(聚宽一级,默认)等。'market_cap'(市值)、'ln_market_cap'(对数市值)等。'size'(市值因子)、'beta'、'momentum'、'liquidity' 等。date: 字符串格式日期(如 '2023-01-01'),指定用于获取行业与市值数据的时间点。注意避免使用当天实时日期,防止因财报数据未更新返回 NaN。axis: 默认为 1(仅当输入为 DataFrame 时生效),表示沿行方向(对单日多只股票)做中性化;若为 0 则表示沿列方向。以下是在研究环境或单因子分析中,获取沪深300成分股因子数据并进行中性化处理的完整示例:
import pandas as pd
import numpy as np
from jqdata import get_index_stocks
from jqfactor import get_factor_values, neutralize
# 1. 设置目标日期与股票池
target_date = '2023-05-10'
stocks = get_index_stocks('000300.XSHG', date=target_date)
# 2. 获取原始因子值(例如:Skewness60 个股收益60日偏度)
factor_dict = get_factor_values(
securities=stocks,
factors=['Skewness60'],
start_date=target_date,
end_date=target_date
)
raw_factor = factor_dict['Skewness60'].iloc[0] # 转为以股票代码为 index 的 Series
# 3. 进行因子中性化:剔除申万一级行业(sw_l1)和市值(market_cap)的影响
neutralized_factor = neutralize(
series=raw_factor,
how=['sw_l1', 'market_cap'],
date=target_date
)
# 查看中性化前后的数据对比
df_compare = pd.DataFrame({
'Raw': raw_factor,
'Neutralized': neutralized_factor
})
print(df_compare.head())
how 参数,neutralize 默认使用 ['jq_l1', 'market_cap'](聚宽一级行业 + 市值)。date 当天的数据包含 NaN,回归时将直接忽略对应记录或返回原始数据,建议提前对因子进行极值与缺失值预处理(如使用 winsorize 去极值)。