自回归积分滑动平均模型(Autoregressive Integrated Moving Average,ARIMA),有三个能力:自回归(AR)、差分积分(I)、滑动平均(MA)。
现在你对自回归和滑动平均已经很熟了,那我这里就不多说了,直接来聊聊“积分”(I)这个环节。在ARIMA模型中,"I"指的是“差分”的次数,也就是我们为了让数据变得稳定(没有明显的趋势或者季节性波动)而做的处理次数。
可能你会问,什么是差分呢?其实很简单,就像我们小时候玩的“你比我多几个”,我们每次只关注相邻两个数之间的差距。在时间序列分析中,我们也做类似的操作,用前一个时间点的数据减去当前时间点的数据,这就是一次差分。而“积分”(Integration)这个词,在这里其实就是差分的逆过程。为什么要这么做呢?因为我们希望通过差分让数据变得平稳,只有平稳的数据才更容易预测。
比如,你想预测一个小镇的人口数量,但如果这个小镇每年的人口增长都很稳定,比如每年都增长1000人,那这个序列就不是平稳的,因为它有一个明显的上升趋势。这时候,我们就可以用差分来消除这个趋势。我们不直接看每年的总人口数,而是看每年的人口增长数。这样一来,数据就变得相对平稳了,因为增长数可能就没有那么规律的趋势了。
具体到我们的ARIMA模型中,"I"就是告诉模型需要做几次这样的操作,才能让数据足够平稳,好让模型更准确地进行预测。如果你不需要做差分,或者一次差分就够了,那么"I"就是0或者1;如果需要多次差分,那么"I"的数值就会更大。
总的来说,ARIMA模型可以通过AR和MA的分析时间序列的规律性,再用I消除趋势和季节性影响,让我们能够预测未来的走势。
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析和预测模型,用于处理平稳和非平稳时间序列数据。ARIMA模型结合了自回归(AR)、差分(I)和移动平均(MA)三个成分,以捕捉数据中的趋势、自相关性和随机性。
ARIMA模型的原理如下:
综合上述成分,ARIMA模型的数学表示如下:
ARIMA(, , ):
其中:
在ARIMA模型中,符号 代表的是后移算子,也称为滞后算子。后移算子是一种用来表示时间序列中过去值的数学工具,它可以将时间序列中的观测值按照时间向后移动指定的步数。
举个例子来说明后移算子的作用:
以此类推, 代表的就是 时刻的观测值 ,其中 是正整数。
在ARIMA模型的公式中,后移算子 被用来表示自回归部分和移动平均部分中的滞后项。比如,在自回归部分,系数 表示时间序列的当前观测值与前一期观测值的关系,而在移动平均部分,系数 表示当前观测值与前一期预测误差的关系。
差分成分中, 用来表示对时间序列进行 阶差分。一阶差分可以表示为 ,即当前观测值与前一期观测值的差。二阶差分则是 ,以此类推。
后移算子是时间序列分析中的一个抽象概念,它简化了差分和滞后项的数学表达,使得ARIMA模型的公式表示更为紧凑和清晰。
1import numpy as np
2import pandas as pd
3from statsmodels.tsa.arima.model import ARIMA
4
5# 生成一个示例数据
6np.random.seed(0)
7n = 100
8data = np.random.normal(loc=0, scale=1, size=n)
9index = pd.date_range(start='2022-01-01', periods=n, freq='D')
10series = pd.Series(data, index=index)
11
12# 拟合ARIMA模型
13model = ARIMA(series, order=(1, 0, 1)) # 这里选择了AR阶数为1,差分阶数为0,MA阶数为1的ARIMA模型
14results = model.fit()
15
16# 输出模型拟合结果
17print(results.summary())
18
19# 预测未来的值
20forecast_start = series.index[-1] + pd.DateOffset(days=1) # 使用最后一个数据点的时间戳作为预测起始点
21forecast_end = forecast_start + pd.DateOffset(days=10) # 预测未来10天的数据
22forecast = results.predict(start=forecast_start, end=forecast_end)
23
24# 打印预测结果
25print(forecast)
1import numpy as np
2import pandas as pd
3from statsmodels.tsa.arima.model import ARIMA
4
5# 生成一个示例数据
6np.random.seed(0)
7n = 100
8data = np.random.normal(loc=0, scale=1, size=n)
9index = pd.date_range(start='2022-01-01', periods=n, freq='D')
10series = pd.Series(data, index=index)
11
12# 拟合ARIMA模型
13model = ARIMA(series, order=(1, 0, 1)) # 这里选择了AR阶数为1,差分阶数为0,MA阶数为1的ARIMA模型
14results = model.fit()
15
16# 输出模型拟合结果
17print(results.summary())
18
19# 预测未来的值
20forecast_start = series.index[-1] + pd.DateOffset(days=1) # 使用最后一个数据点的时间戳作为预测起始点
21forecast_end = forecast_start + pd.DateOffset(days=10) # 预测未来10天的数据
22forecast = results.predict(start=forecast_start, end=forecast_end)
23
24# 打印预测结果
25print(forecast)
输出结果:
1 SARIMAX Results
2==============================================================================
3Dep. Variable: y No. Observations: 100
4Model: ARIMA(1, 0, 1) Log Likelihood -140.723
5Date: Mon, 25 Dec 2023 AIC 289.445
6Time: 21:09:16 BIC 299.866
7Sample: 01-01-2022 HQIC 293.663
8 - 04-10-2022
9Covariance Type: opg
10==============================================================================
11 coef std err z P>|z| [0.025 0.975]
12------------------------------------------------------------------------------
13const 0.1766 0.224 0.788 0.431 -0.263 0.616
14ar.L1 0.9561 0.060 15.886 0.000 0.838 1.074
15ma.L1 -0.8842 0.094 -9.358 0.000 -1.069 -0.699
16sigma2 0.9745 0.148 6.581 0.000 0.684 1.265
17===================================================================================
18Ljung-Box (L1) (Q): 0.16 Jarque-Bera (JB): 0.23
19Prob(Q): 0.69 Prob(JB): 0.89
20Heteroskedasticity (H): 0.68 Skew: -0.04
21Prob(H) (two-sided): 0.28 Kurtosis: 2.78
22===================================================================================
23
242022-04-11 0.343304
252022-04-12 0.335981
262022-04-13 0.328980
272022-04-14 0.322287
282022-04-15 0.315887
292022-04-16 0.309768
302022-04-17 0.303919
312022-04-18 0.298326
322022-04-19 0.292979
332022-04-20 0.287866
342022-04-21 0.282978
35Freq: D, Name: predicted_mean, dtype: float64
1 SARIMAX Results
2==============================================================================
3Dep. Variable: y No. Observations: 100
4Model: ARIMA(1, 0, 1) Log Likelihood -140.723
5Date: Mon, 25 Dec 2023 AIC 289.445
6Time: 21:09:16 BIC 299.866
7Sample: 01-01-2022 HQIC 293.663
8 - 04-10-2022
9Covariance Type: opg
10==============================================================================
11 coef std err z P>|z| [0.025 0.975]
12------------------------------------------------------------------------------
13const 0.1766 0.224 0.788 0.431 -0.263 0.616
14ar.L1 0.9561 0.060 15.886 0.000 0.838 1.074
15ma.L1 -0.8842 0.094 -9.358 0.000 -1.069 -0.699
16sigma2 0.9745 0.148 6.581 0.000 0.684 1.265
17===================================================================================
18Ljung-Box (L1) (Q): 0.16 Jarque-Bera (JB): 0.23
19Prob(Q): 0.69 Prob(JB): 0.89
20Heteroskedasticity (H): 0.68 Skew: -0.04
21Prob(H) (two-sided): 0.28 Kurtosis: 2.78
22===================================================================================
23
242022-04-11 0.343304
252022-04-12 0.335981
262022-04-13 0.328980
272022-04-14 0.322287
282022-04-15 0.315887
292022-04-16 0.309768
302022-04-17 0.303919
312022-04-18 0.298326
322022-04-19 0.292979
332022-04-20 0.287866
342022-04-21 0.282978
35Freq: D, Name: predicted_mean, dtype: float64
应用领域:
适用问题:
优点:
缺点: