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

JoinQuant 因子分析工具 (jqfactor_analyzer) 能否获取回归因子收益率?

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

问题描述

jqfactor_analyzer问题

jqfactor_analyzer能看到因子收益率吗?回归得到的那个。
是不是只能看到分位收益率?

解决方案

在 JoinQuant(聚宽)的单因子分析工具(analyze_factor / jqfactor_analyzer)中,不能直接看到严格意义上的截面回归(OLS)得到的纯因子收益率。该工具主要提供的是分位数收益率因子值加权组合收益率

具体说明如下:

1. 工具内置的收益率类型

  • 分位数收益率 (Quantile Returns):这是最直观的,工具默认会计算。你可以通过 far.mean_return_by_quantile 等属性直接获取各分位数的平均收益率。
  • 因子加权组合收益率 (Factor-Weighted Returns):虽然不是回归系数,但单因子分析中常将其作为因子收益率的替代。它的计算逻辑是:权重 = 每日因子值 / 每日因子值的绝对值的和(正权重代表买入,负权重代表卖出)。你可以通过调用 far.calc_factor_returns(demeaned=True, group_adjust=False) 来获取这个每日收益率序列。

2. 如何获取截面回归的因子收益率?

如果你确实需要通过截面回归(Cross-Sectional Regression)得到的因子收益率(即每期将下期股票收益率对当期因子值进行回归得到的回归系数),你需要自己提取清洗后的数据进行计算

analyze_factor 提供了一个非常方便的属性 far.clean_factor_data,它包含了去极值、标准化(或中性化)后的因子值以及对应的下期收益率(forward_return)。你可以利用这个数据自己做回归。

示例代码:自己计算截面回归因子收益率

import pandas as pd
import statsmodels.api as sm
from jqfactor import analyze_factor

# 假设你已经运行了 analyze_factor 得到了 far 对象
# far = analyze_factor(factor=..., start_date=..., ...)

# 1. 获取清洗后的因子数据和下期收益率
# clean_factor_data 包含多重索引 (date, asset),列包含因子值(factor)和各周期的下期收益率(如 1D)
clean_data = far.clean_factor_data

# 2. 定义一个按天进行截面回归的函数
def cross_sectional_regression(df, factor_col='factor', return_col='1D'):
    # 提取自变量 X (因子值) 和 因变量 Y (下期收益率)
    X = df[factor_col]
    Y = df[return_col]
    
    # 剔除缺失值
    valid_idx = X.notna() & Y.notna()
    X = X[valid_idx]
    Y = Y[valid_idx]
    
    if len(X) < 2:
        return pd.Series({'factor_return': np.nan})
        
    # 添加常数项 (截距)
    X = sm.add_constant(X)
    
    # OLS 回归
    model = sm.OLS(Y, X)
    results = model.fit()
    
    # 返回因子的回归系数作为因子收益率
    return pd.Series({'factor_return': results.params.get(factor_col, np.nan)})

# 3. 按日期 (level=0) 分组进行回归
# 假设我们看 1 天调仓的收益率,列名通常为 '1D'
regression_factor_returns = clean_data.groupby(level=0).apply(
    cross_sectional_regression, 
    factor_col='factor', 
    return_col='1D'
)

# 查看回归得到的每日因子收益率
print(regression_factor_returns.head())

总结

  • 直接调用:只能看到分位数收益率因子加权组合收益率calc_factor_returns)。
  • 回归收益率:需要提取 far.clean_factor_data,自己写几行代码用 statsmodels 按天做 OLS 回归得到。