在季节性自回归积分滑动平均模型SARIMA这个名字中,“S”代表的是“季节性”(Seasonal),这个“季节性”就是模型中的一个重要特色——它能捕捉到那些像四季更替一样,按照一定周期规律性出现的模式。你可以想象,就好比你每年的春节都会吃饺子,夏天会吃西瓜,这种规律性的变化就是我们所说的季节性。
那么,SARIMA模型是怎么做到捕捉这种季节性的呢?它实际上是在我们已经熟知的ARIMA模型上,加入了一个针对季节性变化的结构。回忆一下ARIMA模型,它由三个部分组成:自回归(AR)部分、差分(I)部分和滑动平均(MA)部分。自回归部分关注过去的值对现在的影响,滑动平均部分关注过去的误差对现在的影响,而差分则是为了让数据更加稳定。
当我们把季节性的特色引入到ARIMA模型中,就像是给模型穿上了一件随着季节不断变换的外衣。SARIMA模型不仅考虑了时间序列的一般趋势,还特别关注那些每隔特定时间段就会出现一次的周期性变化。
例如,如果我们要分析一个冰淇淋店的销量,那么除了关注每天、每周的销售变化(这是ARIMA模型能做的),我们还会特别关注夏季销量的季节性高峰,这正是SARIMA模型擅长的地方。
季节性自回归积分滑动平均模型(SARIMA)是ARIMA模型的扩展,用于处理具有明显季节性变化的时间序列数据。它在ARIMA模型的基础上添加了季节性成分,以更好地捕捉季节性变化的影响。
SARIMA模型的原理如下:
综合上述成分,SARIMA模型的数学表示如下:
SARIMA(p,d,q)(P,D,Q,s):
其中:
以下是关于新的参数的解释:
当然可以,让我们逐一详细解释这些参数和概念:
季节性自回归系数(Seasonal AR parameters)( ):
季节性自回归系数用于量化时间序列中过去的季节性周期对当前周期的影响。在SARIMA模型中,我们不仅关心近期的数据点对未来的影响,还关心上一个或几个季节周期相同时间点的数据对未来的影响。例如,今年3月的销售可能受到去年3月销售的影响。系数 对应于一个季节周期之前的影响, 对应于两个季节周期之前的影响,以此类推,直至 ,它对应于P个季节周期之前的影响。
季节性移动平均系数(Seasonal MA parameters)( ):
类似于季节性自回归系数,季节性移动平均系数描述的是过去季节性周期中的误差项如何影响当前周期的观测值。比如, 衡量了上一个季节周期同一时间点的误差对当前值的影响。如果 很大,它表明过去季节性周期的误差对当前周期有重要影响。
季节性差分次数(Order of seasonal differencing):
季节性差分次数用于使季节性数据变得平稳。如果时间序列表现出季节性趋势(例如,由于季节变化导致的周期性增减),则可以通过对相隔特定季节周期长度的数据进行差分来消除这种季节性趋势。D值决定了进行多少次这样的季节性差分。例如,D=1时,我们计算的是本期数据与上一季度同期数据之间的差异。
季节性周期长度(Seasonal period):
季节性周期长度指明了时间序列数据中重复出现的季节性模式的周期。具体来说,它是时间序列中完成一次循环所需的时间点数。例如,对于月度数据,如果存在年度季节性模式,那么s=12,因为一年有12个月。在SARIMA模型中,s决定了我们应该如何设置季节性自回归和季节性移动平均参数,以及在进行季节性差分时应该比较多远的过去数据。
在SARIMA模型中,术语“季节性”(Seasonality)不仅局限于一年四季这种自然季节的周期性变化,而是指任何类型的周期性重复模式。季节性可以是一天内的小时变化、一周内的星期变化、一个月内的日变化、一年内的月变化,或者其他任何具有一定周期的规律性波动。
例如,零售业可能会发现周末的销售额比工作日高,因此可以说零售销售数据具有“周季节性”。同样,电力消耗可能在一天内的某些小时内峰值更高,显示出“日季节性”。在这些情况下,季节性周期长度s将分别是7(一周的天数)和24(一天的小时数)。
1import numpy as np
2import pandas as pd
3from statsmodels.tsa.statespace.sarimax import SARIMAX
4
5# 生成一个示例数据
6np.random.seed(0)
7n = 100
8data = np.random.normal(loc=0, scale=1, size=n) # 生成一个长度为 n 的服从正态分布的随机数据
9index = pd.date_range(start='2022-01-01', periods=n, freq='D') # 创建一个时间索引,从 '2022-01-01' 开始,按天递增,总共长度为 n
10series = pd.Series(data, index=index) # 创建一个时间序列对象,将随机数据和时间索引结合起来
11
12# 拟合 SARIMA 模型
13order = (1, 0, 1) # AR 阶数为 1,差分阶数为 0,MA 阶数为 1
14seasonal_order = (1, 0, 1, 12) # 季节性部分:季节 AR 阶数为 1,差分阶数为 0,季节 MA 阶数为 1,季节周期为 12 (假设数据是按月季节性的)
15model = SARIMAX(series, order=order, seasonal_order=seasonal_order) # 创建 SARIMA 模型对象
16results = model.fit() # 拟合模型,估计模型参数
17
18# 输出模型拟合结果
19print(results.summary())
20
21# 预测未来的值
22forecast_start = series.index[-1] + pd.DateOffset(days=1) # 预测起始日期为最后一个观测值的下一天
23forecast_end = forecast_start + pd.DateOffset(days=10) # 预测结束日期为起始日期后的 10 天
24forecast = results.predict(start=forecast_start, end=forecast_end) # 获取未来的预测值
25
26# 打印预测结果
27print(forecast)
1import numpy as np
2import pandas as pd
3from statsmodels.tsa.statespace.sarimax import SARIMAX
4
5# 生成一个示例数据
6np.random.seed(0)
7n = 100
8data = np.random.normal(loc=0, scale=1, size=n) # 生成一个长度为 n 的服从正态分布的随机数据
9index = pd.date_range(start='2022-01-01', periods=n, freq='D') # 创建一个时间索引,从 '2022-01-01' 开始,按天递增,总共长度为 n
10series = pd.Series(data, index=index) # 创建一个时间序列对象,将随机数据和时间索引结合起来
11
12# 拟合 SARIMA 模型
13order = (1, 0, 1) # AR 阶数为 1,差分阶数为 0,MA 阶数为 1
14seasonal_order = (1, 0, 1, 12) # 季节性部分:季节 AR 阶数为 1,差分阶数为 0,季节 MA 阶数为 1,季节周期为 12 (假设数据是按月季节性的)
15model = SARIMAX(series, order=order, seasonal_order=seasonal_order) # 创建 SARIMA 模型对象
16results = model.fit() # 拟合模型,估计模型参数
17
18# 输出模型拟合结果
19print(results.summary())
20
21# 预测未来的值
22forecast_start = series.index[-1] + pd.DateOffset(days=1) # 预测起始日期为最后一个观测值的下一天
23forecast_end = forecast_start + pd.DateOffset(days=10) # 预测结束日期为起始日期后的 10 天
24forecast = results.predict(start=forecast_start, end=forecast_end) # 获取未来的预测值
25
26# 打印预测结果
27print(forecast)
输出结果:
1 SARIMAX Results
2==========================================================================================
3Dep. Variable: y No. Observations: 100
4Model: SARIMAX(1, 0, 1)x(1, 0, 1, 12) Log Likelihood -139.420
5Date: Mon, 25 Dec 2023 AIC 288.840
6Time: 21:13:41 BIC 301.866
7Sample: 01-01-2022 HQIC 294.112
8 - 04-10-2022
9Covariance Type: opg
10==============================================================================
11 coef std err z P>|z| [0.025 0.975]
12------------------------------------------------------------------------------
13ar.L1 0.9496 0.076 12.429 0.000 0.800 1.099
14ma.L1 -0.8849 0.109 -8.133 0.000 -1.098 -0.672
15ar.S.L12 -0.1235 0.669 -0.184 0.854 -1.435 1.189
16ma.S.L12 0.3124 0.646 0.483 0.629 -0.954 1.579
17sigma2 0.9446 0.138 6.821 0.000 0.673 1.216
18===================================================================================
19Ljung-Box (L1) (Q): 0.18 Jarque-Bera (JB): 0.23
20Prob(Q): 0.67 Prob(JB): 0.89
21Heteroskedasticity (H): 0.71 Skew: -0.11
22Prob(H) (two-sided): 0.33 Kurtosis: 2.92
23===================================================================================
24
25Warnings:
26[1] Covariance matrix calculated using the outer product of gradients (complex-step).
272022-04-11 0.078323
282022-04-12 0.443604
292022-04-13 0.112575
302022-04-14 0.429993
312022-04-15 0.273543
322022-04-16 0.305122
332022-04-17 0.220388
342022-04-18 0.386752
352022-04-19 0.084916
362022-04-20 0.345057
372022-04-21 0.099547
38Freq: D, Name: predicted_mean, dtype: float64
1 SARIMAX Results
2==========================================================================================
3Dep. Variable: y No. Observations: 100
4Model: SARIMAX(1, 0, 1)x(1, 0, 1, 12) Log Likelihood -139.420
5Date: Mon, 25 Dec 2023 AIC 288.840
6Time: 21:13:41 BIC 301.866
7Sample: 01-01-2022 HQIC 294.112
8 - 04-10-2022
9Covariance Type: opg
10==============================================================================
11 coef std err z P>|z| [0.025 0.975]
12------------------------------------------------------------------------------
13ar.L1 0.9496 0.076 12.429 0.000 0.800 1.099
14ma.L1 -0.8849 0.109 -8.133 0.000 -1.098 -0.672
15ar.S.L12 -0.1235 0.669 -0.184 0.854 -1.435 1.189
16ma.S.L12 0.3124 0.646 0.483 0.629 -0.954 1.579
17sigma2 0.9446 0.138 6.821 0.000 0.673 1.216
18===================================================================================
19Ljung-Box (L1) (Q): 0.18 Jarque-Bera (JB): 0.23
20Prob(Q): 0.67 Prob(JB): 0.89
21Heteroskedasticity (H): 0.71 Skew: -0.11
22Prob(H) (two-sided): 0.33 Kurtosis: 2.92
23===================================================================================
24
25Warnings:
26[1] Covariance matrix calculated using the outer product of gradients (complex-step).
272022-04-11 0.078323
282022-04-12 0.443604
292022-04-13 0.112575
302022-04-14 0.429993
312022-04-15 0.273543
322022-04-16 0.305122
332022-04-17 0.220388
342022-04-18 0.386752
352022-04-19 0.084916
362022-04-20 0.345057
372022-04-21 0.099547
38Freq: D, Name: predicted_mean, dtype: float64
应用领域:
适用问题:
优点:
缺点: