第 7 章 · 01 线性回归与正则化 本节摘要:本节讲金融建模的基线模型——线性回归及其正则化变体。线性回归假设响应变量是特征的线性组合加噪音:y = β₀ + β₁x₁ + ... + βₚxₚ + ε,用最小二乘(OLS)求解系数。本节讲三件事:OLS 的数学形式与 statsmodels 的统计推断(含 R²、t 检验、F 检验、条件数诊断多重共线性);梯度下降版 SGDRegressor 与标准化的必要性;正则化的两大流派——Ridge(L2,收缩系数但不归零)和 Lasso(L1,产生稀疏解做特征选择),以及两者的混合 ElasticNet。线性模型简单、可解释、难被过拟合,是任何复杂模型都必须先打败的基线。 内容来源:原项目 ,汉化并套用体系化模板。
本节摘要:本节讲金融建模的基线模型——线性回归及其正则化变体。线性回归假设响应变量是特征的线性组合加噪音:y = β₀ + β₁x₁ + ... + βₚxₚ + ε,用最小二乘(OLS)求解系数。本节讲三件事:OLS 的数学形式与 statsmodels 的统计推断(含 R²、t 检验、F 检验、条件数诊断多重共线性);梯度下降版 SGDRegressor 与标准化的必要性;正则化的两大流派——Ridge(L2,收缩系数但不归零)和 Lasso(L1,产生稀疏解做特征选择),以及两者的混合 ElasticNet。线性模型简单、可解释、难被过拟合,是任何复杂模型都必须先打败的基线。
内容来源:原项目
ch07/01_linear_regression_intro.ipynb,汉化并套用体系化模板。
⚠️ 风险提示:线性模型简单不代表不会过拟合——当特征数 p 接近样本数 n 时,OLS 仍会过拟合。金融因子常常高度共线,Ridge/Lasso 是标配而非可选。
阅读完本节,你应当能够:
线性回归假设响应变量是特征的加性线性组合:
关键假设:
💡 核心心法:线性不是「世界是直的」,而是「在你建模的尺度上是直的」。取对数、构造交互项、分箱后,很多非线性关系都能被线性模型表达。
最小化残差平方和 min Σ(y - ŷ)²,得到闭式解:
用 numpy 验算:
import numpy as np import statsmodels.api as sm X = sm.add_constant(data['X']) # 加截距列 model = sm.OLS(data['Y'], X).fit() print(model.summary()) # 手动验算 beta = np.linalg.inv(X.T.dot(X)).dot(X.T.dot(y)) pd.Series(beta, index=X.columns)
(X.T @ X) 求逆是关键——当特征高度共线时,这个矩阵接近奇异,条件数飙升,β 不稳。这就是 Ridge 正则化的动机。
statsmodels 的 summary() 是统计推断的金矿:
| 区块 | 关键指标 | 含义 |
|---|---|---|
| 顶部 | No. Observations / Df | 样本数 / 参数自由度 |
| 顶部 | Method: Least Squares | OLS |
| 中部 | coef / std err / t / P>|t| | 系数、标准误、t 统计量、p 值 |
| 中部 | [0.025 0.975] | 95% 置信区间 |
| 右上 | R² / Adj. R² / F-statistic | 拟合优度、调整后、联合显著性 |
| 右上 | AIC / BIC | 信息准则,比较模型 |
| 底部 | Omnibus / Jarque-Bera | 残差正态性检验 |
| 底部 | Durbin-Watson | 残差自相关(接近 2 = 无自相关) |
| 底部 | Cond. No. | 条件数,>30 警告多重共线性 |
⚠️ 条件数:条件数 = 最大特征值 / 最小特征值的平方根,衡量 X⊤X 接近奇异的程度。金融因子(如多个动量)高度相关时,条件数动辄上千,系数极不稳——必须用 Ridge 收缩或剔除共线特征。
sklearn 的 SGDRegressor 用随机梯度下降求解相同的 OLS 目标。梯度对特征尺度敏感,所以必须先标准化:
from sklearn.linear_model import SGDRegressor from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_ = scaler.fit_transform(X) sgd = SGDRegressor(loss='squared_loss', fit_intercept=True, learning_rate='invscaling', eta0=0.01, random_state=42) sgd.fit(X=X_, y=y) # 还原到原始尺度的系数 coeffs = sgd.coef_ * scaler.scale_ + scaler.mean_ pd.Series(coeffs, index=X.columns)
标准化让每个特征均值为 0、方差为 1,梯度各方向步长一致,收敛快且稳。还原时用 scaler.scale_ 和 scaler.mean_ 反变换。
💡 大数据场景:当 n 或 p 极大,X⊤X 求逆 O(np²) 太贵,SGD 的 O(np) per epoch 更划算。金融面板数据(几十万行 × 几百特征)SGD 是实用选择。
OLS 在 p 接近 n 或特征共线时过拟合。正则化在损失函数加惩罚项,把系数往零压:
L2 惩罚把所有系数等比例收缩,但不归零。适合「所有特征都有一点点用」的场景,如多个共线因子。
L1 惩罚让部分系数精确归零,产生稀疏解,自带特征选择。适合「只有少数特征真有用」的场景,是金融因子筛选的利器。
混合 L1 + L2,参数 ρ 控制比例。当 p 远大于 n 或特征高度相关时,ElasticNet 比 Lasso 更稳(纯 L1 在强相关时只随机留一个)。
| 模型 | 惩罚 | 系数行为 | 适用场景 |
|---|---|---|---|
| OLS | 无 | 不收缩 | p << n 且不共线 |
| Ridge | L2 (β²) | 等比收缩,不归零 | 多共线因子,都有用 |
| Lasso | L1 (|β|) | 稀疏,部分归零 | 因子筛选,只有少数有用 |
| ElasticNet | L1 + L2 | 兼顾稀疏与稳定 | p >> n,强相关 |
金融业界对线性模型的偏爱有理论支撑:
⚠️ 基线纪律:任何「我用深度学习/梯度提升做出 IC 0.05」的结果,都要先和线性 Ridge 比。如果线性模型 IC 0.045,那 90% 的「增益」可能只是过拟合噪音。打不过线性的非线性模型不值得部署。
下一节,我们看 Fama-MacBeth 两阶段横截面回归——专门处理金融面板数据的时变风险溢价。