ARIMA模型和SARIMA模型简介

ARIMA模型(自回归积分滑动平均模型)

ARIMA模型(Autoregressive Integrated Moving Average Model)是一种统计分析模型,用于分析和预测时间序列数据。这种模型广泛应用于经济学、金融、环境科学等领域,特别是在处理具有时间序列数据的预测问题时非常有效。ARIMA模型结合了自回归(AR)、差分(I)和滑动平均(MA)三种基本思想。

1. 自回归(AR)部分: 自回归部分表明当前的值与其前几期的值之间存在线性关系。模型中的“p”代表自回归项的阶数,即用来预测当前值的前p个历史值的数目。

2. 差分(I)部分: 差分是为了使非平稳时间序列变得平稳的过程。在一个非平稳时间序列中,序列的统计属性(如均值、方差)随时间变化。通过差分一次或多次,可以削弱或消除这种非平稳性。模型中的“d”代表差分次数。

3. 滑动平均(MA)部分: 滑动平均部分表明当前值与前几期的预测误差之间的关系。模型中的“q”代表滑动平均项的阶数,即当前值与前q个预测误差之间的线性关系。

ARIMA模型的表达式:(1 - \sum\limits_{i = 1}^p {​{\phi _i}{L^i}} ){(1 - L)^d}{X_t} = (1 + \sum\limits_{j = 1}^q {​{\theta _j}{L^j}} ){\varepsilon _t} 

其中, L 表示滞后算子, ϕi 表示自回归系数, θj 表示滑动平均系数, εt 表示误差项。

SARIMA模型(季节性自回归积分滑动平均模型)

SARIMA模型(Seasonal Autoregressive Integrated Moving Average Model)是ARIMA模型的扩展,用以捕捉时间序列数据中的季节性变化。SARIMA模型非常适合分析具有明显季节性波动的数据,比如每月或每季度的销售数据。

SARIMA模型包括:

  • 非季节性成分:和普通ARIMA模型一样,包括AR、I、MA三个部分。

  • 季节性成分:类似于非季节性的ARIMA,但涵盖了滞后项的季节性周期。模型中的“P, D, Q”分别代表季节性自回归阶数、季节性差分次数、季节性滑动平均阶数,而"S"代表季节周期(例如,S=12代表年度周期性,对于月度数据)。

SARIMA模型的表达式为: (1 - \sum\limits_{i = 1}^p {​{\phi _i}{L^i}} )(1 - \sum\limits_{i = 1}^p {​{\phi _i}{L^{iS}}} ){(1 - L)^d}{(1 - {L^S})^D}{X_t} = (1 + \sum\limits_{j = 1}^p {​{\theta _j}{L^j}} )(1 + \sum\limits_{j = 1}^Q {​{\Theta _j}{L^{jS}}} ){\varepsilon _t}

建模步骤:

  1. 识别阶数:通过自相关图(ACF)和偏自相关图(PACF)来识别非季节性和季节性的p, q, P, Q。

  2. 估计模型参数:使用最大似然或其他方法估计模型参数。

  3. 模型诊断:检查残差的自相关性等来评估模型的拟合程度和适用性。

  4. 预测:使用模型进行预测。

使用SARIMA模型时,重要的是正确诊断和建立模型,包括选择适当的差分次数和模型阶数,以及进行模型验证和评估。

---------------------------------------------------------------------------------------------------

下面是建立ARIMA模型的步骤:

ARIMA模型的代码:

# 导入所需库
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller, acf, pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from pmdarima import auto_arima
from statsmodels.tsa.arima.model import ARIMA

# 读取数据
df = pd.read_csv('data.csv', index_col='date', parse_dates=True)
df = df['value'].dropna()  # 确保数据无缺失值

# 函数:ADF检验平稳性
def test_stationarity(timeseries):
    result = adfuller(timeseries)
    print('ADF Statistic: %f' % result[0])
    print('p-value: %f' % result[1])
    print('Critical Values:')
    for key, value in result[4].items():
        print('\t%s: %.3f' % (key, value))

# 进行ADF测试
print("Performing ADF Test...")
test_stationarity(df)

# 绘制ACF和PACF
fig, axes = plt.subplots(1, 2, figsize=(15, 4))
plot_acf(df, ax=axes[0])
plot_pacf(df, ax=axes[1])
plt.show()

# 使用auto_arima自动寻找最佳ARIMA模型参数
print("Searching for best ARIMA parameters...")
auto_model = auto_arima(df, start_p=0, start_q=0,
                        test='adf',       # 使用ADF测试寻找最佳差分d值
                        max_p=3, max_q=3, # 最大p和q值
                        m=1,              # 季节性周期
                        d=None,           # 允许自动寻找差分值
                        seasonal=False,   # 无季节性
                        start_P=0, 
                        D=0, 
                        trace=True,
                        error_action='ignore',  
                        suppress_warnings=True, 
                        stepwise=True)
print(auto_model.summary())

# 模型诊断
auto_model.plot_diagnostics(figsize=(15, 8))
plt.show()

# 进行预测
n_periods = 12
forecast, conf_int = auto_model.predict(n_periods=n_periods, return_conf_int=True)
forecast_index = pd.date_range(start=df.index[-1], periods=n_periods + 1, freq='M')[1:]

forecast_series = pd.Series(forecast, index=forecast_index)
lower_series = pd.Series(conf_int[:, 0], index=forecast_index)
upper_series = pd.Series(conf_int[:, 1], index=forecast_index)

# 可视化预测结果
plt.figure(figsize=(12, 5))
plt.plot(df, label='observed')
plt.plot(forecast_series, color='red', label='forecast')
plt.fill_between(forecast_index, lower_series, upper_series, color='pink')
plt.title('Forecast vs Actuals')
plt.legend(loc='upper left', fontsize=8)
plt.show()

参考文献:

[1]安致远,何恩球.基于SARIMA时间序列模型的区域快递需求预测——以江苏省为例[J].物流科技,2022,45(20):63-66+70.DOI:10.13714/j.cnki.1002-3100.2022.20.017.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再磨一年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值