量化交易之数学与统计学基础2.3------线性代数与矩阵运算 | 线性方程组

第二部分:线性代数与矩阵运算
第3节:线性方程组:多因子模型中的回归分析与最小二乘法求解
一、引言
在量化投资领域,多因子模型是解析资产收益率的核心工具之一。其核心假设是资产收益率由多个因子的线性组合驱动,而最小二乘法(OLS)作为求解线性回归参数的经典方法,为因子系数估计提供了理论支撑和实践工具。本文将深入解析多因子模型的线性方程组构建、最小二乘法求解原理、实际应用中的挑战及解决方案,并结合 Python 实战演示关键步骤。
二、多因子模型与线性回归基础
2.1 模型数学表达式
多因子模型假设资产收益率由一系列因子的线性组合决定,具体形式为:
r i = β 0 + β 1 f i 1 + β 2 f i 2 + ⋯ + β k f i k + ϵ i r_i = \beta_0 + \beta_1 f_{i1} + \beta_2 f_{i2} + \dots + \beta_k f_{ik} + \epsilon_i ri=β0+β1fi1+β2fi2+⋯+βkfik+ϵi
- r i r_i ri:资产 i i i 的收益率
- f i j f_{ij} fij:资产 i i i 在因子 j j j 上的暴露(如市值、PE、动量等)
- β j \beta_j βj:因子 j j j 的系数(衡量因子对收益率的影响强度)
- ϵ i \epsilon_i ϵi:残差项(假设服从均值为 0、方差为常数的正态分布)
2.2 核心假设
- 线性关系:收益率与因子暴露呈线性关系
- 外生性 :因子与残差项不相关( E [ f i j ϵ i ] = 0 \mathbb{E}[f_{ij}\epsilon_i] = 0 E[fijϵi]=0)
- 同方差性 :残差方差恒定( Var ( ϵ i ) = σ 2 \text{Var}(\epsilon_i) = \sigma^2 Var(ϵi)=σ2)
- 无自相关 :残差项相互独立( Cov ( ϵ i , ϵ j ) = 0 , i ≠ j \text{Cov}(\epsilon_i, \epsilon_j) = 0, i \neq j Cov(ϵi,ϵj)=0,i=j)
三、线性方程组的矩阵表示
3.1 数据向量化
将 n n n 个资产的观测数据表示为矩阵形式:
- 因变量矩阵(收益率) : r = [ r 1 , r 2 , ... , r n ] T \mathbf{r} = [r_1, r_2, \dots, r_n]^T r=[r1,r2,...,rn]T
- 自变量矩阵(因子暴露):
X = [ 1 f 11 f 12 ... f 1 k 1 f 21 f 22 ... f 2 k ⋮ ⋮ ⋮ ⋱ ⋮ 1 f n 1 f n 2 ... f n k ] \mathbf{X} = \begin{bmatrix} 1 & f_{11} & f_{12} & \dots & f_{1k} \\ 1 & f_{21} & f_{22} & \dots & f_{2k} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & f_{n1} & f_{n2} & \dots & f_{nk} \end{bmatrix} X= 11⋮1f11f21⋮fn1f12f22⋮fn2......⋱...f1kf2k⋮fnk
(第一列为截距项,后续列为因子暴露)
- 系数向量 : β = [ β 0 , β 1 , ... , β k ] T \mathbf{\beta} = [\beta_0, \beta_1, \dots, \beta_k]^T β=[β0,β1,...,βk]T
- 残差向量 : ϵ = [ ϵ 1 , ϵ 2 , ... , ϵ n ] T \mathbf{\epsilon} = [\epsilon_1, \epsilon_2, \dots, \epsilon_n]^T ϵ=[ϵ1,ϵ2,...,ϵn]T
3.2 矩阵形式的线性方程组
r = X β + ϵ \mathbf{r} = \mathbf{X}\mathbf{\beta} + \mathbf{\epsilon} r=Xβ+ϵ
该方程将多因子模型转化为线性代数问题,为后续最小二乘法求解奠定基础。
四、最小二乘法(OLS)原理与求解
4.1 目标函数:残差平方和最小化
最小二乘法的核心是最小化残差平方和(SSE):
min β S S E = ϵ T ϵ = ( r − X β ) T ( r − X β ) \min_{\mathbf{\beta}} \quad SSE = \mathbf{\epsilon}^T\mathbf{\epsilon} = (\mathbf{r} - \mathbf{X}\mathbf{\beta})^T(\mathbf{r} - \mathbf{X}\mathbf{\beta}) βminSSE=ϵTϵ=(r−Xβ)T(r−Xβ)
4.2 正规方程推导
对 β \mathbf{\beta} β 求偏导并令导数为零:
∂ S S E ∂ β = − 2 X T ( r − X β ) = 0 \frac{\partial SSE}{\partial \mathbf{\beta}} = -2\mathbf{X}^T(\mathbf{r} - \mathbf{X}\mathbf{\beta}) = \mathbf{0} ∂β∂SSE=−2XT(r−Xβ)=0
整理得到 正规方程:
X T X β = X T r \mathbf{X}^T\mathbf{X}\mathbf{\beta} = \mathbf{X}^T\mathbf{r} XTXβ=XTr
当 X T X \mathbf{X}^T\mathbf{X} XTX 可逆(即因子无严格共线性)时,解得:
β ^ = ( X T X ) − 1 X T r \hat{\mathbf{\beta}} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{r} β^=(XTX)−1XTr
4.3 几何解释:正交投影
拟合值 r ^ = X β ^ \mathbf{\hat{r}} = \mathbf{X}\hat{\mathbf{\beta}} r^=Xβ^ 是收益率向量 r \mathbf{r} r 在因子矩阵 X \mathbf{X} X 列空间的正交投影,残差 ϵ ^ = r − r ^ \mathbf{\hat{\epsilon}} = \mathbf{r} - \mathbf{\hat{r}} ϵ^=r−r^ 与列空间正交( X T ϵ ^ = 0 \mathbf{X}^T\mathbf{\hat{\epsilon}} = \mathbf{0} XTϵ^=0)。
五、多重共线性:挑战与解决方案
5.1 问题表现
- 数学层面 :因子高度相关导致 X T X \mathbf{X}^T\mathbf{X} XTX 接近奇异,系数估计不稳定
- 统计层面:标准误增大(t 值降低)、系数符号可能违背经济直觉
5.2 检测方法:方差膨胀因子(VIF)
对每个因子 j j j,计算其对其他因子回归的决定系数 R j 2 R_j^2 Rj2,则:
V I F j = 1 1 − R j 2 VIF_j = \frac{1}{1 - R_j^2} VIFj=1−Rj21
- V I F = 1 VIF=1 VIF=1:无共线性
- 1 < V I F < 10 1 < VIF < 10 1<VIF<10:中度共线性
- V I F ≥ 10 VIF \geq 10 VIF≥10:严重共线性
5.3 解决方法
方法 | 原理 | 适用场景 |
---|---|---|
因子剔除 | 删除 V I F ≥ 10 VIF \geq 10 VIF≥10 的因子 | 因子数量较少时 |
岭回归(Ridge) | 加入 L2 正则项 λ ∣ β ∣ 2 2 \lambda|\mathbf{\beta}|_2^2 λ∣β∣22,稳定矩阵求逆 | 高维因子或接近奇异矩阵 |
LASSO | 加入 L1 正则项 λ ∣ β ∣ 1 \lambda|\mathbf{\beta}|_1 λ∣β∣1,强制系数稀疏化 | 因子筛选(保留关键因子) |
主成分分析(PCA) | 生成不相关的主成分因子,替代原始因子 | 处理行业 / 风格因子共线性 |
六、Python 实战:多因子模型回归分析
6.1 数据准备与模拟
python
import numpy as np
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 生成模拟数据:3因子(市值、PE、动量),50只股票
np.random.seed(42)
n_assets = 50
n_factors = 3
# 因子暴露(不含截距)
X = np.hstack((
np.random.randn(n_assets, 1) * 1000, # 市值(模拟高度相关因子)
np.random.randn(n_assets, 1) * 10 + 20, # PE
np.random.randn(n_assets, 1) # 动量
))
X = sm.add_constant(X) # 添加截距项
# 真实系数(截距+3因子)
true_beta = np.array([0.05, 0.0001, -0.01, 0.2])
epsilon = np.random.normal(0, 0.01, n_assets)
r = X @ true_beta + epsilon # 生成收益率
6.2 最小二乘求解与结果解读
python
# 方法1:手动矩阵运算
X_TX = X.T @ X
X_TX_inv = np.linalg.inv(X_TX)
beta_hat_manual = X_TX_inv @ X.T @ r
print("手动计算系数:", np.round(beta_hat_manual, 6))
# 方法2:statsmodels自动求解
model = sm.OLS(r, X)
results = model.fit()
print("\n模型摘要:")
print(results.summary())
关键输出解读:
- Coefficients:因子系数估计值,如 "x1"(市值)系数为 0.0001,表明市值每增加 1 单位,收益率平均增加 0.01%。
- t 值:衡量因子显著性(绝对值 > 1.96 表示 95% 置信水平显著)。
- R-squared:模型解释力(0.8 表示 80% 的收益率波动可由因子解释)。
6.3 多重共线性检测
python
# 计算VIF(假设X的第一列为截距,从第二列开始计算)
vif = []
for i in range(1, X.shape[1]): # 跳过截距项
vif.append(variance_inflation_factor(X.values, i))
print("\nVIF值(按因子顺序):", np.round(vif, 2))
6.4 正则化方法对比
python
from sklearn.linear_model import Ridge, Lasso
# 岭回归(处理共线性)
ridge = Ridge(alpha=10) # alpha调节正则化强度
ridge.fit(X[:, 1:], r) # 输入不含截距的因子(sklearn自动处理截距)
print("\n岭回归系数:", np.round(ridge.coef_, 6))
# LASSO(稀疏化因子)
lasso = Lasso(alpha=0.1)
lasso.fit(X[:, 1:], r)
print("LASSO系数:", np.round(lasso.coef_, 6)) # 不显著因子被压缩至0
七、最小二乘法的局限性与扩展
7.1 经典假设违反的后果
假设 | 违反后果 | 应对方法 |
---|---|---|
线性关系 | 系数估计偏差 | 非线性变换、交互项 |
同方差性 | 标准误低估 / 高估 | 稳健标准误(White 检验) |
自相关性 | t 检验失效、模型不可靠 | 序列相关检验(DW 检验) |
非正态分布 | 区间估计不准确 | 自助法(Bootstrap) |
7.2 扩展模型
- 加权最小二乘法(WLS):处理异方差问题(赋予低方差样本更高权重)
- 广义最小二乘法(GLS):处理自相关或异方差的更一般形式
- 面板数据模型:结合时间和截面维度,如固定效应模型(FE)、随机效应模型(RE)
八、总结
8.1 核心价值
最小二乘法是多因子模型的 "参数引擎",通过线性方程组求解实现因子系数的无偏、高效估计,为资产定价、风险归因等提供关键依据。
8.2 实践要点
- 数据预处理:检测并处理多重共线性(VIF>10),确保因子矩阵满秩。
- 假设检验:通过残差分析(如 QQ 图、异方差检验)验证模型适用性。
- 工具选择:小样本用 OLS,高维数据用 LASSO / 岭回归,时序数据结合 ARIMA 等模型。
8.3 未来延伸
从单截面回归到复杂的多期模型,最小二乘法是理解因子动态作用的基础。结合机器学习(如随机森林、神经网络),可进一步捕捉因子的非线性关系,推动多因子模型的迭代升级。
通过理论与实践的结合,最小二乘法在多因子模型中的应用不仅是量化分析的起点,更是理解金融市场复杂关系的关键工具。