第16章:主成分分析:对宏观指标进行降维、提取宏观因子、因子与曲面的关系
做波动率曲面交易的朋友,经常会遇到一个头疼的问题——宏观指标太多了。
GDP、CPI、PMI、失业率、消费者信心指数、工业增加值……光看这些名字就眼花。更别说它们之间还高度相关,你拿来做回归,多重共线性直接让你模型崩掉。
我早年做宏观因子模型时,就吃过这个亏。一口气塞了20多个指标进模型,结果R²倒是挺高,但一换样本期就彻底失效。后来才明白,指标多不代表信息多,很多都是冗余的噪音。
那怎么办?降维。
主成分分析(PCA)就是干这个的。它能把一堆乱七八糟的宏观指标,压缩成几个互不相关的“宏观因子”。每个因子背后,其实代表了一类经济驱动力。
核心思想:PCA不是简单地扔掉数据,而是找到数据中方差最大的方向。说白了,就是找出那些最能解释宏观波动的“隐形力量”。
16.1 为什么宏观指标需要降维?
我举个例子你就明白了。
假设你手里有10个宏观指标:工业产出、零售销售、出口额、进口额、M2、社融、CPI、PPI、PMI、失业率。你想想看,工业产出和PMI是不是高度相关?M2和社融是不是几乎同步?CPI和PPI也经常同向变动。
这些指标之间,信息重叠非常严重。
如果你直接拿它们去解释波动率曲面,会出现两个问题:
- 过拟合:变量太多,样本量有限,模型学到的都是噪音
- 解释困难:10个变量各自的影响方向可能互相矛盾,你根本说不清到底哪个因子在驱动曲面
我曾在一次策略回测中,用了12个宏观变量做回归。样本内拟合漂亮得很,但一到实盘,曲面预测完全偏离。后来用PCA压缩成3个主成分,效果反而稳定多了。
嗯,这里要注意:降维不是目的,提取可解释的宏观因子才是。
16.2 PCA的数学直觉
PCA的数学其实不复杂。我尽量用白话讲。
你有一张数据表,行是时间(比如每个月),列是宏观指标。PCA要做的事,就是找到一组新的坐标轴。这些新轴有以下几个特点:
- 第一个轴(第一主成分)指向数据方差最大的方向
- 第二个轴与第一个轴正交,指向剩余方差最大的方向
- 以此类推……
说白了,PCA就是在做坐标旋转。旋转之后,前面的几个轴就抓住了数据的大部分波动信息。
个人习惯:我一般保留累计方差贡献率超过80%的前几个主成分。但也不绝对,有时候为了解释性,我会刻意多留一个因子,哪怕它只解释了5%的方差。
16.3 实战:用Python对宏观指标做PCA
下面这段代码,是我在项目中常用的流程。数据我用了模拟的宏观指标,但逻辑完全通用。
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 模拟宏观数据:100个月,10个指标
np.random.seed(42)
n_obs = 100
n_vars = 10
# 生成一些相关的宏观指标
data = np.random.randn(n_obs, n_vars)
# 让前5个指标高度相关(模拟经济周期)
common_factor = np.random.randn(n_obs)
for i in range(5):
data[:, i] = common_factor * 0.8 + np.random.randn(n_obs) * 0.2
# 标准化(PCA对尺度敏感,必须做)
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# 执行PCA
pca = PCA()
pca.fit(data_scaled)
# 查看方差解释比例
explained_var = pca.explained_variance_ratio_
print("各主成分方差解释比例:", explained_var[:5])
print("前3个主成分累计解释:", explained_var[:3].sum())
# 提取前3个主成分
factors = pca.transform(data_scaled)[:, :3]
print("宏观因子矩阵形状:", factors.shape)
跑完这段代码,你会发现前3个主成分可能解释了80%以上的方差。这意味着,你完全可以用3个因子代替原来的10个指标。
我曾经踩过的坑:PCA之前一定要做标准化。有一次我忘了标准化,结果PCA把方差最大的那个指标(比如M2,数值很大)当成了第一主成分,但实际上它只是量纲大,不代表信息量大。这个错误让我浪费了两天时间。
16.4 宏观因子的经济含义
PCA提取出来的因子,本身没有标签。你需要根据因子载荷(每个原始指标在因子上的权重)来解读它的经济含义。
我一般会这样做:
- 看第一主成分的载荷:如果几乎所有指标都有正载荷,那它很可能是一个经济增长因子
- 看第二主成分的载荷:如果CPI和PPI载荷为正,而工业产出和PMI载荷为负,那它可能是一个通胀因子
- 看第三主成分的载荷:如果M2和社融载荷突出,那它可能是一个流动性因子
下面是一个典型的因子载荷矩阵示例:
| 原始指标 | PC1(增长因子) | PC2(通胀因子) | PC3(流动性因子) |
|---|---|---|---|
| 工业产出 | 0.42 | -0.12 | 0.08 |
| PMI | 0.38 | -0.09 | 0.05 |
| CPI | 0.15 | 0.55 | -0.10 |
| PPI | 0.10 | 0.52 | -0.08 |
| M2 | 0.20 | 0.05 | 0.62 |
| 社融 | 0.18 | 0.03 | 0.58 |
你看,这样一解读,三个因子的经济含义就非常清晰了。你完全可以给它们命名:增长因子、通胀因子、流动性因子。
16.5 宏观因子与波动率曲面的联动
因子提取出来之后,怎么跟曲面挂钩?
我个人习惯的做法是:
- 把波动率曲面拆解成几个关键特征:水平(ATM波动率)、斜率(skew)、曲率(convexity)
- 用宏观因子对这三个特征分别做回归
- 观察哪些因子对哪个特征影响显著
举个例子,我曾在实盘中发现:
- 增长因子上升时,ATM波动率下降(经济好,不确定性降低)
- 通胀因子上升时,skew变陡(市场开始对冲尾部风险)
- 流动性因子收紧时,convexity上升(期权溢价增加)
这些关系不是固定的,不同市场、不同时期会变化。但PCA给了你一个清晰的框架去跟踪这些变化。
核心结论:PCA降维不是终点,而是起点。提取出可解释的宏观因子后,你才能真正理解曲面变动的背后驱动力。而不是对着20个指标发呆,不知道哪个才是关键。
16.6 本章知识体系
下面这张图,是我自己总结的PCA与曲面联动的完整流程。你可以把它当作一个操作指南。
这张图把整个流程串起来了。从宏观指标出发,经过标准化、PCA降维、因子解读,再到曲面特征提取和回归分析,最后得到联动关系。每一步都有坑,但每一步也都有规律可循。
避坑指南:PCA提取的因子,在不同样本期内可能会“漂移”。比如2010-2015年的第一主成分是增长因子,但2016-2020年可能变成了流动性因子。我建议你滚动窗口做PCA,每12个月重新估计一次因子结构,这样能捕捉到经济结构的变迁。
好了,这一章的内容就到这里。PCA是个好工具,但别迷信它。它帮你降维,但最终的解释和交易决策,还得靠你对宏观经济的理解。