You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未设置季节项的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快得多的速度上升,泛化能力差的问题会凸显出来。

测试结果图

结果图

可复现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:05