跳到主内容
研究主线统计估计与回归基础 · 第6–13讲7/8模块导览 →
讲义

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

从最小二乘、残差和拟合优度解释线性回归,使用股票收益估计关系,并检查置信区间与模型假设。

完成状态保存在当前浏览器,可随时取消。

一、核心概念解析#

什么是线性回归?#

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

  • α代表截距(当X=0时Y的值)

  • β代表斜率(X每变动1单位,Y的平均变动量)

关键公式:

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

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

线性回归 vs 相关性分析#

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

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

环境准备#

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

数据获取与处理#

code
# 获取特斯拉和标普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收益率)

  2. 使用statsmodels库添加常数项(截距)

  3. 建立普通最小二乘(OLS)回归模型并拟合

  4. 使用seaborn的regplot绘制散点图和回归线

  5. 返回详细的回归统计结果

code
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%的波动

  2. 系数显著性

    • 截距(const)的 p 值0.532 > 0.05,统计不显著

    • 斜率(x1) p 值0.000,高度显著

  3. Beta值:1.9271表示SPY每变动1%,TSLA平均变动1.927%

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

  • 计算资本资产定价模型(CAPM)中的Beta

  • 评估股票的系统性和非系统性风险

  • 投资组合管理中的风险预测和业绩归因

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

三、模型验证与诊断#

回归假设检验#

  1. 线性假设:散点图呈线性趋势

  2. 同方差性:残差散点无特定模式

  3. 正态性:Jarque-Bera检验 p 值<0.05,拒绝正态性假设

  4. 自相关:Durbin-Watson值接近2,无自相关

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

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

  1. 设定滚动窗口大小为60个交易日(约3个月)

  2. 创建空列表存储计算得到的Beta值

  3. 使用循环,从第60天开始:

    • 提取前60天的SPY和TSLA收益率数据

    • 建立OLS回归模型

    • 提取回归系数中的Beta值(model.params[1])

    • 将Beta值添加到列表

  4. 绘制Beta值随时间的变化图

code
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系数的结构性变化(例如公司转型或业务模式改变)

  • 提供更动态的风险评估,而不是依赖静态Beta

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

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

四、数学原理深入#

最小二乘法推导#

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

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

其中:

  • minα,β\min_{\alpha, \beta}表示对参数 α 和 β 求最小值

  • i=1n\sum_{i=1}^n 表示从 i=1 到 n 的求和

  • YiY_i是因变量的实际观测值

  • XiX_i是自变量的观测值

  • α 是截距项

  • β 是斜率系数

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

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

其中:

  • Cov(X,Y) 是 X 和 Y 的协方差

  • Var(X) 是 X 的方差

  • Yˉ\bar{Y}是因变量 Y 的均值

  • Xˉ\bar{X} 是自变量 X 的均值

标准误差计算#

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

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

其中:

  • ϵi2\sum \epsilon_i^2 是残差平方和

  • n2n-2 是自由度

  • XiX_i 是自变量的观测值

  • Xˉ\bar{X}是自变量的均值

  • (XiXˉ)2\sum(X_i-\bar{X})^2是自变量的离差平方和

这个公式有几个关键点:

  • 分母中的(n-2)是自由度调整,反映了估计两个参数(α和β)

  • 误差的大小与残差平方和成正比

  • 误差与自变量变异性(离差平方和)成反比

置信区间构建:

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

其中:

  • β 是回归系数的点估计值

  • tcriticalt_{critical}是给定置信水平和自由度下的 t 临界值

  • SE(β)SE(β)是 β 的标准误差

  • ± 表示置信区间的上下界

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

  • β代表股票对市场变动的敏感度

  • 标准误差用于判断β估计值的置信程度

  • 置信区间帮助分析师判断β是否显著不同于1(与市场同步)

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

五、常见问题分析#

伪回归案例#

code
# 生成随机数据
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值

  2. 生成XN(0,1)X \sim N(0,1)Y=2X+ε(εN(0,0.5))Y = 2X + \varepsilon (\varepsilon \sim N(0,0.5)),验证回归系数是否接近2

  3. 计算滚动窗口(30天)的beta值,观察市场变化期间参数稳定性

code
# 练习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}),且斜率β等于协方差与方差之比。在金融领域中,这个β系数用于衡量个股相对于市场的系统性风险。