查看全集:💎Quantopia量化分析56讲
模型设定指选择适合数据的函数形式,包含三个要素:因变量、自变量和函数形式。错误的模型设定会导致回归假设被违反,影响模型准确性。本教程将系统讲解常见的模型设定错误及解决方法。
当模型中遗漏与已包含变量相关的关键解释变量时,会导致系数估计偏差。例如两个股票价格都受大盘影响,若遗漏大盘变量,可能误判两股票间的伪因果关系。
真实模型:
错误模型:
这描述了遗漏变量偏误的情况:
这是计量经济学中的一个重要概念,说明模型设定错误可能导致参数估计有偏。
import yfinance as yf
import statsmodels.api as sm
# 获取数据
start = '2013-01-01'
end = '2015-01-01'
bench = yf.download('SPY', start=start, end=end)['Adj Close']
aapl = yf.download('AAPL', start=start, end=end)['Adj Close']
lrcx = yf.download('LRCX', start=start, end=end)['Adj Close']
# 回归分析
X = sm.add_constant(lrcx)
model1 = sm.OLS(aapl, X).fit()
X_bench = sm.add_constant(bench)
model_bench = sm.OLS(lrcx, X_bench).fit()
print(f"AAPL与LRCX的R²: {model1.rsquared:.3f}")
print(f"LRCX与SPY的R²: {model_bench.rsquared:.3f}")
时间范围 | AAPL-LRCX R² | LRCX-SPY R² |
2013-2015 | 0.911 | 0.875 |
2009-2015 | 0.500 | 0.747 |
结论:长期来看个股与大盘的相关性更稳定
情形 | 影响 | R²变化 |
包含真正无关变量 | 降低估计精度 | 调整R²下降 |
包含弱相关变量 | 可能导致过拟合 | 样本内R²虚高 |
# 获取多只股票数据
tickers = ['PEP', 'MCD', 'ATHN', 'DOW', 'PG']
data = yf.download(tickers, start='2014-01-01', end='2015-01-01')['Adj Close']
# 单变量 vs 多变量回归
X_single = sm.add_constant(data['PEP'])
model_single = sm.OLS(data['PG'], X_single).fit()
X_multi = sm.add_constant(data[['PEP','MCD','ATHN','DOW']])
model_multi = sm.OLS(data['PG'], X_multi).fit()
print(f"单变量调整R²: {model_single.rsquared_adj:.3f}")
print(f"多变量调整R²: {model_multi.rsquared_adj:.3f}")
# 扩展时间范围测试
new_data = yf.download(tickers, start='2015-01-01', end='2015-06-01')['Adj Close']
# 使用原模型预测
pred_single = model_single.params[0] + model_single.params[1]*new_data['PEP']
pred_multi = model_multi.params[0] + new_data[['PEP','MCD','ATHN','DOW']] @ model_multi.params[1:]
# 计算样本外R²
SST = ((new_data['PG'] - new_data['PG'].mean())**2).sum()
SSR_single = ((pred_single - new_data['PG'])**2).sum()
print(f"单变量样本外R²: {1 - SSR_single/SST:.3f}")
形式 | 方程 | 适用场景 |
线性模型 | | 简单比例关系 |
对数线性模型 | | 指数增长关系 |
多项式模型 | | 存在拐点的情况 |
给定数据集:
import numpy as np
X = np.linspace(1, 10, 100)
Y = 2 + 3*np.log(X) + np.random.normal(0, 0.5, 100)
请尝试:
使用ADF检验判断序列平稳性:
from statsmodels.tsa.stattools import adfuller
# 生成随机游走
np.random.seed(42)
rw = np.cumsum(np.random.randn(1000))
# 执行ADF检验
result = adfuller(rw)
print(f'ADF统计量: {result[0]:.2f}')
print(f'p值: {result[1]:.4f}')
# 一阶差分
diff = rw[1:] - rw[:-1]
# 再次检验
result_diff = adfuller(diff)
print(f'差分后p值: {result_diff[1]:.4f}')
练习:下载任意两只股票5年数据,尝试:
- 检验它们的价格序列是否平稳
- 建立回归模型分析相关性
- 引入大盘指数作为控制变量,观察系数变化
通过系统理解这些模型设定问题,可显著提升计量分析的有效性。记住:好的模型始于理论构建,而非单纯的数据挖掘。