问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

通俗易懂!利用SARIMA做季节性时间序列预测全流程与实现代码

创作时间:
作者:
@小白创作中心

通俗易懂!利用SARIMA做季节性时间序列预测全流程与实现代码

引用
CSDN
1.
https://blog.csdn.net/QSJIQIXUEXI/article/details/136047367

SARIMA(季节性自回归积分滑动平均模型)是一种用于时间序列预测的统计模型,特别适用于具有季节性变化的数据。本文将详细介绍SARIMA模型的基本概念、与ARIMA模型的区别,以及如何使用Python实现完整的季节性时间序列预测流程。

SARIMA模型

SARIMA模型是一种用于时间序列预测的统计模型,全称为“季节性自回归积分滑动平均模型”(Seasonal Autoregressive Integrated Moving Average Model)。为了更容易理解,我们可以将这个模型名称拆解来看:

  1. 季节性(Seasonal): 这一部分考虑了数据随时间变化可能出现的周期性模式,比如说每年的某个季节销量上升或下降这样的季节性规律。
  2. 自回归(Autoregressive, AR): 这表示模型会用前一段时间内的数据来预测未来的值。想象一下,如果你在观察股市,你可能会发现今天的股价与过去几天的股价有关。
  3. 积分(Integrated, I): 这部分涉及到将时间序列转换为稳定的形式,使得序列的统计特性(如均值)不随时间改变。这通常通过差分完成,也就是计算连续观测之间的变化量。
  4. 滑动平均(Moving Average, MA): 这表示模型利用时间序列过去误差的平均值来做预测。这可以看作是一种平滑技术,有助于消除预测中的随机波动。

将这四部分结合起来,SARIMA模型就能够同时处理时间序列数据的季节性变化、趋势和随机波动。

SARIMA与ARIMA的区别

ARIMA模型像是一个有三个魔法镜的预言家。每个镜子都有它的特殊功能:

  1. 第一个镜子(自回归)可以让你看到过去的天气情况,帮你发现昨天和今天天气之间的联系。
  2. 第二个镜子(积分)是一个调整器,它可以调整你看到的信息,确保你不会因为时间的长短而迷失方向,让预测更加稳定。
  3. 第三个镜子(滑动平均)则可以展示过去预测的错误,帮你从以前的错误中学习,使你的预测更加准确。

SARIMA模型是ARIMA的升级版,除了有ARIMA的三个魔法镜之外,它还有一个特别的季节性镜子。这个镜子让你能够看到像夏天经常下雨这样的季节性规律,帮助你更好地预测那些每年这个时候会发生的事情。

简单来说,ARIMA是一个很棒的预测工具,适用于很多情况,但如果你要预测的事情中有明显的季节性变化(比如夏天比冬天更热),SARIMA模型就能提供额外的帮助。它就像是一个特别为处理季节性变化而加装了一个超级镜子的ARIMA模型。

所以,如果你只需要基本的预测,ARIMA就足够了;但如果你需要考虑到一年中不同时间的特殊情况,SARIMA会是更好的选择。

SARIMA公式简单回顾

SARIMA 模型是在 ARIMA 模型的基础上增加了3个超参数P、D、Q,以及一个额外的季节性周期参数S,能够采用 Box-Jenkins 方法的模型识别、估计和预测程序,因此方便随着更多历史数据的获得而对模型进行实时调整,其一般表达式为:

其中,P为季节自回归的最大滞后阶数,Q为周期性移动平均算子的最大滞后阶数,D 是季节性差分次数。当P=D=Q=0时,SARIMA模型就相当于ARIMA模型。

SARIMA模型使用要求

数据要求有周期性,样本量不能少于10个(越多越好,也跟周期性和需要预测未来的步长有关)。

SARIMA实现全流程讲解与代码

下图为1949年到1960年每月国际航空公司的乘客人数。从中可以看到明显的季节性,该周期为12个月。

1.加载数据与参数设置(Excel格式输入即可!)

Excel数据格式输入,只需输入一列数据即可~非常方便

%%  初始数据导入数据,训练样本、测试样本处理  
data = xlsread('data.xlsx');  
S = 12; %季节性序列变化周期  
step = 48;  %预测步长  

2.确定季节性与非季节性差分数

与ARIMA模型一样,使用SARIMA模型也要求数据平稳。不同的是SARIMA的差分项有两个,分别是季节性差分与非季节性差分。通常季节性差分经过一次即可,非季节性差分通常在0~3之间。

使用下述代码将原始序列进行差分计算,需要注意差分后的序列长度将会缩短。

for d = 0:3  
    D1 = LagOp({1 -1},'Lags',[0,d]);     %非季节差分项的滞后算子  
    D12 = LagOp({1 -1},'Lags',[0,1*S]);  %季节差分项的滞后算子  
    D = D1*D12;          %相乘  
    dY = filter(D,data); %对原数据进行差分运算  
    if(getStatAdfKpss(dY)) %数据平稳  
        disp(['非季节性差分数为',num2str(d),',季节性差分数为1']);  
        break;  
    end  
end  

3.确定SARIMA模型阶数(可自动确定)

用简单粗暴的暴力定阶方法,确定AR阶数p,MA阶数q,SAR阶数P,SMA阶数Q:

4.残差检验

为了确保确定的阶数合适,还需要进行残差检验。残差即原始信号减掉模型拟合出的信号后的残余信号。如果残差是随机正态分布的、不自相关的,这说明残差是一段白噪声信号,也就说明有用的信号已经都被提取到ARMA模型中了。

Standardized Residuals是查看残差是否接近正态分布,理想的残差要接近正态分布;
ACF和PACF检验残差的自相关和偏自相关,理想的结果应该在图中不存在超出蓝线的点;
最后一张QQ图是检验残差是否接近正太分布的,理想的结果中蓝点应该靠近红线。

5.预测

进行预测,并输出95%置信区间!

6.绘制结果图

最后绘制结果图,大功告成!可以看到预测效果还是非常不错的,能够反映未来的趋势~

figure('Visible','on')  
plot(data,'Color',[.7,.7,.7]);  
hold on  
h1 = plot(length(data):length(data)+step,[data(end);lower],'r:','LineWidth',2);  
plot(length(data):length(data)+step,[data(end);upper],'r:','LineWidth',2)  
h2 = plot(length(data):length(data)+step,[data(end);forData],'k','LineWidth',2);  
legend([h1 h2],'95% 置信区间','预测值',...  
       'Location','NorthWest')  
title('Forecast')  
hold off  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号