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

如何在 JoinQuant 中计算因子的纯收益率(剔除行业与风格影响)?

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

问题描述

因子收益率计算

请教一下,如果想计算一个因子的去掉行业和常见风格因子的纯收益率,第一步,先对该因子进行行业和常见风格因子中性化,取残差作为新的因子值。第二步是直接用这个残差后的因子值和收益做回归取回归系数作为该因子的纯收益率吗?还是将行业+风格因子+因子值(取残差后)一起和收益率做回归得到的系数作为因子纯收益率?望指点

解决方案

在多因子模型中,计算一个因子的纯收益率(Pure Factor Return),即剔除行业和常见风格因子影响后的收益率,是一个非常经典的问题。针对你的疑问,答案是:在数学上,这两种方法是等价的;但在实际操作中,通常有更标准的做法。

理论解答:Frisch-Waugh-Lovell (FWL) 定理

根据计量经济学中的 FWL 定理,以下两种方法得到的回归系数是完全相同的:

  1. 方法一(你提到的两步法)

    • 第一步:将目标因子对行业和风格因子进行多元回归,取残差(即中性化后的因子值)。
    • 第二步:将股票收益率对**中性化后的因子值(残差)**进行单变量回归。得到的回归系数就是该因子的纯收益率。
  2. 方法二(多元截面回归法)

    • 直接将股票收益率目标因子(原始值)行业因子风格因子一起进行多元截面回归。目标因子对应的回归系数,就是该因子的纯收益率。

注意:如果你在第一步取了残差,然后在第二步将“行业 + 风格 + 残差”一起和收益率做回归,得到的残差系数依然和上述两种方法一样。因为残差已经与行业和风格正交(线性无关),多元回归时不会产生多重共线性影响。

实际操作建议

在业界和学术界(如 Fama-MacBeth 回归或 Barra 风险模型),通常采用方法二,即直接将所有因子(目标因子、行业哑变量、风格因子)放在一起与下期收益率做多元截面回归。这样不仅一步到位,而且可以直接得到所有因子的纯收益率。

如果你只是想评估单因子的表现,方法一(先中性化,再用残差构建多空组合或做单变量回归)也是非常常见且直观的做法。

在 JoinQuant 中的实现

在 JoinQuant 平台上,你可以非常方便地使用内置的因子分析工具来实现这一过程。

1. 使用 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)

2. 使用 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)

总结

  • 数学上:先取残差再单回归,与放在一起多元回归,得到的因子收益率系数是等价的。
  • 实践中:如果你想严谨地计算 Barra 体系下的纯因子收益,建议用多元截面回归;如果你想做单因子分位数回测,建议先用 neutralize 剔除行业和风格影响,再用残差因子值去计算分组收益或加权收益。