Day 2:线性回归原理与正则化
📋 目录
- 线性回归基础原理
- 最小二乘法(解析解)
- 梯度下降法(数值解)
- 正则化:Ridge回归(L2)
- 正则化:Lasso回归(L1)
- 弹性网络(Elastic Net)
第一部分:线性回归基础原理(1.5小时理论)
1.1 什么是线性回归?
定义 :线性回归是一种监督学习方法,用于预测连续值输出。它假设输入特征和输出之间存在线性关系。
数学形式 :
y=β0+β1x1+β2x2+⋯+βnxn+ϵ y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \dots + \beta_nx_n + \epsilon y=β0+β1x1+β2x2+⋯+βnxn+ϵ
- yyy:预测目标(如股票收益率)
- x1,x2,...,xnx_1, x_2, ..., x_nx1,x2,...,xn:特征(如过去收益率、成交量等)
- β0,β1,...,βn\beta_0, \beta_1, ..., \beta_nβ0,β1,...,βn:模型参数(需要学习)
- ϵ\epsilonϵ:误差项(噪声)
矩阵形式 :
y=Xβ+ϵ y = \boldsymbol{X}\boldsymbol{\beta} + ϵ y=Xβ+ϵ
其中 X\boldsymbol{X}X 是 m×(n+1)m \times (n+1)m×(n+1) 的设计矩阵(包含截距项),β\boldsymbol{\beta}β 是 (n+1)×1(n+1) \times 1(n+1)×1 的参数向量。
1.2 线性回归的假设条件
| 假设 | 含义 | 量化中的问题 |
|---|---|---|
| 线性性 | 特征与目标线性相关 | 金融数据常存在非线性 |
| 独立性 | 样本相互独立 | 时间序列存在自相关 |
| 同方差性 | 误差方差恒定 | 金融数据存在异方差(波动率聚类) |
| 正态性 | 误差服从正态分布 | 金融收益具有厚尾特征 |
重要提示 :虽然这些假设在金融数据中常被违反,但线性回归仍然可以作为基准模型使用。
1.3 损失函数(Cost Function)
目标 :找到使预测误差最小的参数 β\mathbf{β}β
均方误差(MSE)损失函数 :
J(β)=12m∑i=1m(y(i)−y^(i))2=12m∑i=1m(y(i)−x(i)β)2 J(\boldsymbol{\beta}) = \frac{1}{2m} \sum_{i=1}^{m} (y^{(i)} - \hat{y}^{(i)})^2 = \frac{1}{2m} \sum_{i=1}^{m} (y^{(i)} - \boldsymbol{x}^{(i)} \boldsymbol{\beta})^2 J(β)=2m1i=1∑m(y(i)−y^(i))2=2m1i=1∑m(y(i)−x(i)β)2
- mmm:样本数量
- 除以 222 是为了求导时简化计算
为什么要最小化MSE?
- 在正态误差假设下,MSE等价于最大似然估计
- 数学上可导,便于优化
- 对大误差惩罚更重
第二部分:最小二乘法(解析解)
2.1 原理推导
最小二乘法通过求解正规方程直接得到最优参数。
步骤:
-
对损失函数求导:
∂J∂β=1mXT(Xβ−y) \frac{\partial J}{\partial \boldsymbol{\beta}} = \frac{1}{m} \boldsymbol{X}^T (\boldsymbol{X} \boldsymbol{\beta} - \boldsymbol{y}) ∂β∂J=m1XT(Xβ−y) -
令导数为零:
XTXβ=XTy \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{\beta} = \boldsymbol{X}^T \boldsymbol{y} XTXβ=XTy -
求解参数:
β=(XTX)−1XTy \boldsymbol{\beta} = (\boldsymbol{X}^T \boldsymbol{X})^{-1} \boldsymbol{X}^T \boldsymbol{y} β=(XTX)−1XTy
2.2 最小二乘法的优缺点
| 优点 | 缺点 |
|---|---|
| 解析解,无需迭代 | 需要计算逆矩阵 O(n3)O(n^3)O(n3) |
| 一次计算得到结果 | 特征数多时计算慢 |
| 结果稳定 | 特征数 > 样本数时不可逆 |
| 无超参数 | 对异常值敏感 |
2.3 数值稳定性问题
矩阵求逆问题:
- 当特征高度相关(多重共线性)时,XTX\mathbf{X}^T\mathbf{X}XTX 接近奇异
- 导致数值计算不稳定
量化应用中的多重共线性:
# 示例:技术指标高度相关
# 5日移动平均和10日移动平均高度相关
# RSI和动量指标相关
解决方案:
- 使用伪逆(
np.linalg.pinv) - 添加正则化(后面会讲)
- 使用梯度下降
第三部分:梯度下降法(数值解)
3.1 梯度下降原理
核心思想:沿着负梯度方向迭代更新参数,直到收敛。
更新公式 :
βj:=βj−α∂J∂βj \beta_j := \beta_j - \alpha \frac{\partial J}{\partial \beta_j} βj:=βj−α∂βj∂J
其中 α\alphaα 是学习率(learning rate)。
梯度计算 :
∂J∂βj=1m∑i=1m(hβ(x(i))−y(i))xj(i) \frac{\partial J}{\partial \beta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_\beta(x^{(i)}) - y^{(i)}) x_j^{(i)} ∂βj∂J=m1i=1∑m(hβ(x(i))−y(i))xj(i)
3.2 三种梯度下降变体
| 变体 | 每次使用的样本数 | 优点 | 缺点 |
|---|---|---|---|
| 批量梯度下降(BGD) | 全部样本 | 稳定收敛 | 大数据集慢 |
| 随机梯度下降(SGD) | 1个样本 | 快速更新 | 收敛不稳定 |
| 小批量梯度下降 | batch_size个 | 平衡效率和稳定性 | 需要调batch_size |
3.3 学习率的选择
学习率的影响:
- 太大:震荡不收敛
- 太小:收敛太慢
- 合适:平稳收敛
python
# 学习率选择策略
learning_rates = {
'太大': 1.0, # 可能发散
'偏大': 0.1, # 震荡
'合适': 0.01, # 平稳下降
'偏小': 0.0001, # 收敛慢
'太小': 1e-6 # 几乎不变
}
自适应学习率方法:
- AdaGrad
- RMSprop
- Adam(最常用)
3.4 特征缩放的重要性
为什么需要特征缩放?
python
# 示例:未缩放的特征
特征1:股价(100-200元)
特征2:成交量(1,000,000-10,000,000股)
# 梯度下降会沿着量纲大的方向震荡
常用缩放方法:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| 标准化(Standardization (Z-Score)) | x′=x−μσx' = \frac{x - \mu}{\sigma}x′=σx−μ | 特征近似正态分布 |
| 归一化(Min-Max Scaling) | x′=x−minmax−minx' = \frac{x - \min}{\max - \min}x′=max−minx−min | 特征有边界 |
| 鲁棒缩放(Robust Scaling) | x′=x−medianIQRx' = \frac{x - \text{median}}{IQR}x′=IQRx−median | 有异常值 |
第四部分:正则化 - Ridge回归(L2正则化)
4.1 为什么需要正则化?
过拟合问题:
- 模型过于复杂,记住噪声
- 参数值变得很大
- 对新数据预测能力差
正则化思想:在损失函数中加入参数惩罚项
4.2 Ridge回归原理
Ridge 回归(岭回归)是在普通线性回归基础上加入 L2 正则化 的改进版,专门解决多重共线性和过拟合问题。
核心思想 :不仅希望预测误差小,还希望模型的参数 β\boldsymbol \betaβ 不要太大。
损失函数 :
J(β)=12m∑i=1m(y(i)−g(i))2⏟MSE+λ∑j=1nβj2⏟L2惩罚项 J(\boldsymbol{\beta}) = \underbrace{\frac{1}{2m} \sum_{i=1}^{m} (y^{(i)} - g^{(i)})^2}{\text{MSE}} + \underbrace{\lambda \sum{j=1}^{n} \beta_j^2}_{\text{L2惩罚项}} J(β)=MSE 2m1i=1∑m(y(i)−g(i))2+L2惩罚项 λj=1∑nβj2
- λ>0:正则化强度(超参数),控制"拟合"与"参数小"之间的权衡。
- λ=0:退化为普通线性回归。
- λ\lambdaλ 越大,参数越接近0
- 惩罚项不包括 β0\beta_0β0(截距)
解析解 :
β=(XTX+λI)−1XTy \boldsymbol{\beta} = (\boldsymbol{X}^T \boldsymbol{X} + \lambda \boldsymbol{I})^{-1} \boldsymbol{X}^T \boldsymbol{y} β=(XTX+λI)−1XTy
关键性质:
- λI\lambda\boldsymbol{I}λI 保证了矩阵可逆(即使 XTX\boldsymbol{X}^T\boldsymbol{X}XTX 奇异)
- 参数收缩但不为0
4.3 L2正则化的几何解释:圆与等高线的相遇
可以从两个视角理解 L2 正则化为什么能让参数变小。
1. 约束优化视角:限制参数"居住空间"
想象一下:
- 我们要找损失函数的最低点(山谷底)。
- 但这次我们规定:参数 β\boldsymbol{\beta}β 只能落在 原点附近的一个圆内(L2 球)。
几何过程:
- 不加正则化时,最优解可能在很远的地方(参数很大)。
- 加上 L2 后,相当于画了一个圆/球形的"围墙"。
- 如果原来的最优解在圆外,我们就只能沿着圆边找一个既在圆内、又尽量靠近谷底的点。
结果就是:参数被"拉"向原点,整体变小。
2. 拉格朗日视角:梯度下降的"引力"
在梯度下降更新中,L2 项的作用就像一根弹簧 :
βj:=βj−α[(数据梯度假装)+2λβj] \beta_j := \beta_j - \alpha[(数据梯度假装) + 2\lambda\beta_j] βj:=βj−α[(数据梯度假装)+2λβj]
每次更新时,除了根据数据调整方向,还会额外减去一部分 βj\beta_jβj 本身。
这意味着:
- 无论数据怎么变,参数都在被持续拉回原点。
- 参数越大,被拉回的力度就越大;参数越小,拉力也越小。
Ridge 回归通过 L2 正则化,牺牲一点点训练集上的拟合精度,换取参数估计的更小方差和更强稳定性,特别适合特征多、共线性强、数据少的场景。
4.4 Ridge在量化中的应用
应用场景:
- 多因子模型:处理高度相关的因子
- 风险控制:防止单一因子权重过大
- 小样本学习:特征数 > 样本数时
python
# 示例:多因子模型
from sklearn.linear_model import Ridge
# 价值因子、动量因子、质量因子高度相关
factors = ['PE', 'PB', 'ROE', 'Momentum_12m']
ridge = Ridge(alpha=1.0)
ridge.fit(factors_returns, stock_returns)
第五部分:正则化 - Lasso回归(L1正则化)
5.1 Lasso回归原理
Lasso(Least Absolute Shrinkage and Selection Operator)是在线性回归基础上引入 L1 正则化 的模型,旨在同时实现参数收缩 与特征选择。
损失函数 :
J(β)=12m∑i=1m(y(i)−y^(i))2⏟拟合误差+λ∑j=1n∣βj∣⏟L1惩罚项 J(\boldsymbol \beta) = \underbrace{\frac{1}{2m} \sum_{i=1}^{m} (y^{(i)} - \hat{y}^{(i)})^2}{\text{拟合误差}} + \underbrace{\lambda \sum{j=1}^{n} |\beta_j|}_{\text{L1惩罚项}} J(β)=拟合误差 2m1i=1∑m(y(i)−y^(i))2+L1惩罚项 λj=1∑n∣βj∣
关键性质:
-
产生稀疏解(许多参数为0)
-
自动进行特征选择(将部分参数压缩为 0,从而实现特征选择)
-
λ>0控制正则化强度;
-
L1 项使用绝对值 ∣βj∣,而非平方。
与 Ridge 的关键区别:
- Ridge (L2) 倾向于让所有参数均匀变小;
- Lasso (L1) 倾向于让一部分参数变为精确的 0,从而自动完成特征筛选。
5.2 L1 vs L2正则化对比
| 特性 | L1(Lasso) | L2(Ridge) |
|---|---|---|
| 惩罚项 | $ | \beta |
| 解的性质 | 稀疏 | 稠密 |
| 特征选择 | 自动 | 无 |
| 计算 | 需要坐标下降 | 解析解 |
| 多重共线性 | 只选一个 | 全部保留 |
| 几何形状 | 菱形 | 圆形 |
5.3 几何解释:菱形与尖角
1. 约束优化视角:菱形边界
将优化问题看作:在满足 ∑∣βj∣≤t的条件下,最小化误差。
- L2 约束是一个平滑的"圆"(等高线为椭圆);
- L1 约束 是一个"菱形"(高维下是"多面体"),有尖锐的顶点。
关键现象:
误差函数的等高线(椭圆)在寻找最低点时,更容易"撞上"菱形的顶点。而在顶点处,某些坐标恰好为 0。这就导致了参数的稀疏性------部分特征直接被模型丢弃。
2. 贝叶斯视角:拉普拉斯先验
从概率角度看:
- L2 对应高斯先验,认为参数大多接近 0 但很少正好为 0;
- L1 对应拉普拉斯先验,它在 0 处有更高的概率密度峰,因此更"鼓励"参数等于 0。
5.4 Lasso在量化中的应用
应用场景:
- 因子筛选:从数百个因子中选择最重要的
- 简化模型:只保留有效特征
- 提高可解释性:只关注非零系数
python
from sklearn.linear_model import Lasso
# 从100个因子中选择有效因子
lasso = Lasso(alpha=0.01)
lasso.fit(all_factors, stock_returns)
# 非零系数的因子
selected_factors = all_factors.columns[lasso.coef_ != 0]
第六部分:弹性网络(Elastic Net)
6.1 为什么需要弹性网络?
L1的问题:
- 当特征数 > 样本数时,最多选择n个特征
- 高度相关特征中只选一个
L2的问题:
- 不进行特征选择
弹性网络:结合L1和L2的优势
6.2 弹性网络原理
损失函数 :
J(β)=MSE+λ(1−ρ2∑j=1nβj2+ρ∑j=1n∣βj∣) J(\boldsymbol \beta) = \text{MSE} + \lambda\left( \frac{1 - \rho}{2} \sum_{j=1}^{n} \beta_j^2 + \rho \sum_{j=1}^{n} |\beta_j| \right) J(β)=MSE+λ(21−ρj=1∑nβj2+ρj=1∑n∣βj∣)
- ρ\rhoρ:L1比率(0 = Ridge, 1 = Lasso)
- λ\lambdaλ:正则化强度
6.3 选择建议
| 场景 | 推荐模型 |
|---|---|
| 特征少,样本多 | 普通线性回归 |
| 特征相关性强 | Ridge |
| 需要特征选择 | Lasso |
| 特征多且相关 | Elastic Net |