跳到正文

回归分析基础

回归用于找到拟合数据点云的最佳直线。理解简单线性回归是量化金融中所有因子模型和预测建模的基础。

第 1 篇 · 共 5 篇 约 3 分钟

什么是回归

想象你在图表上有一散点图——每个点代表某一天你记录的两个数据:某只股票的收益率和市场收益率。你怀疑这只股票跟随市场运动,但并非完全同步。回归就是这样一种工具,它能在这堆散点中画出最佳拟合直线。

最简单的情形是简单线性回归,它对两个变量拟合一条直线:

Y=β0+β1X+εY = \beta_0 + \beta_1 X + \varepsilon

其中 YY 是因变量(股票收益率),XX 是自变量(市场收益率),β0\beta_0 是截距,β1\beta_1 是斜率,ε\varepsilon 是误差项——即 XX 无法解释的 YY 部分。

斜率 β1\beta_1 告诉你当 XX 增加一个单位时 YY 变化多少。如果市场上涨 1%,而你的股票通常上涨 0.8%,则斜率为 0.8。截距 β0\beta_0 是直线与 YY 轴的交点——在金融中,它往往代表”阿尔法”,即股票独立于市场产生的收益。

最小二乘法

计算机如何决定在哪里画这条线?它最小化残差平方和:

最小化∑i=1n(yi−y^i)2\text{最小化} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

残差是实际数据点 yiy_i 与回归线在 xix_i 处的预测值 y^i\hat{y}_i 之间的差距。在求和之前对每个差距取平方,确保超过直线与低于直线同等代价,并且差距越大惩罚越重。

这种方法称为普通最小二乘法(OLS)。它产生的直线在整体意义上距离所有点最近。在同一组散点中,你画不出任何其他直线拥有更小的总平方距离。

解读输出结果

运行回归后,你会得到三个关键数字。

斜率 β1\beta_1 衡量关系方向以及 XX 每变动一单位时 YY 的变化率。斜率为正意味着 XX 和 YY 同向变动。斜率为负意味着它们反向变动。斜率的大小本身并不是关系强度的度量,因为它取决于 XX 和 YY 的单位。要评估强度,应该使用绝对相关系数 ∣r∣|r|、标准化系数(beta weight)或 R2R^2。

R 平方告诉你回归解释了多少比例的 YY 方差。取值范围从 0 到 1。R² 为 0.65 意味着回归线捕捉了 YY 变化的 65%,剩下 35% 留在残差中——即噪声或你未纳入的变量的影响。

R2=1−∑(yi−y^i)2∑(yi−yˉ)2R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}

残差标准误(RSE) 是单个残差的典型大小——即大致上每个数据点以 YY 的单位偏离回归线的距离。它告诉你典型的预测误差。

用 Python 实现

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt


np.random.seed(42)
market_returns = np.random.normal(0.0005, 0.02, 252)  # 日市场收益率
stock_returns = 0.0003 + 0.9 * market_returns + np.random.normal(0, 0.01, 252)

# 为 sklearn 重塑数据
X = market_returns.reshape(-1, 1)
y = stock_returns

# 拟合回归
model = LinearRegression()
model.fit(X, y)

beta_0 = model.intercept_
beta_1 = model.coef_[0]
y_pred = model.predict(X)

# R 平方
r_squared = model.score(X, y)

print(f"截距(阿尔法): {beta_0:.6f}")
print(f"斜率(贝塔):     {beta_1:.4f}")
print(f"R 平方:         {r_squared:.4f}")

# 绘图
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.5, label="日收益率")
plt.plot(X, y_pred, color="red", linewidth=2, label=f"回归线")
plt.xlabel("市场收益率")
plt.ylabel("股票收益率")
plt.title("简单线性回归:股票收益率 vs 市场收益率")
plt.legend()
plt.show()

提示词

用 numpy.polyfit 一行代码拟合一次多项式,返回斜率和截距。

你也可以用 numpy.polyfit 一行搞定:

beta_1, beta_0 = np.polyfit(market_returns, stock_returns, 1)

提示词

用 numpy、sklearn 和 matplotlib 写简单线性回归:模拟市场与股票收益,用 LinearRegression 拟合,输出截距、斜率、R² 并画散点图和回归线。

多元回归

只有一个 XX 的简单回归只是起点。多元回归添加了更多自变量:

Y=β0+β1X1+β2X2+⋯+βkXk+εY = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k + \varepsilon

在量化金融中,这就是因子模型的工作方式。你的 XX 变量可能包括规模因子、价值因子、动量因子和波动率因子,而不仅仅是市场收益率。每个 β\beta 系数告诉你 YY 对特定因子的敏感度,同时保持其他因子不变。

mechanics( mechanics 的 mechanics)是相同的——OLS 最小化残差平方和——但解释变得更加丰富,数学也变成了矩阵代数,本系列后续文章会涉及。

回归无法告诉你的事

回归很强大,但它有重要的局限性。

相关性不等于因果关系。 冰激凌销量和溺水死亡之间的回归会显示强正相关。但这并不意味着冰激凌导致了溺水。两者都由第三个变量(夏季高温)驱动。在金融中,这意味着你不能因为两个变量相关,就假设其中一个导致了另一个。

样本外有效性无法保证。 在历史数据上拟合的回归在样本内可能看起来很好——高 R²、小残差——但在新数据上完全失效。这称为过拟合,是量化模型构建中的核心风险之一。始终用你没有用来拟合回归的数据来测试你的回归。

遗漏变量偏差 会扭曲你的系数——当你遗漏了一个与 XX 和 YY 都相关的重要的变量时。你的 β1\beta_1 估计可能是错误的,因为模型意外地吸收了你没有测量的某个因素的影响。

参考文献

Moore, McCabe & Craig, Introduction to the Practice of Statistics, 9th edition, W.H. Freeman, Chapter 3. ISBN: 978-1319013387.

Wooldridge, Introductory Econometrics: A Modern Approach, 7th edition, Cengage Learning, Chapter 2. ISBN: 978-1305270107.