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

为什么 JoinQuant Barra Size 因子与手动计算的市值对数标准化结果不同?

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

问题描述

Barra因子数值问题

为什么Barra因子中的size因子,和用JQDATA下载的市值数据取对数并做同样标准化去极值的操作,二者相比数值和趋势都不一样?(以000001.XSHE为例)

解决方案

您好!在 JoinQuant 平台中,直接获取的 Barra size 因子与您手动下载市值取对数并做常规去极值、标准化处理后存在差异,主要是因为 JoinQuant 对 Barra 风格因子的底层数据处理逻辑比常规的截面处理更为复杂。具体差异体现在以下几个核心处理步骤:

1. 标准化时的“市值加权均值”差异

常规的标准化(Z-score)通常是减去算术平均值并除以标准差。但在 JoinQuant 的 Barra 因子计算中,标准化是采用“市值加权”的

  • 公式x = (x - mean(x)) / std(x)
  • 差异点:这里的 mean(x) 是使用股票的市值加权均值,而不是简单的算术平均值;而标准差 std(x) 依然是正常标准差。如果您手动计算时使用的是算术平均值,这会导致所有股票的因子暴露度发生整体偏移,趋势也会有所不同。

2. 去极值(Winsorize)的严格定义

JoinQuant 对描述因子和风格因子进行的去极值处理有严格的参数设定:

  • 边界设定:将 2.5倍标准差 之外的值,赋值成 2.5 倍标准差的边界值。如果您手动去极值时使用的是 MAD 法(中位数去极值)或者分位数法(如 5%~95%),数值必然会产生差异。

3. 缺失值填充逻辑(行业内回归)

在计算 Barra 因子时,JoinQuant 会对缺失值进行特殊处理:

  • 按照聚宽一级行业分行业,以不缺失的股票因子值相对于市值的对数进行回归,利用回归结果对缺失值进行填充。这会间接影响截面上的均值和标准差,从而影响最终所有股票的标准化结果。

4. 多重处理(Double Processing)

根据 JoinQuant 的 Barra 因子构建说明,数据处理经历了多重步骤:

  1. 先对底层的描述因子(对于 size 因子来说,底层描述因子就是 natural_log_of_market_cap)进行去极值市值加权标准化
  2. 处理缺失值填充。
  3. 最后,对合成后的风格因子(虽然 size 因子只有一个描述因子,但依然走此流程)再次进行市值加权标准化去极值

总结与复现建议

000001.XSHE 为例,由于平安银行属于超大市值股票,在“市值加权均值”的计算逻辑下,大盘股对均值的拉动作用极大。手动算术平均算出的均值偏小,会导致平安银行的手动标准化得分偏高;而市值加权均值较大,平安银行在 Barra 模型中的实际标准化得分会被拉低。

如果您希望手动复现 JoinQuant 的 Barra Size 因子,请严格按照以下步骤编写代码:

  1. 获取全市场股票的 market_cap,取自然对数。
  2. 计算全市场对数市值的市值加权平均值(即 sum(log_cap * cap) / sum(cap))。
  3. 减去市值加权平均值,除以普通标准差。
  4. 将超过 2.5 倍标准差的值截断(去极值)。
  5. (可选)严格按照官方文档再进行一次标准化和去极值流程以对齐最终输出。