python打卡 DAY 58 经典时序预测模型2
系数显著性:P>|z|应<0.05信息准则:AIC/BIC越小越好残差诊断Ljung-Box检验(p>0.05)Jarque-Bera检验(残差正态性)系数值范围AR系数应位于(-1,1)保证平稳MA系数应位于(-1,1)保证可逆。
·
目录
1. 时序建模标准流程
完整建模流程图

2. 经典时序数据集
常用单变量数据集
| 数据集 | 特点 | 适用模型 |
|---|---|---|
| AirPassengers | 明显趋势+季节性(月度航空乘客) | SARIMA |
| Sunspots | 周期性波动(太阳黑子) | ARMA/ARIMA |
| JohnsonJohnson | 季度财报数据 | 季节ARIMA |
| Nile | 年度尼罗河流量 | 简单AR/趋势模型 |
数据加载示例
import pandas as pd
from statsmodels.datasets import get_rdataset
# 加载AirPassengers数据集
data = get_rdataset('AirPassengers')
series = data.data['value']
series.index = pd.date_range(start='1949-01', periods=len(series), freq='M')
# 可视化
series.plot(figsize=(12,5), title='Monthly Airline Passengers (1949-1960)')
plt.ylabel('Passengers')
plt.show()
3. ARIMA模型实战
参数解释
-
p:自回归阶数(PACF截尾点)
-
d:差分次数(使序列平稳)
-
q:移动平均阶数(ACF截尾点)
建模示例
from statsmodels.tsa.arima.model import ARIMA
# 1. 数据准备(已确保平稳)
train = series[:'1959-12']
test = series['1960-01':]
# 2. 拟合ARIMA(2,1,1)模型
model = ARIMA(train, order=(2,1,1))
results = model.fit()
# 3. 模型摘要
print(results.summary())
# 4. 预测与评估
forecast = results.get_forecast(steps=12)
pred_mean = forecast.predicted_mean
pred_ci = forecast.conf_int()
# 5. 可视化
plt.figure(figsize=(12,6))
plt.plot(train, label='Training')
plt.plot(test, label='Actual')
plt.plot(pred_mean, label='Forecast')
plt.fill_between(pred_ci.index,
pred_ci.iloc[:,0],
pred_ci.iloc[:,1],
color='k', alpha=0.1)
plt.legend()
plt.title('ARIMA(2,1,1) Forecast vs Actual')
plt.show()
4. SARIMA模型解析
季节参数
-
P:季节AR阶数
-
D:季节差分次数
-
Q:季节MA阶数
-
m:季节周期(月度=12,季度=4)
摘要图解读要点
-
系数显著性:P>|z|应<0.05
-
信息准则:AIC/BIC越小越好
-
残差诊断:
-
Ljung-Box检验(p>0.05)
-
Jarque-Bera检验(残差正态性)
-
-
系数值范围:
-
AR系数应位于(-1,1)保证平稳
-
MA系数应位于(-1,1)保证可逆
-
5. 差分处理技术
趋势差分(n阶差分)
# 一阶差分(消除线性趋势)
diff_1 = series.diff(1).dropna()
# 二阶差分(消除二次趋势)
diff_2 = series.diff(1).diff(1).dropna()
# 自动确定差分阶数
from pmdarima.arima import ndiffs
n_adf = ndiffs(series, test='adf') # 基于ADF检验
print(f'推荐差分阶数: {n_adf}')
季节差分
# 月度数据的季节差分(周期=12)
seasonal_diff = series.diff(12).dropna()
# 组合差分(趋势+季节)
combined_diff = series.diff(1).diff(12).dropna()
# 可视化对比
fig, axes = plt.subplots(3,1, figsize=(12,9))
series.plot(ax=axes[0], title='Original')
diff_1.plot(ax=axes[1], title='Trend Differencing (d=1)')
combined_diff.plot(ax=axes[2], title='Trend+Seasonal Differencing (d=1,D=12)')
plt.tight_layout()
综合案例:AirPassengers完整建模
步骤1:数据探索
# 分解季节性
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(series, model='multiplicative')
result.plot()
plt.tight_layout()
步骤2:平稳性处理
# 对数变换处理异方差
log_series = np.log(series)
# 组合差分
diff_series = log_series.diff(1).diff(12).dropna()
# 验证平稳性
adfuller(diff_series) # p应<0.05
步骤3:SARIMA建模
from statsmodels.tsa.statespace.sarimax import SARIMAX
# 拟合SARIMA(1,1,1)(1,1,1,12)模型
model = SARIMAX(log_series,
order=(1,1,1),
seasonal_order=(1,1,1,12))
results = model.fit()
# 模型诊断
results.plot_diagnostics(figsize=(12,8))
plt.tight_layout()
步骤4:预测反变换
# 获得预测值(对数尺度)
forecast = results.get_forecast(steps=24)
pred_mean = forecast.predicted_mean
pred_ci = forecast.conf_int()
# 指数变换还原
final_pred = np.exp(pred_mean)
true_values = np.exp(log_series[-24:])
# 计算MAPE
mape = np.mean(np.abs(final_pred - true_values)/true_values) * 100
print(f'MAPE: {mape:.2f}%')
关键问题解决方案
-
过拟合判断:
-
比较AIC/BIC与样本外误差
-
检查系数是否接近可逆边界
-
-
预测值漂移:
-
检查是否漏检季节性
-
尝试乘法模型替代加法模型
-
-
残差相关性:
-
增加MA阶数
-
考虑外部变量或更复杂模型
-
-
长期预测失效:
-
改用递归策略
-
结合其他预测方法(如Prophet)
-
更多推荐



所有评论(0)