问题描述
为什么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 因子构建说明,数据处理经历了多重步骤:
- 先对底层的描述因子(对于 size 因子来说,底层描述因子就是
natural_log_of_market_cap)进行去极值和市值加权标准化。 - 处理缺失值填充。
- 最后,对合成后的风格因子(虽然 size 因子只有一个描述因子,但依然走此流程)再次进行市值加权标准化和去极值。
总结与复现建议
以 000001.XSHE 为例,由于平安银行属于超大市值股票,在“市值加权均值”的计算逻辑下,大盘股对均值的拉动作用极大。手动算术平均算出的均值偏小,会导致平安银行的手动标准化得分偏高;而市值加权均值较大,平安银行在 Barra 模型中的实际标准化得分会被拉低。
如果您希望手动复现 JoinQuant 的 Barra Size 因子,请严格按照以下步骤编写代码:
- 获取全市场股票的
market_cap,取自然对数。 - 计算全市场对数市值的市值加权平均值(即
sum(log_cap * cap) / sum(cap))。 - 减去市值加权平均值,除以普通标准差。
- 将超过 2.5 倍标准差的值截断(去极值)。
- (可选)严格按照官方文档再进行一次标准化和去极值流程以对齐最终输出。