ARIMA模型(自回归积分滑动平均模型)
ARIMA模型(Autoregressive Integrated Moving Average Model)是一种统计分析模型,用于分析和预测时间序列数据。这种模型广泛应用于经济学、金融、环境科学等领域,特别是在处理具有时间序列数据的预测问题时非常有效。ARIMA模型结合了自回归(AR)、差分(I)和滑动平均(MA)三种基本思想。
1. 自回归(AR)部分: 自回归部分表明当前的值与其前几期的值之间存在线性关系。模型中的“p”代表自回归项的阶数,即用来预测当前值的前p个历史值的数目。
2. 差分(I)部分: 差分是为了使非平稳时间序列变得平稳的过程。在一个非平稳时间序列中,序列的统计属性(如均值、方差)随时间变化。通过差分一次或多次,可以削弱或消除这种非平稳性。模型中的“d”代表差分次数。
3. 滑动平均(MA)部分: 滑动平均部分表明当前值与前几期的预测误差之间的关系。模型中的“q”代表滑动平均项的阶数,即当前值与前q个预测误差之间的线性关系。
ARIMA模型的表达式:
其中, 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模型的表达式为:
建模步骤:
-
识别阶数:通过自相关图(ACF)和偏自相关图(PACF)来识别非季节性和季节性的p, q, P, Q。
-
估计模型参数:使用最大似然或其他方法估计模型参数。
-
模型诊断:检查残差的自相关性等来评估模型的拟合程度和适用性。
-
预测:使用模型进行预测。
使用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.