横截面标准化与中性化
引言
在量化投资的因子研究中,横截面处理(Cross-sectional Processing)是最容易被忽视,却是最关键的技术环节。它不仅仅是一种数学技巧,更是一种投资哲学的转变:从”预测绝对价格”到”预测相对强弱”。
本文将深入探讨横截面标准化的三大核心工具:Z-score、Rank和Neutralization,从数学原理到金融含义,从理论推导到实践应用,全面解析量化投资的横截面工程。
1. Z-score数学原理
1.1 标准化公式推导
Z-score(标准分数)是最常用的标准化方法,它将数据转换为标准正态分布。在横截面处理的语境下,Z-score将同一时刻所有资产的因子值标准化。
基础公式
对于 时刻的横截面数据 ,其中 是资产数量,Z-score定义为:
其中:
- 是 时刻的横截面均值
- 是横截面标准差
性质证明
性质1:标准化后的均值为0
证明:
性质2:标准化后的方差为1
证明:
性质3:Z-score对线性变换不变
对于线性变换 (),标准化后的结果相同:
证明:
这个性质非常重要:无论原始因子的量纲和单位如何,标准化后都统一到相同的尺度。
1.2 金融意义:偏离均值的标准差倍数
Z-score在金融中的含义远不止”标准化”,它度量的是一个资产相对于横截面平均水平的位置。
解释维度
维度1:相对强弱
- :资产 的因子值等于横截面平均水平
- :资产 的因子值比平均水平高1个标准差
- :资产 的因子值比平均水平低1个标准差
- :资产 的因子值显著高于平均水平(正态分布下约2.3%概率)
- :资产 的因子值显著低于平均水平(正态分布下约2.3%概率)
维度2:风险度量
Z-score可以视为风险暴露的度量:
- 大:该资产的因子值显著偏离平均水平,可能是高暴露或高风险
- 小:该资产的因子值接近平均水平,暴露正常
维度3:标准化信号
标准化后的信号可以作为模型输入:
- 多个不同单位的因子(PE、ROE、波动率)可以线性组合
- 模型训练更稳定(避免数值问题)
- 因子权重可解释性更强
实际案例
假设我们有3只股票的PE值:
- 股票A:PE = 30
- 股票B:PE = 20
- 股票C:PE = 10
步骤1:计算均值和标准差
步骤2:计算Z-score
解读
- 股票A:PE比平均水平高1.22个标准差,属于”高估值”股票
- 股票B:PE等于平均水平,属于”中性估值”股票
- 股票C:PE比平均水平低1.22个标准差,属于”低估值”股票
如果我们在做价值投资(低PE买入),那么股票C是最佳选择(Z-score最小)。
1.3 跨因子可加性的数学证明
Z-score标准化的核心价值在于:不同单位、不同量纲的因子可以线性组合。
问题提出
假设我们有两个因子:
- 因子1:PE(市盈率),单位是倍数,范围[5, 100]
- 因子2:ROE(净资产收益率),单位是百分比,范围[-10%, 30%]
如果我们想构建综合因子:
问题:
- PE的值是ROE的3-10倍,ROE的权重会被PE淹没
- 不同单位无法直接比较
解决方案:Z-score标准化
对两个因子分别标准化:
构建综合因子:
可加性证明
我们要证明:标准化后的因子满足”可加性”,即不同因子的贡献是可比的。
命题:对于任意两个因子 和 ,标准化后 和 在同一尺度上。
证明:
标准化后的因子满足:
因此:
其中 是相关系数。
关键点:
- 和 都在相似的范围(均值0,方差1)
- 权重 直接反映因子的相对重要性
- 意味着两个因子同等重要
实际应用
假设我们构建价值因子:
解读:
- 低PE( 小)是好
- 高ROE( 大)是好
- 因此:PE取负号,ROE取正号
如果不标准化:
问题:
- PE ≈ 30,ROE ≈ 0.15
- PE项 = 18,ROE项 = -0.06
- ROE的贡献几乎可以忽略,被PE完全淹没
1.4 时序Z-score vs 横截面Z-score
Qlib中Z-score有两种计算方式:时序(Time-Series)和横截面(Cross-Sectional),它们的金融含义完全不同。
时序Z-score
对于资产 在时间 的因子值 ,时序Z-score定义为:
其中:
- 是资产 的时序均值
- 是时序标准差
金融含义:
- 度量资产 的因子值相对于自身历史的位置
- :当前值比历史平均高1个标准差
- :当前值比历史平均低1个标准差
应用场景:
- 动量因子:当前价格是否显著高于历史平均
- 均值回归策略:当前值是否显著偏离历史均值
横截面Z-score
对于 时刻的横截面数据 ,横截面Z-score定义为:
其中:
- 是 时刻的横截面均值
- 是横截面标准差
金融含义:
- 度量资产 相对于其他资产的位置
- :当前值比其他资产平均水平高1个标准差
- :当前值比其他资产平均水平低1个标准差
应用场景:
- 相对强弱:当前资产是否比其他资产强
- 横截面选股:选出比其他资产表现好的股票
对比分析
| 维度 | 时序Z-score | 横截面Z-score |
|---|---|---|
| 比较基准 | 自身历史 | 其他资产 |
| 计算维度 | 时间维度 | 资产维度 |
| 金融含义 | 当前是否偏离历史平均 | 当前是否优于其他资产 |
| 策略类型 | 均值回归、趋势跟踪 | 相对强弱、多因子选股 |
| Qlib默认 | 否 | 是 |
实际案例
假设我们有2只股票5天的价格:
| 时间 | 股票A价格 | 股票B价格 |
|---|---|---|
| Day 1 | 100 | 50 |
| Day 2 | 110 | 55 |
| Day 3 | 120 | 60 |
| Day 4 | 130 | 65 |
| Day 5 | 140 | 70 |
时序Z-score(对每只股票单独计算)
股票A:
- Day 5:
股票B:
- Day 5:
解读:
- 两只股票在Day 5都比各自历史高1.26个标准差
- 如果做均值回归,都应该卖出
横截面Z-score(对每一天单独计算)
Day 5:
解读:
- 股票A比股票B强2个标准差()
- 如果做多空策略:买入股票A,做空股票B
关键差异
时序Z-score关注”当前是否偏离历史”,横截面Z-score关注”当前是否优于其他”。在多因子选股中,我们更关注后者,因此Qlib默认使用横截面Z-score。
2. Rank标准化
2.1 Rank公式与离散化
Rank标准化将连续的因子值转换为离散的排序位置,再缩放到 区间。它是对异常值最鲁棒的标准化方法。
基础公式
对于 时刻的横截面数据 ,Rank标准化定义为:
其中 是 在 中的排序位置(从1开始,1是最小值,N是最大值)。
离散化过程
Rank标准化实际上是三步过程:
Step 1:排序 将连续值 转换为离散的排序位置
Step 2:平移 将排序位置从 平移到
Step 3:缩放 将排序位置从 缩放到
性质
性质1:输出在 区间
证明:
- 最小值:
- 最大值:
- 任意值:
性质2:均匀分布
在无重复值的情况下,排序后的值在 上均匀分布:
这意味着:
- 排名前10%的股票
- 排名后10%的股票
性质3:对单调变换不变
对于任意单调递增函数 ,标准化后的排序不变:
证明: 单调递增函数保持顺序:
因此排序位置相同:
这个性质非常重要:Rank只关心”谁比谁大”,不关心大多少。
2.2 异常值处理的鲁棒性证明
Rank标准化最大的优势在于对异常值(Outlier)的鲁棒性。
问题场景
假设我们有4只股票的PE值:
- 股票A:PE = 15
- 股票B:PE = 20
- 股票C:PE = 25
- 股票D:PE = 10000 ← 异常值(数据错误或极端情况)
Z-score标准化
步骤1:计算均值和标准差
步骤2:计算Z-score
问题分析:
- 股票D的异常值(10000)严重影响了均值和标准差
- A、B、C三只股票的Z-score几乎相同(-0.58),无法区分
- 股票D的Z-score是1.73,看起来不极端,但实际上它是严重异常值
Rank标准化
步骤1:排序
步骤2:标准化
优势分析:
- 股票D的异常值只影响它自己的排序(第4名),不影响其他股票
- A、B、C三只股票的排序清晰区分(0, 0.33, 0.67)
- 股票D虽然是异常值,但在Rank中只是”第4名”,不会拉高或拉低其他股票的分数
鲁棒性证明
命题:Rank标准化对异常值不敏感。
证明:
设横截面数据 ,其中 是异常值(远大于其他数据)。
Z-score的影响:
当 ()时,,均值被拉高。
当 很大时, 很大,标准差被拉高。
对于正常数据 ():
由于 和 都被 拉高, 的值会变得接近,难以区分。
Rank的影响:
对于任意 :
排序不受 的大小影响,只受相对大小影响。
只影响它自己的排序,不影响其他数据的排序位置。
2.3 适用场景分析
Rank标准化在以下场景中表现优异:
场景1:因子分布严重偏态
如果因子的分布不是正态分布,而是严重偏态(如指数分布、幂律分布),Z-score的效果会变差。
案例:市值因子
大多数股票的市值较小,少数股票市值巨大(如茅台、腾讯)。市值的分布是右偏的(长尾分布)。
- Z-score:会被大市值股票拉高均值和标准差,中小市值股票的Z-score会集中在负值区域
- Rank:不受分布形状影响,只看相对排序
场景2:存在极端异常值
如果因子中存在极端异常值(数据错误、黑天鹅事件),Z-score会失效。
案例:停牌后复牌的股票
某股票停牌3年后复牌,涨了10倍。这个极端值会严重拉高Z-score的均值和标准差。
- Z-score:受极端值影响严重
- Rank:异常值只是”第1名”,不影响其他股票
场景3:只关注相对强弱
如果你的策略只关心”哪个股票比哪个强”,而不关心强多少,Rank是最佳选择。
案例:多空对冲策略
做多前20%股票,做空后20%股票。策略只关心排名,不关心具体分数。
- Z-score:需要选择阈值(如 ),阈值的选择会影响策略
- Rank:直接选前20%(),阈值清晰
场景4:非线性关系
如果因子与收益的关系是非线性的,Rank可以捕捉到这种非线性。
案例:动量因子
动量与收益的关系可能是非线性的:
-
动量前10%:收益最高
-
动量10%-50%:收益中等
-
动量后50%:收益最低
-
Z-score:假设线性关系,可能忽略非线性结构
-
Rank:自然处理非线性,只看排序分组
不适用场景
场景1:需要精确比较
如果需要精确比较两个因子的值,Rank不适用,因为它丢失了数值信息。
案例:风险管理
如果需要计算因子的波动率、VaR等,Z-score更合适。
场景2:因子分布接近正态
如果因子的分布接近正态分布,Z-score的统计性质更好(均值0、方差1)。
案例:因子组合的权重计算
Z-score的均值为0、方差为1,便于理论推导和权重计算。
3. Neutralization回归模型
3.1 数学推导
Neutralization(中性化)是横截面处理中最复杂、最强大的工具。它的核心思想是通过回归剔除”作弊因素”(如行业、市值),只保留”纯Alpha”。
线性回归模型
对于 时刻的横截面数据,我们构建多元线性回归模型:
其中:
- :资产 的因子值(如PE、ROE、动量等)
- :截距项
- :第 个控制变量的回归系数
- :资产 在第 个控制变量上的暴露(如行业哑变量、市值)
- :残差(中性化后的因子值)
矩阵形式
设:
- :因子值向量
- :控制变量矩阵
- :回归系数向量
- :残差向量
回归方程:
OLS估计
通过最小二乘法估计 :
求导:
令导数为0:
残差计算
其中 是投影矩阵(Hat Matrix)。
中性化后的因子
3.2 行业中性化
目的
剔除行业因子暴露,确保因子收益不来自行业轮动。
场景示例
假设你有3只股票:
- 股票A:行业=白酒,因子值=10
- 股票B:行业=白酒,因子值=8
- 股票C:行业=科技,因子值=9
不中性化的问题
如果白酒板块整体上涨(行业Beta),股票A和B的收益部分来自行业因子,而不是你的因子有效。
中性化过程
步骤1:构造行业哑变量
构造行业哑变量矩阵 :
其中:
- 第1列:截距项(全为1)
- 第2列:白酒行业哑变量(1=是,0=否)
- 第3列:科技行业哑变量(1=是,0=否)
步骤2:回归
计算 :
步骤3:计算残差
解读
- 股票A:残差=10,说明它比白酒行业平均(9)高1
- 股票B:残差=8,说明它比白酒行业平均(9)低1
- 股票C:残差=0,说明它等于科技行业平均(9)
经济含义
是”剔除行业因素后的纯Alpha”:
- 股票A的因子收益中,剔除行业贡献后,还剩10
- 股票B的因子收益中,剔除行业贡献后,只剩8
- 股票C的因子收益中,科技行业贡献了9,纯Alpha为0
3.3 市值中性化
目的
剔除市值风格因子暴露,确保因子收益不来自大小盘风格切换。
场景示例
假设我们有4只股票:
| 股票 | 行业 | 市值(亿) | 因子值 |
|---|---|---|---|
| A | 白酒 | 100 | 10 |
| B | 白酒 | 100 | 8 |
| C | 科技 | 50 | 9 |
| D | 科技 | 50 | 7 |
回归模型
其中:
- :行业哑变量(1=白酒,0=科技)
- :对数市值(市值通常服从对数正态分布)
构造控制变量矩阵
计算残差
(省略详细计算,假设回归结果为 )
经济含义
是”剔除行业和市值效应后的纯Alpha”:
- 股票A的因子值=10,但考虑到行业效应(+0.5)和市值效应(),纯Alpha≈7.19
- 股票B的因子值=8,纯Alpha≈5.19
- 股票C的因子值=9,但市值较小(),纯Alpha≈7.04
- 股票D的因子值=7,纯Alpha≈5.04
3.4 双重中性化
定义
同时进行行业中性化和市值中性化,剔除两个维度的”作弊因素”。
回归模型
其中:
- :行业 的哑变量( 个行业)
- :行业 的回归系数
- :对数市值
- :残差(双重中性化后的因子)
残差的经济含义
表示:
- 剔除了行业效应(同一行业内的股票)
- 剔除了市值效应(同等市值下的股票)
- 剩下的才是”纯选股能力”
3.5 残差的可解释性证明
命题1:残差均值为0
证明:
由于 是OLS估计,满足正规方程:
即:
取第一行(截距项,):
命题2:残差与控制变量正交
证明:
代入 :
因此:
金融含义
残差与控制变量不相关,说明:
- 残差中不包含行业因子(如果控制变量包含行业哑变量)
- 残差中不包含市值因子(如果控制变量包含市值)
- 残差是”剔除了风格因子后的纯Alpha”
4. 三者组合实践
4.1 最佳实践流程
横截面处理通常是多个步骤的组合,最佳实践流程如下:
Step 1:Z-score标准化
将不同单位的因子标准化到同一尺度:
Step 2:中性化
剔除行业、市值等风格因子:
其中 是控制变量矩阵(行业、市值等), 是回归系数。
Step 3:二次标准化(可选)
中性化后,因子的分布可能偏离标准正态分布,可以再次标准化:
4.2 顺序依赖关系
顺序A:Z-score → Neutralize ✓
这是正确的顺序。
理由:
- Z-score将不同单位的因子标准化(如PE和ROE)
- 标准化后的因子在同一尺度上,可以放入同一个回归模型
- 中性化时,回归系数 的单位统一,解释性更强
顺序B:Neutralize → Z-score ✗
这是错误的顺序。
问题:
- 中性化前的因子量纲不同(PE=倍数,ROE=百分比)
- 回归系数 的单位不统一,解释性差
- 不同因子的残差不在同一尺度上,难以比较
4.3 性能优化技巧
技巧1:向量化回归
对于大型数据集(如A股5000只股票),应该使用向量化回归,而不是for循环:
慢(for循环):
for t in time_grid:
for i in range(N):
residual[i] = factor[i] - sum(beta[j] * control[i, j] for j in range(K))快(向量化):
residual = factor - X @ beta技巧2:行业哑变量稀疏矩阵存储
行业哑变量矩阵 是稀疏的(大部分元素为0),应该使用稀疏矩阵存储:
节省内存:
- 密集矩阵: 个float,约 MB
- 稀疏矩阵:只存储非零元素,约 MB(节省96%)
技巧3:批量中性化
对于时间序列数据,可以批量中性化:
# 一次性中性化所有时刻
residual_matrix = factor_matrix - X @ beta_matrix而不是逐时刻中性化:
# 逐时刻中性化(慢)
for t in range(T):
residual_matrix[t] = factor_matrix[t] - X @ beta[t]5. 总结
横截面标准化与中性化是量化投资中从”绝对预测”到”相对强弱”转变的关键技术。
核心要点回顾
-
Z-score:
- 公式:
- 金融含义:偏离均值的标准差倍数
- 优势:不同单位因子可线性组合
- 劣势:对异常值敏感
-
Rank:
- 公式:,其中 是排序位置
- 金融含义:只在乎”谁比谁强”,不在乎强多少
- 优势:对异常值鲁棒
- 劣势:丢失数值信息
-
Neutralization:
- 公式:
- 金融含义:剔除风格因子后的纯Alpha
- 优势:纯化信号,剥离风格暴露
- 劣势:计算复杂
-
组合实践:
- 最佳顺序:Z-score → Neutralize → (可选)再次标准化
- 性能优化:向量化回归、稀疏矩阵、批量处理
量化投资哲学的转变
通过横截面标准化和中性化,量化投资的思维发生了质的变化:
从”预测价格”到”预测相对强弱”:
- 传统:预测股票A明天涨不涨
- 现代:预测股票A明天是否比股票B强
从”赚取Beta”到”提取Alpha”:
- 传统:赌行业轮动、风格切换
- 现代:剔除风格,只捕获纯Alpha
从”追求精确”到”追求稳定”:
- 传统:预测具体价格(难)
- 现代:预测相对排名(容错率高)
横截面处理不是数学技巧,而是一种投资策略:
我们不赌国运涨跌,也不赌行业轮动,我们只赌”同一环境下,谁比谁强”。
在下一文档中,我们将深入探讨另一个核心主题:Horizon对齐(Label Shift),这是消除未来函数并建立因果预测关系的关键技术。