超完整!11 种经典时间序列预测方法!
本文演示了11 种不同的经典时间序列预测方法,以及时间序列方法的对比及实践教程。自回归 (AR)移动平均线 (MA)自回归移动平均线 (ARMA)自回归综合移动平均线 (ARIMA)季节性自回归综合移动平均线 (SARIMA)具有外生回归的季节性自回归积分移动平均值 (SARIMAX)向量自回归 (VAR)向量自回归移动平均 (VARMA)具有外生回归的向量自回归移动平均值 (VARMAX)简单指
本文我们深入探讨如何使用机器学习方法对 Python 的时间序列问题进行分类和预测。我们将深入研究一套经典的时间序列预测方法,您可以在探索机器学习方法之前测试这些方法。
虽然传统方法强调线性关系,但它们在许多情况下都是熟练且有效的。只要数据准备充分,技术设置好就会很好。
一、 概述
本文演示了 11 种不同的经典时间序列预测方法,以及时间序列方法的对比及实践教程。
-
自回归 (AR)
-
移动平均线 (MA)
-
自回归移动平均线 (ARMA)
-
自回归综合移动平均线 (ARIMA)
-
季节性自回归综合移动平均线 (SARIMA)
-
具有外生回归的季节性自回归积分移动平均值 (SARIMAX)
-
向量自回归 (VAR)
-
向量自回归移动平均 (VARMA)
-
具有外生回归的向量自回归移动平均值 (VARMAX)
-
简单指数平滑 (SES)
-
Holt Winter 指数平滑 (HWES)
每种方法都以一致的方式呈现,包括:
-
描述。对该技术的简短而精确的描述。
-
Python 代码。一个简短的工作示例,用于在 Python 中拟合模型并进行预测。
-
更多信息。API 和算法的参考。
对于提供的每个代码示例,我们使用一个基本的说明性数据集。我们理解它可能并不总是适合重点方法,因此我们建议您用您的数据替换人为的数据集,以测试该方法。
请记住:定制每种方法都需要针对您的具体问题进行调整。在许多情况下,我已经在博客上提供了如何配置甚至网格搜索参数的示例,请尝试搜索功能。
如果本指南被证明是有益的,请在下面的评论部分分享您的想法。
自回归 (AR)
自回归 (AR) 方法使用先前观测值的线性组合来预测序列中的后续值。
模型的符号涉及将模型 p 的顺序指定为 AR 函数的参数,例如 AR(p)。例如,AR(1) 是一个一阶自回归模型。
该方法最适合缺乏趋势和季节性分量的单变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 |
|
移动平均线 (MA)
移动平均 (MA) 方法模型将序列中的下一步预测为先前时间步长中平均过程残余误差的线性函数。
需要注意的是,移动平均线模型不同于计算时间序列的移动平均线。
模型的符号涉及将模型 q 的顺序指定为 MA 函数的参数,例如 MA(q)。例如,MA(1) 是一个一阶移动平均模型。
该方法适用于没有趋势和季节分量的单变量时间序列。
我们可以使用 ARIMA 类来创建 MA 模型并设置零阶 AR 模型。我们必须在 order 参数中指定 MA 模型的顺序。
Python 代码
我们可以使用 ARIMA 类来创建 MA 模型并设置零阶 AR 模型。我们必须在 order 参数中指定 MA 模型的顺序。
1 2 3 4 5 6 7 8 9 10 11 | # MA example from statsmodels.tsa.arima.model import ARIMA from random import random # contrived dataset data = [x + random() for x in range(1, 100)] # fit model model = ARIMA(data, order=(0, 0, 1)) model_fit = model.fit() # make prediction yhat = model_fit.predict(len(data), len(data)) print(yhat) |
自回归移动平均线 (ARMA)
自回归移动平均 (ARMA) 方法模型基于过去观测值和过去残差的线性组合来预测序列中的下一步。
该方法结合了自回归 (AR) 和移动平均 (MA) 模型。
为了表示模型,符号涉及将 AR(p) 和 MA(q) 模型的顺序指定为 ARMA 函数的参数,例如 ARMA(p, q)。ARIMA 模型可用于开发 AR 或 MA 模型。
该方法适用于没有趋势和季节分量的单变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 | # ARMA example from statsmodels.tsa.arima.model import ARIMA from random import random # contrived dataset data = [random() for x in range(1, 100)] # fit model model = ARIMA(data, order=(2, 0, 1)) model_fit = model.fit() # make prediction yhat = model_fit.predict(len(data), len(data)) print(yhat) |
更多信息
- 维基百科上的自回归-移动平均模型
自回归综合移动平均线 (ARIMA)
自回归综合移动平均 (ARIMA) 方法模型将序列中的下一步预测为先前时间步长的差分观测值和残差误差的线性函数。
该方法集成了自回归 (AR) 和移动平均 (MA) 模型的原理以及序列的差分预处理步骤,使序列静止,称为积分 (I)。
模型的符号涉及将 AR(p)、I(d) 和 MA(q) 模型的顺序指定为 ARIMA 函数的参数,例如 ARIMA(p, d, q)。ARIMA 模型还可用于开发 AR、MA 和 ARMA 模型。
ARIMA 方法最适合表现出趋势但缺乏季节性变化的单变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 | # ARIMA example from statsmodels.tsa.arima.model import ARIMA from random import random # contrived dataset data = [x + random() for x in range(1, 100)] # fit model model = ARIMA(data, order=(1, 1, 1)) model_fit = model.fit() # make prediction yhat = model_fit.predict(len(data), len(data), typ='levels') print(yhat) |
更多信息
- 维基百科上的自回归综合移动平均线
季节性自回归综合移动平均线 (SARIMA)
季节性自回归综合移动平均 (SARIMA) 方法基于差异观测值、误差、差异季节性观测值和先前时间步长的季节性误差的线性混合,对序列中的下一步进行建模。
SARIMA 增强了 ARIMA 模型,使其能够在季节性水平上执行相同的自回归、差分和移动平均建模。
该模型的符号涉及指定 AR(p)、I(d) 和 MA(q) 模型的顺序作为 ARIMA 函数的参数,以及季节性水平的 AR(P)、I(D)、MA(Q) 和 m 参数,例如 SARIMA(p, d, q)(P, D, Q)m,其中“m”是每个季节(季节周期)的时间步长数。SARIMA 模型可用于开发 AR、MA、ARMA 和 ARIMA 模型。
该方法适用于具有趋势和/或季节性分量的单变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 | # SARIMA example from statsmodels.tsa.statespace.sarimax import SARIMAX from random import random # contrived dataset data = [x + random() for x in range(1, 100)] # fit model model = SARIMAX(data, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0)) model_fit = model.fit(disp=False) # make prediction yhat = model_fit.predict(len(data), len(data)) print(yhat) |
更多信息
-
statsmodels.tsa.statespace.sarimax.SARIMAX API 接口
-
statsmodels.tsa.statespace.sarimax.SARIMAXResults API
-
维基百科上的自回归综合移动平均线
具有外生回归的季节性自回归积分移动平均值 (SARIMAX)
具有外生回归的季节性自回归综合移动平均值 (SARIMAX) 是 SARIMA 模型的扩展,其中还包括外生变量的建模。
外生变量也称为协变量,可以将其视为具有与原始序列相同的时间步长的观测值的并行输入序列。初级序列可以称为内源性数据,以将其与外源序列进行对比。外生变量的观测值在每个时间步直接包含在模型中,并且以与主要内生序列相同的方式建模(例如,作为 AR、MA 等过程)。
SARIMAX 方法还可用于对具有外生变量(如 ARX、MAX、ARMAX 和 ARIMAX)的归入模型进行建模。
该方法适用于具有趋势和/或季节成分以及外生变量的单变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | # SARIMAX example from statsmodels.tsa.statespace.sarimax import SARIMAX from random import random # contrived dataset data1 = [x + random() for x in range(1, 100)] data2 = [x + random() for x in range(101, 200)] # fit model model = SARIMAX(data1, exog=data2, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0)) model_fit = model.fit(disp=False) # make prediction exog2 = [200 + random()] yhat = model_fit.predict(len(data1), len(data1), exog=[exog2]) print(yhat) |
更多信息
-
statsmodels.tsa.statespace.sarimax.SARIMAX API 接口
-
statsmodels.tsa.statespace.sarimax.SARIMAXResults API
-
维基百科上的自回归综合移动平均线
向量自回归 (VAR)
向量自回归 (VAR) 方法使用 AR 模型方法对每个时间序列中的下一步进行建模。从本质上讲,它扩展了 AR 模型以迎合多个并行时间序列,例如多变量时间序列。
模型的符号涉及将 AR(p) 模型的顺序指定为 VAR 函数的参数,例如 VAR(p)。
该方法适用于没有趋势和季节分量的多变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 12 1 |
|
更多信息
-
statsmodels.tsa.vector_ar.var_model。VAR API
-
statsmodels.tsa.vector_ar.var_model。VARResults API
-
维基百科上的向量自回归
向量自回归移动平均 (VARMA)
向量自回归移动平均 (VARMA) 方法利用 ARMA 模型方法对多个时间序列中即将到来的值进行建模。它是ARMA对多个并行时间序列的推广,例如多变量时间序列。
模型的符号涉及将 AR(p) 和 MA(q) 模型的顺序指定为 VARMA 函数的参数,例如 VARMA(p, q)。VARMA 模型还可用于开发 VAR 或 VMA 模型。
该方法适用于没有趋势和季节分量的多变量时间序列。
Python 代码
更多信息
-
statsmodels.tsa.statespace.varmax.VARMAX 接口
-
statsmodels.tsa.statespace.varmax.VARMAXResults
-
维基百科上的向量自回归
具有外生回归的向量自回归移动平均值 (VARMAX)
具有外生回归的向量自回归移动平均值 (VARMAX) 扩展了 VARMA 模型的功能,其中还包括外生变量的建模。它是 ARMAX 方法的多变量版本。
外生变量,也称为协变量,可以认为是与原始序列的时间步长对齐的并行输入序列。主要系列被称为内源性数据,以将其与外源序列进行对比。外生变量的观测值在每个时间步直接包含在模型中,并且以与主要内生序列相同的方式建模(例如,作为 AR、MA 等过程)。
VARMAX 方法还可用于对具有外生变量(如 VARX 和 VMAX)的归和模型进行建模。
该方法适用于无趋势的多变量时间序列和具有外生变量的季节分量。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 1 | # VARMAX example from statsmodels.tsa.statespace.varmax import VARMAX from random import random # contrived dataset with dependency data = list() for i in range(100): v1 = random() v2 = v1 + random() row = [v1, v2] data.append(row) data_exog = [x + random() for x in range(100)] # fit model model = VARMAX(data, exog=data_exog, order=(1, 1)) model_fit = model.fit(disp=False) # make prediction data_exog2 = [[100]] yhat = model_fit.forecast(exog=data_exog2) print(yhat) |
更多信息
-
statsmodels.tsa.statespace.varmax.VARMAX 接口
-
statsmodels.tsa.statespace.varmax.VARMAXResults
-
维基百科上的向量自回归
简单指数平滑 (SES)
简单指数平滑 (SES) 方法将下一个时间步长建模为先前时间步长观测值的指数加权线性函数。
该方法适用于没有趋势和季节分量的单变量时间序列。
Python 代码
1 2 3 4 5 6 7 8 9 10 11 | # SES example from statsmodels.tsa |
更多推荐
所有评论(0)