问题描述
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 回归得到。