数学建模:时间序列分析与ARIMA模型

数学建模:时间序列分析与ARIMA模型

此博客介绍了数学建模中常用的时间序列分析与预测模型,其中详细介绍了最为重要的ARIMA模型,并展示了它的建模过程和参考代码。

时间序列分析

时间序列分析是一种用于处理时间相关数据的统计方法,常用于预测、模型建立和数据理解。以下是几种常见的时间序列分析算法和模型:

  • 自回归移动平均模型(ARMA):ARMA模型结合了自回归(AR)和移动平均(MA)模型,用于捕捉数据中的线性关系。AR部分使用过去时间点的观测值来预测未来值,而MA部分使用误差项的线性组合来考虑数据中的随机波动。
  • 差分自回归移动平均模型(ARIMA):ARIMA模型是在ARMA模型的基础上添加了对非平稳性数据的处理。ARIMA模型包括三个部分:自回归(AR)、差分(I)和移动平均(MA)。差分操作用于将非平稳的时间序列数据转化为平稳的数据,这样更容易应用ARMA模型进行建模和预测。ARIMA模型的一般形式为ARIMA(p, d, q),其中p、d和q分别表示自回归项、差分操作和移动平均项的阶数。当差分项d为0时,ARIMA模型退化为ARMA模型。
  • 季节性自回归移动平均模型(SARMA):SARMA模型在ARMA模型的基础上添加了考虑季节性因素的分量。它适用于具有明显季节性变化的时间序列数据。通过引入季节性的自回归项和移动平均项,SARMA模型可以更好地捕捉数据的季节性模式。
  • 季节性差分自回归移动平均模型(SARIMA):SARIMA模型是SARMA模型的延伸,通过引入差分操作来处理非平稳时间序列数据。差分操作可以消除数据的季节性和趋势性,使得数据更具平稳性。
  • 随机游走模型(Random Walk):随机游走是一种简单的时间序列模型,基本假设是未来值等于当前值加上一个随机误差项。这个模型假设未来的变化是随机的,没有明确的趋势或季节性。
  • 季节性指数平滑模型(Seasonal Exponential Smoothing):这种方法适用于具有季节性变化的时间序列数据。它基于指数平滑模型,通过考虑季节性的加权平均来预测未来的观测值。
  • 递归神经网络(RNN):RNN是一种深度学习模型,能够处理序列数据。对于时间序列分析,可以使用循环神经网络(RNN的一种)来捕捉数据的长期依赖关系,实现较复杂的预测任务。
  • 长短期记忆网络(LSTM):LSTM是一种特殊的RNN变体,能够更好地处理长期依赖关系。在时间序列分析中,LSTM可以捕捉数据的长期依赖关系,适用于复杂的时间序列预测和建模任务。

ARIMA模型

介绍

ARIMA是"Auto Regressive Integrated Moving Average"的简称,它是一种基于时间序列历史值和历史值上的预测误差来对当前做预测的模型。ARIMA整合了自回归项AR和滑动平均项MA,可以建模任何存在一定规律的非季节性时间序列,如果时间序列具有季节性,则需要使用SARIMA(Seasonal ARIMA)建模。

ARIMA模型有三个超参数:p,d,q。

  • p:AR(自回归)项的阶数。需要事先设定好,表示y的当前值和前p个历史值有关。
  • d:使序列平稳的最小差分阶数,一般是1阶。非平稳序列可以通过差分来得到平稳序列,但是过度的差分,会导致时间序列失去自相关性,从而失去使用AR项的条件。
  • q:MA(滑动平均)项的阶数。需要事先设定好,表示y的当前值和前q个历史值AR预测误差有关。实际是用历史值上的AR项预测误差来建立一个类似归回的模型。

建模步骤

建模步骤示意图如下图所示:
在这里插入图片描述

  1. 平稳性检验与d阶数的确定
    对原始序列进行平稳性检验(ADF单位根检验),若原始序列是平稳的,则不需要差分,此时d=0。否则,原始序列非平稳,则对原始序列求差分直到通过平稳性检验。此外可以绘制ACF图,观察ACF图,若拖尾阶数过大(例如10阶及以上)则需要继续求差分,若拖尾阶数过小(例如1阶)则说明差分过度,最好的差分阶数是使ACF先拖尾几阶,然后截尾。
  2. 白噪声检验
    检验原始序列或差分序列是否是非白噪声序列,只有是非白噪声序列才可以用ARMA(p,q)模型进行拟合和预测。
  3. p、q阶数的确定
    一般使用 AICc(AICc是修正过的AIC) 和 BIC 准则进行确定p、q的阶数,信息准则越小,说明参数的选择越好。通过穷举法,拟合给定d值,不同 p、q 值之下的 ARIMA 模型,并获取其 AICc 和 BIC 信息量,选取信息量最小的对应参数作为最优模型。

注意:确定差分d的阶数时,不要使用信息准则来判断,因为差分会改变了似然函数使用的数据,使得信息准则的比较失去意义,所以通常用别的方法先选择出合适的d。而确定p和q的阶数可以使用信息准则进行判断。此外,信息准则的好处是可以在用模型给出预测之前,就对模型的超参做一个量化评估,这对批量预测的场景尤其有用,因为批量预测往往需要在程序执行过程中自动定阶。

  1. 在确定了d、p和q三个参数的值后,便可以建立模型并对数据进行拟合与预测。

代码示例

以下是根据一次根据具体数据进行建模的示例:

注意:代码不全,仅供参考

# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima.model import ARIMA

# 读取时间序列数据,在此需要修改你自己的数据
data = pd.read_csv('data.csv', index_col='date', parse_dates=True)

# 检查数据的平稳性(使用ADF单位根检验)
result = adfuller(data)
# 提取检验结果
adf_statistic = result[0]
p_value = result[1]
critical_values = result[4]
# 打印检验结果
print("ADF Statistic:", adf_statistic)
print("p-value:", p_value)
print("\nCritical Values:")
for key, value in critical_values.items():
    print(f"{
      
      key}: {
      
      value}")
    
# 绘制ACF图
plot_acf(data)
plt.show()

# 若数据不平稳,可以进行差分处理,直到数据变得平稳
# data_diff = data.diff().dropna()

# 白噪声检验(使用Ljung-Box检验)
lbvalue, pvalue = acorr_ljungbox(data_diff, lags=[10])
print("Ljung-Box检验统计量: ", lbvalue)
print("Ljung-Box检验p值: ", pvalue)

# 确定 ARMA(p, q) 的阶数
order_aic = arma_order_select_ic(data, ic='aic')['aic_min_order']
order_bic = arma_order_select_ic(data, ic='bic')['bic_min_order']
print("AIC 的最优阶数:", order_aic)
print("BIC 的最优阶数:", order_bic)

# 创建ARIMA模型
model = ARIMA(data, order=(p, d, q))
#model=sm.tsa.SARIMAX(seasona_data, order=(p,d,q)) #多元季节性时间序列模型
model_fit = model.fit()

# 查看模型拟合的结果
print(model_fit.summary())

# 预测未来的值
forecast = model_fit.forecast(steps=num_steps)

# 打印预测结果
print(forecast)

猜你喜欢

转载自blog.csdn.net/weixin_43603658/article/details/133089284
今日推荐