🚀 AI 一键生成 joinquant 策略代码

JoinQuant 归因分析中的风险模型与因子暴露度计算详解

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

问题描述

关于“归因分析”=>“因子分析”=>“风险分析”的几个问题

1. 是用的什么风险模型?CNE6 还是 CNE5?



2. 下面这个截图中的风险因子“暴露度”是怎么计算出来的?我个人认为应该是,对任何一个风险因子: 1)在回测期的每一天,计算投资组合对该因子的暴露度净值 Exp = dot(NMV, FactorLoading), 其中 NMV 是投资组合的净值向量,FactorLoading 是风险因子的暴露向量;2)在该天,计算该因子暴露度净值与投资组合的 GMV 的比值;3)在整个回测区间对上述比值取均值。麻烦确认我的理解是否正确。

09602ab0d4419a050b1c80180a9b4fc5


3. 能否提供可以用于研究环境的“归因分析”=>“因子分析”=>“风险分析”的函数。尤其是每一个风险因子自身的因子回报率时间序列(factor returns time series)、以及投资组合在每一个风险因子上的回报率时间序列(portfolio factor returns time series),如果能提供每一个风险因子上的收益时间序列(factor pnls time series)就更好。这几个时间序列的 cumulative 版本类同以下截图。

解决方案

关于您在 JoinQuant 平台上对“归因分析 -> 因子分析 -> 风险分析”的疑问,解答如下:

1. 使用的风险模型是 CNE5 还是 CNE6?

JoinQuant 平台使用的是 类 Barra CNE5 风险模型。根据官方文档说明,其横截面线性回归的截距项包含:10个风格因子11个行业因子(jq_l1)1个国家因子。这 10 个风格因子(市值、非线性市值、杠杆、账面市值比、成长、动量、盈利能力、贝塔、残差波动率、流动性)与 MSCI Barra CNE5 模型的标准十大风格因子结构完全一致。

2. 风险因子“暴露度”的计算逻辑

您的理解基本是正确的。在 JoinQuant 的风险分析中,投资组合的风险因子暴露度计算逻辑如下:

  1. 单日组合暴露度:在回测期的每一天,投资组合对某个风险因子的暴露度,等于组合内各只股票的权重(Weight)与该股票在该因子上的暴露度(Factor Loading)的加权求和。即 Exp_portfolio = sum(Weight_i * FactorLoading_i)
  2. 基准暴露度:文档中明确指出,“基准风险因子暴露度为沪深300指数股票池中股票风险暴露的市值加权平均”。
  3. 暴露度差值(主动暴露):页面上展示的“风险因子暴露差值”代表了策略组合的风险敞口暴露,即 组合风险暴露 - 基准(HS300)风险暴露。如果差值接近0,说明策略组合对该风险因子是风险中性的。
  4. 区间均值:图表中展示的通常是整个回测区间内上述每日暴露度(或暴露度差值)的时间序列均值

3. 研究环境中的归因分析与风险分析函数

在 JoinQuant 的研究环境中,虽然没有直接提供一键生成 Web 端完整归因图表的单一函数,但您可以通过 jqfactor 库和 get_backtest 接口自行提取和计算这些时间序列数据:

获取回测的整体风险指标:
您可以使用 get_backtest 获取回测对象,然后调用相关方法:

from jqdata import *
gt = get_backtest('您的回测ID')
risk_dict = gt.get_risk()          # 获取总的风险指标
period_risks = gt.get_period_risks() # 获取分月计算的风险指标

获取因子回报率时间序列 (Factor Returns Time Series):
您可以使用 jqfactor 库中的 analyze_factor 进行单因子分析,并提取因子的每日收益率:

from jqfactor import analyze_factor, get_factor_values

# 1. 获取风险因子(例如市值因子 size)的因子值
factor_data = get_factor_values(securities=您的股票池, factors=['size'], start_date='2023-01-01', end_date='2023-12-31')['size']

# 2. 进行因子分析
far = analyze_factor(factor=factor_data, weight_method='mktcap', industry='jq_l1')

# 3. 计算因子收益率(Factor Returns)
# calc_factor_returns 返回按因子值加权组合的每日收益
factor_returns = far.calc_factor_returns(demeaned=True, group_adjust=False)

获取投资组合在风险因子上的回报率 (Portfolio Factor PnL):
要计算投资组合在特定风险因子上的收益贡献,您需要结合组合的每日持仓权重和因子的每日收益率:

  1. 使用 gt.get_positions() 获取回测每天的持仓明细,计算出每天每只股票的实际权重。
  2. 使用 get_factor_values 获取对应风险因子的每日 Factor Loading。
  3. 计算每日组合的因子暴露度:Daily_Exposure = sum(Weight_i * FactorLoading_i)
  4. 组合在该因子上的每日收益贡献 = Daily_Exposure * 因子当日收益率 (Factor Return)
  5. 对上述每日收益贡献求累加(Cumulative Sum),即可得到类似 Web 端截图中的 Cumulative Portfolio Factor Returns 曲线。