🚀 AI 一键生成 joinquant 策略代码
立即体验

JoinQuant 聚宽 calc_factors 函数详解:是否包含中性化与标准化?

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

calc_factors的使用说明有嘛?

在多因子策略模板中,有一个方法叫get_factor_values,该方法里面调用了一个叫做calc_factors的方法。查了一下,这个方法是从jqfactor中import过来(from jqfactor import Factor, calc_factors)。问一下是否有calc_factors的说明文档。主要是关心一下里面是否做了中性化,标准化等处理。

解决方案

核心解答

在 JoinQuant 聚宽平台中,calc_factors 函数仅仅用于计算因子值,并没有内置中性化、标准化或去极值等数据处理操作。如果您需要对因子数据进行这些处理,需要额外调用聚宽提供的专用数据处理函数(如 neutralizestandardlizewinsorize 等)。


calc_factors 函数使用说明

在回测以及研究中,可以通过调用 jqfactor 中的 calc_factors 函数来计算单因子分析中定义的因子值。

API 定义

calc_factors(securities, factors, start_date, end_date, use_real_price, skip_paused)

参数说明

  • securities: 股票代码列表(如 ['600000.XSHG', '000001.XSHE'])。
  • factors: 因子(object)列表,通常是继承自 Factor 类的自定义因子实例列表。
  • start_date: 开始日期(字符串或 datetime 对象)。
  • end_date: 结束日期。在回测中使用时,注意应该保证截止日期小于 context.current_dt
  • use_real_price: 是否使用真实价格。默认为 False,表示使用后复权价格。
  • skip_paused: 是否跳过停牌。默认为 False。注意:当 dependencies 使用的因子为价量信息,且 skip_paused = True 时,返回的 DataFrame 的索引由 datetime 变为 int,值越大表示离『当前』日期越近。其他情况下,返回的 DataFrame 的索引为 datetime。

返回值

返回一个 dict 对象:

  • key: 各 factors 的 name 属性。
  • value: 一个 pandas.DataFrame,DataFrame 的 index 是日期,column 是股票代码,value 是计算出的因子值。

使用示例

from jqfactor import Factor, calc_factors
import numpy as np

# 自定义一个因子
class ALPHA013(Factor):
    name = 'alpha013_name'
    max_window = 1
    dependencies = ['high','low','volume','money']
    def calc(self, data):
        high = data['high']
        low = data['low']
        vwap = data['money']/data['volume']
        return (np.power(high*low,0.5) - vwap).mean()

# 定义股票池
securities = ['600000.XSHG','600016.XSHG']

# 计算因子值
factors = calc_factors(securities, [ALPHA013()], start_date='2017-01-01', end_date='2017-02-01', use_real_price=False, skip_paused=False)

# 查看因子值
print(factors['alpha013_name'].head())

如何进行中性化、标准化和去极值?

既然 calc_factors 返回的是原始因子值,您可以使用聚宽提供的以下函数对返回的 DataFrame 进行后续处理:

1. 中性化 (neutralize)

from jqfactor import neutralize
# 对因子数据进行行业和市值中性化
neutralize(factor_df, how=['jq_l1', 'market_cap'], date='2018-05-02', axis=1)

2. 标准化 (standardlize)

from jqfactor import standardlize
# 对因子数据进行 Z-score 标准化
standardlize(factor_df, inf2nan=True, axis=1)

3. 去极值 (winsorize / winsorize_med)

from jqfactor import winsorize, winsorize_med
# MAD 中位数去极值
winsorize_med(factor_df, scale=3, inclusive=True, inf2nan=True, axis=1)

# 分位数去极值
winsorize(factor_df, qrange=[0.05, 0.95], inclusive=True, inf2nan=True, axis=1)

总结:在多因子策略模板中,通常的流程是先通过 calc_factors(或 get_factor_values)获取原始因子值,然后再依次调用去极值、标准化、中性化函数对数据进行清洗,最后再用于打分或回归模型训练。