目录
⭐️引言
什么是自回归模型 (AR):简要介绍自回归模型的概念及其在时间序列分析中的重要性。
⭐️理论
自回归模型 (AR) 是一种统计方法,通过利用因变量的过去值来预测其当前值,广泛应用于时间序列分析;在Python中,常用的包为 statsmodels 包,它们提供了强大的数据处理和模型拟合功能。
1、基本概念:
时间序列数据:定义时间序列数据及其特点。
滞后:解释什么是滞后以及如何表示滞后值。
适用案例:如股票价格、气温数据等。
2、自回归模型的数学表达式:
表示因变量在时间的值。
分别表示因变量的 个滞后值。
是模型的截距项。
是对应的滞后系数。
是在时间 的误差项,通常假定为白噪声,即均值为0,方差为常数的随机变量。
3、模型的构建
(1)生成数据
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(42)
dates = pd.date_range('2020-01-01', periods=100, freq='D')
Y = np.random.randn(100).cumsum()
data = pd.DataFrame({'Date': dates, 'Y': Y})
data.set_index('Date', inplace=True)
# 查看数据
print(data.head())
(2)滞后规则生成
def generate_lags(df, column, max_lag):
"""
生成指定列的滞后值
:param df: DataFrame
:param column: 需要生成滞后值的列名
:param max_lag: 最大滞后阶数
:return: 包含滞后值的DataFrame
"""
for i in range(1, max_lag + 1):
df[f'{column}_lag{i}'] = df[column].shift(i)
return df
# 生成滞后值
max_lag = 2
data_with_lags = generate_lags(data, 'Y', max_lag)
# 删除含有NA值的行
data_with_lags.dropna(inplace=True)
# 查看生成滞后值后的数据
print(data_with_lags.head())
4、平稳性检验
平稳性检验在时间序列分析中至关重要,它确保模型的有效性和可靠性,避免伪回归现象,提高模型的预测能力和解释能力。通过检验时间序列的统计特性是否在时间上保持不变,平稳性检验帮助选择合适的模型,诊断和改进模型,确保数据在建模前符合模型假设。常见的平稳性检验方法包括Augmented Dickey-Fuller (ADF) 检验和Kwiatkowski-Phillips-Schmidt-Shin (KPSS) 检验。
def check_stationarity(series):
result = adfuller(series)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
for key, value in result[4].items():
print(f'Critical Value ({key}): {value}')
check_stationarity(data_with_lags['Y'])
5、模型选择
模型选择在时间序列分析中起着至关重要的作用,它通过确定最佳的模型结构和参数,确保模型能够准确地捕捉数据的动态特性,提高预测精度,避免过拟合和欠拟合,优化模型参数,从而提升模型的整体性能和可靠性。
# 使用AIC准则选择最优滞后阶数
best_aic = float("inf")
best_order = 0
for p in range(1, 11): # 尝试1到10阶滞后
model = sm.tsa.ARIMA(data['Y'], order=(p, 0, 0))
results = model.fit()
if results.aic < best_aic:
best_aic = results.aic
best_order = p
print(f'Best lag order: {best_order}')
6、模型拟合
根据之前确定的最优滞后阶数 `best_order` 构建自回归模型,并使用普通最小二乘法(OLS)拟合模型。具体步骤包括:选择最优滞后阶数 `p`,生成包含滞后值的自变量矩阵 `X`,添加常数项,提取因变量 `y`,构建并拟合 OLS 模型,最后输出模型的汇总信息。
# 选择最优滞后阶数
p = best_order
# 构建并拟合自回归模型
X = data_with_lags[[f'Y_lag{i}' for i in range(1, p + 1)]]
X = sm.add_constant(X)
y = data_with_lags['Y']
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())
7、模型诊断
下列代码的作用是检查和诊断自回归模型的残差,确保模型的假设条件得到满足。具体步骤包括:提取模型残差,绘制残差的自相关图和偏自相关图以检查残差的自相关性,绘制残差的Q-Q图以检查残差的正态性。这些诊断步骤有助于验证模型的拟合效果和可靠性。
# 检查残差
residuals = results.resid
# 绘制残差的自相关图和偏自相关图
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
sm.graphics.tsa.plot_acf(residuals, lags=20, ax=ax[0])
sm.graphics.tsa.plot_pacf(residuals, lags=20, ax=ax[1])
plt.show()
# 检查残差的正态性
import scipy.stats as stats
# 绘制残差的QQ图
stats.probplot(residuals, dist="norm", plot=plt)
plt.title("Q-Q Plot of Residuals")
plt.show()
8、模型应用
下列代码用于预测时间序列未来的值。首先,它生成了从数据集最后一个时间点开始的未来10个时间点的日期范围,并创建了一个用于存放未来数据的DataFrame。接着,基于已有的滞后值,计算了未来数据的相应滞后值。然后,向未来数据的特征集中添加了常数项。最后,使用训练好的模型对未来的10个时间点进行了预测,并将预测结果与原始观测数据一起绘制成图,以便直观地比较和展示预测趋势。
# 预测未来10个时间点
future_dates = pd.date_range(start=data.index[-1], periods=11, closed='right', freq='D')
future_data = pd.DataFrame(index=future_dates, columns=data.columns)
# 生成未来数据的滞后值
for i in range(1, p + 1):
future_data[f'Y_lag{i}'] = data_with_lags[f'Y_lag{i}'].iloc[-i:].append(pd.Series([np.nan] * (10 - i)))
future_data.dropna(inplace=True)
# 添加常数项
future_X = sm.add_constant(future_data[[f'Y_lag{i}' for i in range(1, p + 1)]])
# 进行预测
predictions = results.predict(future_X)
# 绘制预测结果
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['Y'], label='Observed')
plt.plot(future_data.index, predictions, color='r', label='Forecast')
plt.legend()
plt.show()
9、结语
本文通过构建和应用自回归模型(AR),能够有效地利用时间序列数据的过去值来预测其未来值。本文详细介绍了从生成滞后值、确保数据平稳性、选择最优滞后阶数,到模型拟合、诊断和预测的完整流程。通过这些步骤,我们不仅确保了模型的有效性和可靠性,还提高了预测的准确性和解释能力。希望本文的内容能为读者在时间序列分析和预测方面提供有价值的参考和实践指导。
标签:plt,Python,模型,lag,lags,滞后,data,回归 From: https://blog.csdn.net/m0_57916248/article/details/143503342