问题描述
请问下:get_factor_values得到的因子看板上的因子值,是只是经过公式计算出来未经过数据处理的原始值呢?还是根据看板上说的数据处理方式处理后的值?
解决方案
在 JoinQuant 聚宽量化平台中,使用 get_factor_values 函数获取的因子值,绝大部分是未经过数据处理的原始值。
根据聚宽官方 API 文档的说明:
- 默认情况为原始值:除了在因子描述及说明中有特别解释处理方法的因子外,其他的都是原始因子,没有经过处理(即没有经过中性化、去极值、标准化等操作)。
- 特殊情况(如风格因子):对于 Barra 风险模型中的风格因子(如
size,beta,momentum等),由于其定义本身就包含了标准化、正交化等处理步骤,因此获取到的是处理后的值。但是,计算这些风格因子所依赖的描述因子(如daily_standard_deviation等),获取到的依然是原始值。
如何对原始因子值进行数据处理?
如果您需要对获取到的原始因子值进行去极值、标准化或中性化处理,聚宽提供了专门的数据处理函数,您可以直接调用:
1. 去极值 (Winsorize)
可以使用 winsorize 或 winsorize_med(中位数去极值)函数:
from jqfactor import get_factor_values, winsorize
# 获取原始因子值
factor_data = get_factor_values(securities=['000001.XSHE', '000002.XSHE'], factors=['pb_ratio'], start_date='2023-01-01', end_date='2023-01-01')
df = factor_data['pb_ratio']
# 对因子值进行去极值处理(例如:将 5% 和 95% 分位数之外的值替换为边界值)
processed_df = winsorize(df, qrange=[0.05, 0.95], axis=1)
2. 标准化 (Standardize)
可以使用 standardlize 函数(Z-score 标准化):
from jqfactor import standardlize
# 对去极值后的数据进行标准化
standardized_df = standardlize(processed_df, axis=1)
3. 中性化 (Neutralize)
可以使用 neutralize 函数,剔除行业和市值等因素的影响:
from jqfactor import neutralize
# 对标准化后的数据进行行业和市值中性化
# 注意:中性化需要指定具体的日期
neutralized_df = neutralize(standardized_df, how=['jq_l1', 'market_cap'], date='2023-01-01', axis=1)
总结:为了保证数据的灵活性,get_factor_values 默认提供原始计算结果。在构建多因子模型时,建议您根据自己的研究需求,使用上述内置函数对原始因子值进行标准的预处理流程(去极值 -> 标准化 -> 中性化)。