第二部分:线性代数与矩阵运算
第3节:线性方程组:多因子模型中的回归分析与最小二乘法求解
在量化投资领域,多因子模型是解析资产收益率的核心工具之一。其核心假设是资产收益率由多个因子的线性组合驱动,而最小二乘法(OLS)作为求解线性回归参数的经典方法,为因子系数估计提供了理论支撑和实践工具。本文将深入解析多因子模型的线性方程组构建、最小二乘法求解原理、实际应用中的挑战及解决方案,并结合 Python 实战演示关键步骤。
多因子模型假设资产收益率由一系列因子的线性组合决定,具体形式为:
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
将 n n n 个资产的观测数据表示为矩阵形式:
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
(第一列为截距项,后续列为因子暴露)
r = X β + ϵ \mathbf{r} = \mathbf{X}\mathbf{\beta} + \mathbf{\epsilon} r=Xβ+ϵ
该方程将多因子模型转化为线性代数问题,为后续最小二乘法求解奠定基础。
最小二乘法的核心是最小化残差平方和(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β)
对 β \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
拟合值 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)。
对每个因子 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 ≥ 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) | 生成不相关的主成分因子,替代原始因子 | 处理行业 / 风格因子共线性 |
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 # 生成收益率
# 方法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())
关键输出解读:
# 计算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))
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
假设 | 违反后果 | 应对方法 |
---|---|---|
线性关系 | 系数估计偏差 | 非线性变换、交互项 |
同方差性 | 标准误低估 / 高估 | 稳健标准误(White 检验) |
自相关性 | t 检验失效、模型不可靠 | 序列相关检验(DW 检验) |
非正态分布 | 区间估计不准确 | 自助法(Bootstrap) |
最小二乘法是多因子模型的 “参数引擎”,通过线性方程组求解实现因子系数的无偏、高效估计,为资产定价、风险归因等提供关键依据。
从单截面回归到复杂的多期模型,最小二乘法是理解因子动态作用的基础。结合机器学习(如随机森林、神经网络),可进一步捕捉因子的非线性关系,推动多因子模型的迭代升级。
通过理论与实践的结合,最小二乘法在多因子模型中的应用不仅是量化分析的起点,更是理解金融市场复杂关系的关键工具。