3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)的单因子分析工具(analyze_factor / jqfactor_analyzer)中,不能直接看到严格意义上的截面回归(OLS)得到的纯因子收益率。该工具主要提供的是分位数收益率和因子值加权组合收益率。
具体说明如下:
far.mean_return_by_quantile 等属性直接获取各分位数的平均收益率。权重 = 每日因子值 / 每日因子值的绝对值的和(正权重代表买入,负权重代表卖出)。你可以通过调用 far.calc_factor_returns(demeaned=True, group_adjust=False) 来获取这个每日收益率序列。如果你确实需要通过截面回归(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 回归得到。