3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在多因子模型中,计算一个因子的纯收益率(Pure Factor Return),即剔除行业和常见风格因子影响后的收益率,是一个非常经典的问题。针对你的疑问,答案是:在数学上,这两种方法是等价的;但在实际操作中,通常有更标准的做法。
根据计量经济学中的 FWL 定理,以下两种方法得到的回归系数是完全相同的:
方法一(你提到的两步法):
方法二(多元截面回归法):
注意:如果你在第一步取了残差,然后在第二步将“行业 + 风格 + 残差”一起和收益率做回归,得到的残差系数依然和上述两种方法一样。因为残差已经与行业和风格正交(线性无关),多元回归时不会产生多重共线性影响。
在业界和学术界(如 Fama-MacBeth 回归或 Barra 风险模型),通常采用方法二,即直接将所有因子(目标因子、行业哑变量、风格因子)放在一起与下期收益率做多元截面回归。这样不仅一步到位,而且可以直接得到所有因子的纯收益率。
如果你只是想评估单因子的表现,方法一(先中性化,再用残差构建多空组合或做单变量回归)也是非常常见且直观的做法。
在 JoinQuant 平台上,你可以非常方便地使用内置的因子分析工具来实现这一过程。
neutralize 函数进行中性化你可以先使用 neutralize 函数对因子进行行业和市值(或其他风格)中性化,然后再计算收益。
import pandas as pd
import numpy as np
from jqfactor import neutralize, analyze_factor
# 假设 factor_data 是一个 DataFrame,index 为日期,columns 为股票代码,values 为原始因子值
# 对因子进行行业(聚宽一级行业)和市值中性化
neutralized_factor = neutralize(factor_data, how=['jq_l1', 'market_cap'], date='2023-01-01', axis=1)
# 然后将中性化后的因子传入 analyze_factor 进行单因子分析
far = analyze_factor(factor=neutralized_factor,
start_date='2023-01-01',
end_date='2023-06-01',
weight_method='avg',
industry='jq_l1',
quantiles=5,
periods=(1, 5, 20))
# 查看因子收益
print(far.mean_return_by_quantile)
analyze_factor 的内置参数JoinQuant 的 analyze_factor 及其返回的对象 far 提供了内置的行业中性化收益计算方法。你可以直接传入原始因子,在计算收益时指定 group_adjust=True。
# 直接传入原始因子
far = analyze_factor(factor=raw_factor_data, ...)
# 计算行业中性化后的各分位数收益
mean, std = far.calc_mean_return_by_quantile(by_date=False, by_group=False, demeaned=False, group_adjust=True)
# 计算因子值加权组合每日收益(纯因子收益的一种近似,cash-neutral & industry-neutral)
far.calc_factor_returns(demeaned=True, group_adjust=True)
neutralize 剔除行业和风格影响,再用残差因子值去计算分组收益或加权收益。