一、核心概念解析#
什么是线性回归?#
线性回归是用于量化两个变量间线性关系的统计方法。给定自变量X和因变量Y,我们试图找到最佳拟合直线Y = α + βX,其中:
-
α代表截距(当X=0时Y的值)
-
β代表斜率(X每变动1单位,Y的平均变动量)
关键公式:
其中ε为误差项,服从均值为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)收益率之间的关系:
-
linear_regression函数接受自变量X(SPY收益率)和因变量Y(TSLA收益率) -
使用statsmodels库添加常数项(截距)
-
建立普通最小二乘(OLS)回归模型并拟合
-
使用seaborn的regplot绘制散点图和回归线
-
返回详细的回归统计结果
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)结果解读要点:
-
R-squared:0.202表示SPY收益率可解释TSLA 20.2%的波动
-
系数显著性:
-
截距(const)的 p 值0.532 > 0.05,统计不显著
-
斜率(x1) p 值0.000,高度显著
-
-
Beta值:1.9271表示SPY每变动1%,TSLA平均变动1.927%
这种分析在金融中非常重要,可用于:
-
计算资本资产定价模型(CAPM)中的Beta
-
评估股票的系统性和非系统性风险
-
投资组合管理中的风险预测和业绩归因
Beta值1.927表明特斯拉是一只波动性较大的成长型股票,对市场变动非常敏感。
三、模型验证与诊断#
回归假设检验#
-
线性假设:散点图呈线性趋势
-
同方差性:残差散点无特定模式
-
正态性:Jarque-Bera检验 p 值<0.05,拒绝正态性假设
-
自相关:Durbin-Watson值接近2,无自相关
滚动窗口分析(参数稳定性检验)#
这段代码实现了滚动窗口Beta系数估计,用于分析特斯拉(TSLA)对市场(SPY)敏感度的时间变化:
-
设定滚动窗口大小为60个交易日(约3个月)
-
创建空列表存储计算得到的Beta值
-
使用循环,从第60天开始:
-
提取前60天的SPY和TSLA收益率数据
-
建立OLS回归模型
-
提取回归系数中的Beta值(model.params[1])
-
将Beta值添加到列表
-
-
绘制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系数的结构性变化(例如公司转型或业务模式改变)
-
提供更动态的风险评估,而不是依赖静态Beta
图表上的波动可能反映了特斯拉在不同时期的不同发展阶段、重大公司事件或市场环境变化对公司系统性风险敏感度的影响。
这是一种比单一Beta估计更深入的分析方法,展示了金融数据中的动态特性。
四、数学原理深入#
最小二乘法推导#
目标函数:最小化残差平方和
其中:
-
表示对参数 α 和 β 求最小值
-
表示从 i=1 到 n 的求和
-
是因变量的实际观测值
-
是自变量的观测值
-
α 是截距项
-
β 是斜率系数
通过对α和β求偏导数并令其等于零,得到正规方程(normal equations),解这些方程得到的封闭解公式:
其中:
-
Cov(X,Y) 是 X 和 Y 的协方差
-
Var(X) 是 X 的方差
-
是因变量 Y 的均值
-
是自变量 X 的均值
标准误差计算#
标准误差公式展示了回归参数估计的不确定性度量:
其中:
-
是残差平方和
-
是自由度
-
是自变量的观测值
-
是自变量的均值
-
是自变量的离差平方和
这个公式有几个关键点:
-
分母中的(n-2)是自由度调整,反映了估计两个参数(α和β)
-
误差的大小与残差平方和成正比
-
误差与自变量变异性(离差平方和)成反比
置信区间构建:
其中:
-
β 是回归系数的点估计值
-
是给定置信水平和自由度下的 t 临界值
-
是 β 的标准误差
-
± 表示置信区间的上下界
在CAPM模型中,这些公式的金融解释为:
-
β代表股票对市场变动的敏感度
-
标准误差用于判断β估计值的置信程度
-
置信区间帮助分析师判断β是否显著不同于1(与市场同步)
回归分析在金融中的应用广泛,从简单的市场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%),强调统计检验的重要性
模型误用场景#
-
非线性关系(尝试二次回归)
-
存在异常值(使用稳健回归)
-
时间序列数据(需检查平稳性)
小练习
-
用yfinance获取AAPL和QQQ最近一年的数据,分析它们的beta值
-
生成,,验证回归系数是否接近2
-
计算滚动窗口(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. 对于一组数据:#
给定观测数据及线性模型,残差平方和可表示为:
2. 对残差平方和求偏导:#
对α求偏导:
整理得:
对β求偏导:
3. 对β的表达式化简:#
可得:
观察到重要关系:
以及:
4. 最终结果:#
β的表达式:
α的表达式:
这说明:最优拟合直线一定经过点,且斜率β等于协方差与方差之比。在金融领域中,这个β系数用于衡量个股相对于市场的系统性风险。