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

原理

季节性自回归积分移动平均模型(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 模型适用于以下情况:

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

以下是使用 Python 实现季节性自回归积分移动平均模型(SARIMA)的示例代码,利用 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'))

# 可视化数据
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')
plt.plot(predictions, label='Predictions', color='red')
plt.legend()
plt.title('Seasonal Autoregressive Integrated Moving Average Model (SARIMA)')
plt.show()

在上述代码中:

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

结论

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

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现季节性回归集成移动平均模型(SARIMA)的代码: 首先,导入必要的库: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.statespace.sarimax import SARIMAX ``` 接着,读取时间序列数据: ```python df = pd.read_csv('data.csv', parse_dates=['datetime'], index_col='datetime') ``` 其中,data.csv是一个包含日期时间和时间序列数据的CSV文件,datetime列被解析为日期时间格式,并被设置为索引列。 然后,检查和处理数据: ```python # 检查缺失值 print(df.isnull().sum()) # 填充缺失值 df = df.fillna(method='ffill') # 检查重复值 print(df.duplicated().sum()) ``` 我们发现缺失值并用前向填充方法进行填充,同时也检查了是否有重复值。 接下来,根据季节性和趋势性进行差分: ```python # 差分 diff = df.diff(periods=1) diff = diff.dropna() # 绘制差分后的图像 plt.plot(diff) plt.show() ``` 这里我们选择了一阶差分,并绘制了差分后的时间序列图。 然后,对差分后的时间序列数据进行模型拟合和预测: ```python # 拟合 SARIMA 模型 model = SARIMAX(df, order=(1, 1, 1), seasonal_order=(0, 1, 1, 12)) result = model.fit() # 预测未来 12 个月 forecast = result.predict(start=len(df), end=len(df)+11, dynamic=True) # 绘制预测结果 plt.plot(df, label='Actual') plt.plot(forecast, label='Forecast') plt.legend() plt.show() ``` 这里我们使用了SARIMA模型,其中order和seasonal_order参数分别设置了ARIMA模型的阶数和季节性阶数。我们用拟合好的模型对未来12个月的数据进行预测,并将结果绘制在时间序列图上。 最后,输出模型评估指标: ```python # 输出模型评估指标 print(result.summary()) ``` 这里我们使用result.summary()输出了模型的各项指标,如AIC、BIC、残差等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值