3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在构建多因子模型时,行业中性化(以及市值中性化等)通常建议在**单因子层面(即因子合成前)**进行处理。
在 JoinQuant 平台中,可以使用 neutralize 函数非常方便地对单因子进行中性化处理。通常的流程是:获取因子数据 -> 去极值 (winsorize) -> 缺失值处理 -> 中性化 (neutralize) -> 标准化 (standardlize) -> 因子合成。
import pandas as pd
import numpy as np
from jqfactor import neutralize, winsorize, standardlize
from jqdata import get_index_stocks
# 假设 data 是一个 DataFrame,index 为股票代码,列为某个单因子值
# 这里我们随机生成一些数据作为示例
stock_list = get_index_stocks('000300.XSHG', date='2023-01-01')
factor_data = pd.DataFrame(np.random.rand(len(stock_list), 1), index=stock_list, columns=['factor_value'])
# 1. 去极值
factor_data = winsorize(factor_data, qrange=[0.05, 0.95])
# 2. 行业与市值中性化
# how=['jq_l1', 'market_cap'] 表示使用聚宽一级行业和市值进行中性化
# date 参数指定使用哪一天的行业和市值数据作为基准
neutralized_data = neutralize(factor_data, how=['jq_l1', 'market_cap'], date='2023-01-01', axis=0)
# 3. 标准化
standardized_data = standardlize(neutralized_data, inf2nan=True)
# 经过上述处理后,standardized_data 就可以与其他经过同样处理的单因子进行加权合成了
强烈建议在单因子计算完毕后、因子合成前进行行业中性化处理。这不仅是业界标准的量化处理流程,也是确保多因子模型稳健性和有效性的关键步骤。