🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第12讲:线性回归 (Linear Regression)

💡

查看全集:💎Quantopia量化分析56讲

一、核心概念解析

什么是线性回归?

线性回归是用于量化两个变量间线性关系的统计方法。给定自变量X和因变量Y,我们试图找到最佳拟合直线Y = α + βX,其中:

关键公式:

Y^=α+βX+ϵ\hat{Y} = \alpha + \beta X + \epsilon

其中ε为误差项,服从均值为0的正态分布

线性回归 vs 相关性分析

特征线性回归相关性分析
输出结果具体线性模型相关系数(-1到1)
关系类型仅捕捉线性关系捕捉任意单调关系
变量关系可处理多变量仅限两变量关系
应用场景预测和解释变量关系衡量变量关联强度

二、实战演练:股票收益率分析

环境准备

import numpy as np
import yfinance as yf
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns

数据获取与处理

# 获取特斯拉和标普500数据
start = '2014-01-01'
end = '2015-01-01'
data = yf.download(['TSLA', 'SPY'], start=start, end=end)['Close']

# 计算日收益率
returns = data.pct_change().dropna()
r_tsla = returns['TSLA']
r_spy = returns['SPY']

回归分析实现

这段代码实现了一个简单的线性回归分析,用于研究特斯拉股票(TSLA)与标普500指数(SPY)收益率之间的关系:

  1. linear_regression函数接受自变量X(SPY收益率)和因变量Y(TSLA收益率)
  1. 使用statsmodels库添加常数项(截距)
  1. 建立普通最小二乘(OLS)回归模型并拟合
  1. 使用seaborn的regplot绘制散点图和回归线
  1. 返回详细的回归统计结果
def linear_regression(X, Y):
    # 添加常数项
    X_const = sm.add_constant(X)

    # 建立模型
    model = sm.OLS(Y, X_const).fit()

    # 绘制结果
    plt.figure(figsize=(10,6))
    sns.regplot(x=X, y=Y, line_kws={'color':'red'})
    plt.xlabel('SPY Returns')
    plt.ylabel('TSLA Returns')
    plt.title('TSLA vs SPY Returns Regression')

    return model.summary()

# 执行回归分析
results = linear_regression(r_spy, r_tsla)
print(results)

结果解读要点:

  1. R-squared:0.202表示SPY收益率可解释TSLA 20.2%的波动
  1. 系数显著性
    • 截距(const)的p值0.532 > 0.05,统计不显著
    • 斜率(x1)p值0.000,高度显著
  1. Beta值:1.9271表示SPY每变动1%,TSLA平均变动1.927%

这种分析在金融中非常重要,可用于:

Beta值1.927表明特斯拉是一只波动性较大的成长型股票,对市场变动非常敏感。

三、模型验证与诊断

回归假设检验

  1. 线性假设:散点图呈线性趋势
  1. 同方差性:残差散点无特定模式
  1. 正态性:Jarque-Bera检验p值<0.05,拒绝正态性假设
  1. 自相关:Durbin-Watson值接近2,无自相关

滚动窗口分析(参数稳定性检验)

这段代码实现了滚动窗口Beta系数估计,用于分析特斯拉(TSLA)对市场(SPY)敏感度的时间变化:

  1. 设定滚动窗口大小为60个交易日(约3个月)
  1. 创建空列表存储计算得到的Beta值
  1. 使用循环,从第60天开始:
    • 提取前60天的SPY和TSLA收益率数据
    • 建立OLS回归模型
    • 提取回归系数中的Beta值(model.params[1])
    • 将Beta值添加到列表
  1. 绘制Beta值随时间的变化图
window_size = 60
betas = []

for i in range(window_size, len(returns)):
    X = r_spy[i-window_size:i]
    Y = r_tsla[i-window_size:i]
    model = sm.OLS(Y, sm.add_constant(X)).fit()
    betas.append(model.params[1])

plt.plot(betas)
plt.title('Rolling Beta Estimation')
plt.xlabel('Trading Day')
plt.ylabel('Beta Value')

这种滚动窗口分析能够揭示一个重要现象:Beta系数并非恒定不变,而是随时间波动的。这种分析对投资者和风险管理非常有价值,因为:

图表上的波动可能反映了特斯拉在不同时期的不同发展阶段、重大公司事件或市场环境变化对公司系统性风险敏感度的影响。

这是一种比单一Beta估计更深入的分析方法,展示了金融数据中的动态特性。

四、数学原理深入

最小二乘法推导

目标函数:最小化残差平方和

minα,βi=1n(Yi(α+βXi))2\min_{\alpha, \beta} \sum_{i=1}^n (Y_i - (\alpha + \beta X_i))^2

其中:

通过对α和β求偏导数并令其等于零,得到正规方程(normal equations),解这些方程得到的封闭解公式:

β=Cov(X,Y)Var(X)\beta = \frac{Cov(X,Y)}{Var(X)}
α=YˉβXˉ\alpha = \bar{Y} - \beta\bar{X}

其中:

标准误差计算

标准误差公式展示了回归参数估计的不确定性度量:

SE(β)=ϵi2(n2)(XiXˉ)2SE(\beta) = \sqrt{\frac{\sum \epsilon_i^2}{(n-2)\sum(X_i-\bar{X})^2}}

其中:

这个公式有几个关键点:

置信区间构建:

β±tcriticalSE(β)\beta \pm t_{critical} \cdot SE(\beta)

其中:

在CAPM模型中,这些公式的金融解释为:

回归分析在金融中的应用广泛,从简单的市场Beta计算到多因子模型的构建,这些数学基础都是必不可少的。您的推导非常规范,体现了对线性回归本质的深刻理解。

五、常见问题分析

伪回归案例

# 生成随机数据
np.random.seed(42)
X_random = np.random.randn(100)
Y_random = np.random.randn(100)

# 运行回归
random_results = linear_regression(X_random, Y_random)
print(random_results)

关键观察:即使数据完全随机,仍可能得到看似显著的回归结果(p<0.05的概率约5%),强调统计检验的重要性

模型误用场景


小练习

  1. 用yfinance获取AAPL和QQQ最近一年的数据,分析它们的beta值
  1. 生成XN(0,1)X \sim N(0,1)Y=2X+ε(εN(0,0.5))Y = 2X + \varepsilon (\varepsilon \sim N(0,0.5)),验证回归系数是否接近2
  1. 计算滚动窗口(30天)的beta值,观察市场变化期间参数稳定性
# 练习2参考答案
X = np.random.normal(0, 1, 100)
Y = 2*X + np.random.normal(0, 0.5, 100)
exercise_model = sm.OLS(Y, sm.add_constant(X)).fit()
print(exercise_model.summary())

附一:练习合集

附二:最小二乘法详细推导过程

1. 对于一组数据:

给定观测数据及线性模型,残差平方和可表示为:

i=1n(Yi(α+βXi))2\sum_{i=1}^n (Y_i - (\alpha + \beta X_i))^2

2. 对残差平方和求偏导:

对α求偏导:

i=1n(YiαβXi)=0\sum_{i=1}^n (Y_i - \alpha - \beta X_i) = 0

整理得:

YˉβXˉ\bar{Y} - \beta\bar{X}

对β求偏导:

i=1nXi(YiαβXi)=0\sum_{i=1}^n X_i(Y_i - \alpha - \beta X_i) = 0

3. 对β的表达式化简:

可得:

i=1nXiYi(YˉβXˉ)i=1nXiβi=1nXi2=0\sum_{i=1}^n X_iY_i - (\bar{Y} - \beta\bar{X})\sum_{i=1}^n X_i - \beta\sum_{i=1}^n X_i^2 = 0

观察到重要关系:

i=1n(XiXˉ)2=i=1nXi2nXˉ2\sum_{i=1}^n (X_i - \bar{X})^2 = \sum_{i=1}^n X_i^2 - n\bar{X}^2

以及:

i=1n(XiXˉ)(YiYˉ)=i=1nXiYinXˉYˉ\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y}) = \sum_{i=1}^n X_iY_i - n\bar{X}\bar{Y}

4. 最终结果:

β的表达式:

Cov(X,Y)Var(X)\frac{Cov(X,Y)}{Var(X)}

α的表达式:

YˉβXˉ\bar{Y} - \beta\bar{X}

这说明:最优拟合直线一定经过点(Xˉ,Yˉ)(\bar{X}, \bar{Y}),且斜率β等于协方差与方差之比。在金融领域中,这个β系数用于衡量个股相对于市场的系统性风险。