时间序列分析方法之 -- 季节性自回归积分移动平均模型(Seasonal ARIMA, SARIMA)原理及python代码

CSDN 2024-09-18 16:01:02 阅读 98

原理

季节性自回归积分移动平均模型(Seasonal ARIMA, SARIMA)是时间序列分析中处理季节性数据的一种重要方法。SARIMA 模型在 ARIMA 模型的基础上,增加了处理季节性成分的部分。SARIMA 模型的常见表示形式为 SARIMA(p, d, q)(P, D, Q, m),其中:

p:非季节性自回归(AR)阶数。d:非季节性差分(I)次数。q:非季节性移动平均(MA)阶数。P:季节性自回归(SAR)阶数。D:季节性差分(SI)次数。Q:季节性移动平均(SMA)阶数。m:季节周期的长度(如月份数据的 m=12,季度数据的 m=4)。

SARIMA 模型的数学表达式为:

(1 - \sum_{i=1}^{p} \phi_i B^i)(1 - \sum_{i=1}^{P} \Phi_i B^{mi}) (1 - B)^d (1 - B^m)^D X_t = (1 + \sum_{j=1}^{q} \theta_j B^j)(1 + \sum_{j=1}^{Q} \Theta_j B^{mj}) \epsilon_t

其中:

\phi_i

\phi_i

是非季节性和季节性自回归系数。

\theta_j

\Theta_j

是非季节性和季节性移动平均系数。B 是滞后算子。

\epsilon_t

是白噪声误差项。

通过这种表示形式,SARIMA 模型可以同时处理时间序列中的非季节性和季节性成分,使得模型更适用于有明显季节性变化的时间序列数据。

适用情况

SARIMA 模型适用于以下情况:

具有季节性模式:SARIMA 模型特别适用于具有季节性模式的时间序列数据。季节性模式是指时间序列在特定时间间隔内呈现出周期性变化。短期和中期预测:SARIMA 模型既可以用于短期预测,也可以用于中期预测,特别是在处理季节性数据时效果显著。非平稳时间序列:与 ARIMA 模型类似,SARIMA 模型也适用于非平稳时间序列数据,通过差分处理可以将其转化为平稳时间序列。

Python 示例代码

以下是使用 Python 实现季节性自回归积分移动平均模型(SARIMA)的示例代码,利用 <code>statsmodels 库进行建模和预测:

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from statsmodels.tsa.statespace.sarimax import SARIMAX

from statsmodels.tsa.stattools import adfuller

# 生成样本数据

np.random.seed(0)

data = np.random.randn(120).cumsum() + 10 * np.sin(np.linspace(0, 24, 120))

# 创建数据序列

data_series = pd.Series(data, index=pd.date_range(start='2020-01', periods=120, freq='M'))code>

# 可视化数据

plt.figure(figsize=(12, 6))

plt.plot(data_series)

plt.title('Sample Time Series Data with Seasonality')

plt.show()

# 检查数据平稳性

result = adfuller(data_series)

print('ADF Statistic:', result[0])

print('p-value:', result[1])

# 差分处理使数据平稳

if result[1] > 0.05:

data_series_diff = data_series.diff().dropna()

result_diff = adfuller(data_series_diff)

print('Differenced ADF Statistic:', result_diff[0])

print('Differenced p-value:', result_diff[1])

# 应用SARIMA模型

p = 1 # 非季节性自回归阶数

d = 1 # 非季节性差分次数

q = 1 # 非季节性移动平均阶数

P = 1 # 季节性自回归阶数

D = 1 # 季节性差分次数

Q = 1 # 季节性移动平均阶数

m = 12 # 季节周期

model = SARIMAX(data_series, order=(p, d, q), seasonal_order=(P, D, Q, m)).fit()

print(model.summary())

# 进行预测

pred_start = len(data_series)

pred_end = len(data_series) + 12

predictions = model.predict(start=pred_start, end=pred_end, dynamic=False)

# 可视化结果

plt.figure(figsize=(12, 6))

plt.plot(data_series, label='Original Data')code>

plt.plot(predictions, label='Predictions', color='red')code>

plt.legend()

plt.title('Seasonal Autoregressive Integrated Moving Average Model (SARIMA)')

plt.show()

在上述代码中:

我们首先生成了一些带有季节性成分的样本数据,并将其创建为一个 Pandas 系列对象。使用 adfuller 函数检查数据的平稳性。如果数据不是平稳的,可以通过差分处理使其平稳。使用 SARIMAX 类拟合 SARIMA 模型,并打印模型摘要。注意,这里我们指定了 SARIMA(p, d, q)(P, D, Q, m) 模型的阶数。使用拟合好的模型进行预测,并将预测结果与原始数据进行可视化。

结论

季节性自回归积分移动平均模型(SARIMA)是处理具有季节性模式的时间序列数据的一种有效方法。通过结合自回归、差分、移动平均和季节性成分,SARIMA 模型可以捕捉时间序列中的复杂动态特征,特别是季节性变化。SARIMA 模型适用于具有季节性模式的时间序列数据,并且在短期和中期预测中表现良好。通过选择合适的模型阶数和季节周期,可以显著提高预测的准确性。在实践中,结合数据的具体特征和目标需求,调整模型参数以获得更好的预测效果。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。