问题描述
因子分析的文档里面,有 neutralize 和 standardlize 两个函数,但是没讲具体算法。请问这俩具体的算法是什么样的?standardlize 是 zscore 还是取对数还是什么算法呢?
顺便提一下,中性化这个函数的文档可能是从标准化复制过来的,有点地方没改全,“表示沿哪个方向做标准化,0 为对每列做中性化,1 为对每行做中性化” 这里的标准化应被替换为中性化。
解决方案
非常感谢您指出的文档笔误!确实,neutralize 函数文档中的“标准化”应为“中性化”。关于这两个函数在 JoinQuant 平台底层的具体算法,详细解答如下:
1. 标准化 standardlize 的具体算法
standardlize 函数使用的是 Z-score 标准化(Z-score normalization) 算法,而不是取对数。
具体算法公式:
$$ Z = \frac{X - \mu}{\sigma} $$
- $X$:原始的因子值。
- $\mu$:该组数据的均值(Mean)。
- $\sigma$:该组数据的标准差(Standard Deviation)。
参数说明:
axis参数决定了计算均值和标准差的方向。如果axis=1(默认),则是对横截面(即同一时间点上的所有股票)进行标准化;如果axis=0,则是对时间序列(即同一股票在不同时间点上)进行标准化。- 经过 Z-score 标准化后,因子值的分布将转化为均值为 0、标准差为 1 的标准分布,这有助于消除不同因子之间量纲和数量级的差异,方便后续的等权或加权合成。
2. 中性化 neutralize 的具体算法
neutralize 函数使用的是 基于普通最小二乘法(OLS)的多元线性回归 算法,提取回归的**残差(Residuals)**作为中性化后的因子值。
具体算法逻辑:
假设我们要对因子 $Y$ 进行行业和市值中性化。
-
构建回归方程:
$$ Y = \beta_0 + \beta_1 \cdot X_{市值} + \sum_{i=1}^{N} \beta_{2,i} \cdot X_{行业_i} + \epsilon $$- $Y$:待中性化的原始因子值(因变量)。
- $X_{市值}$:市值因子(通常是对数市值
ln_market_cap)。 - $X_{行业_i}$:行业哑变量(Dummy Variables)。如果股票属于该行业则为 1,否则为 0。
- $\epsilon$:回归残差。
-
求解与提取残差:
平台底层会使用 OLS 拟合上述方程,求出各个 $\beta$ 系数。然后计算出残差 $\epsilon$:
$$ \epsilon = Y - (\hat{\beta_0} + \hat{\beta_1} \cdot X_{市值} + \sum \hat{\beta_{2,i}} \cdot X_{行业_i}) $$
这个残差 $\epsilon$ 就是中性化后的因子值。
参数说明:
how参数用于指定回归方程中的自变量(即你要剔除的影响因素)。例如how=['jq_l1', 'market_cap'],底层就会自动获取聚宽一级行业的哑变量矩阵和市值数据作为自变量 $X$ 进行回归。- 通过这种正交化处理,残差 $\epsilon$ 与市值和行业因子线性无关(相关系数为 0),从而实现了“纯化”因子的目的,确保因子收益不会受到行业分布不均或大小盘风格的干扰。
总结
standardlize= Z-score 转换(去量纲,均值0标准差1)。neutralize= OLS 线性回归取残差(剔除共线性,纯化因子)。
这两个步骤是多因子模型(Alpha 模型)数据清洗和预处理中最核心的环节。