未设置季节项的ARIMA模型为何能拟合季节性时间序列?
普通非季节性ARIMA能拟合季节性数据的原因
首先纠正普遍认知的误区:大家常说的「ARIMA无法处理季节性」指的是非季节性ARIMA(也就是你代码里设置seasonal_order=(0,0,0,0)的版本)处理季节性的效率、泛化能力远低于专门的SARIMA模型,而非完全无法捕捉季节性规律。你测试出现的现象完全符合模型原理,具体原因如下:
- 你的模型滞后阶数刚好匹配数据的季节性周期:你用的是季度频率的消费数据,固有季节性周期为4(每4个季度重复一次规律),而你设置的ARIMA阶数是
(4,1,4),也就是AR项滞后4阶、MA项滞后4阶,模型在训练时会自动纳入滞后1-4期的观测值、误差项作为预测特征,刚好可以覆盖到上一年同季度的数值规律,自然能捕捉到每4期一次的峰值特征。 - 测试数据集的季节性极强且稳定:UKNonDurables数据集记录的是英国非耐用品消费额,这类消费的季度季节性非常固定(比如年末假日消费冲高的规律年复一年稳定存在),用足够多的滞后项就可以很好的拟合这种强规律。
- 如果你想复现普通ARIMA的局限性,可以做这几个调整测试:
- 把AR阶数调低到小于4,比如设置
order=(2,1,2),你会发现模型很快就捕捉不到季节性规律 - 换用月度频率的季节性数据,周期为12,再用阶数小于12的普通ARIMA拟合,也会出现明显的季节性拟合缺失
- 拉长预测的步长,普通ARIMA的季节性预测误差会比SARIMA快得多的速度上升,泛化能力差的问题会凸显出来。
- 把AR阶数调低到小于4,比如设置
测试结果图

可复现代码
from statsmodels.datasets import get_rdataset from statsmodels.tsa.arima.model import ARIMA import matplotlib.pyplot as plt import seaborn as sns sns.set() # 获取数据 uk = get_rdataset('UKNonDurables', 'AER') uk = uk.data uk_pre1980 = uk[uk.time <= 1980] # 构建ARIMA模型 order = (4, 1, 4) # 不添加季节性组件 seasonal_order = (0, 0, 0, 0) arima = ARIMA(uk_pre1980.value, order=order, seasonal_order=seasonal_order, trend='n') res = arima.fit() # 绘图 all_elements = len(uk) - len(uk_pre1980) plt.plot(uk.value, 'b', label='实际值') plt.plot(res.forecast(steps=all_elements), 'r', label='预测值') plt.title(f'阶数={order}, 季节性阶数={seasonal_order}') plt.legend() plt.show()
模型摘要截图

内容的提问来源于stack exchange,提问作者codeananda
相关产品推荐
相关产品推荐

