访问量: 400 次浏览

本文演示了 11 种不同的经典时间序列预测方法, 这些方法包括:
每种方法都以一致的方式呈现,这包括:
对于提供的每个代码示例, 都使用了一个基本的说明性数据集。 我们知道它可能并不总是适合所关注的方法, 因此建议用您的数据替换人为的数据集, 以测试该方法。
请记住:定制每种方法都需要针对您的具体问题进行调整。
自回归 (AR) 方法使用先前观测值的线性组合来预测序列中的后续值。 该模型的符号涉及将模型 p 的阶数指定为 AR 函数的参数, 例如 AR(p)。例如,AR(1) 是一阶自回归模型。 该方法最适合缺乏趋势和季节性成分的单变量时间序列。
Python 代码
# AR example
from statsmodels.tsa.ar_model import AutoReg
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = AutoReg(data, lags=1)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
更多信息
移动平均 (MA) 方法模型以先前时间步骤中平均过程的残差误差的线性函数形式预测序列中的下一步。 值得注意的是,移动平均模型不同于计算时间序列的移动平均值。 该模型的符号涉及将模型 q 的阶数指定为 MA 函数的参数, 例如 MA(q)。例如,MA(1) 是一阶移动平均模型。 该方法适用于没有趋势和季节性成分的单变量时间序列。
我们可以使用 ARIMA 类创建 MA 模型并设置零阶 AR 模型, 必须在 order 参数中指定 MA 模型的阶数。
Python 代码
可以使用 ARIMA 类来创建 MA 模型并设置零阶 AR 模型, 必须在 order 参数中指定 MA 模型的阶数。
# 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) 方法模型根据过去观测值和过去残差误差的线性组合来预测序列的下一步。 该方法结合了自回归(AR)模型和移动平均(MA)模型。
为了表示模型,符号涉及将 AR(p) 和 MA(q) 模型的顺序指定为 ARMA 函数的参数, 例如 ARMA(p, q)。ARIMA 模型可用于开发 AR 或 MA 模型。
该方法适用于没有趋势和季节性成分的单变量时间序列。
Python 代码
# 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) 方法模型以先前时间步骤的差异观测值和残差误差的线性函数来预测序列的下一步。 该方法综合了自回归(AR)和移动平均(MA)模型的原理以及序列的差分预处理步骤, 使序列平稳,称为积分(I)。
该模型的符号涉及将 AR(p)、I(d) 和 MA(q) 模型的顺序指定为 ARIMA 函数的参数, 例如 ARIMA(p, d, q)。 ARIMA 模型还可用于开发 AR、MA 和 ARMA 模型。 ARIMA 方法最适合表现出趋势但缺乏季节性变化的单变量时间序列。
Python 代码
# 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 增强了 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 代码
# 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)
带有外生回归量的季节性自回归综合移动平均线 ( SARIMAX ) 是 SARIMA 模型的扩展, 它还包括外生变量的建模。
外生变量也称为协变量, 可以被认为是与原始序列在同一时间步骤具有观测值的平行输入序列。 主要序列可以称为内生数据, 以将其与外生序列进行对比。 外生变量的观测值直接包含在每个时间步骤的模型中, 并且与主要内生序列的建模方式不同(例如 AR、MA 等过程)。
SARIMAX 方法还可以用于对包含外生变量的模型进行建模, 例如 ARX、MAX、ARMAX 和 ARIMAX。 该方法适用于具有趋势和/或季节性成分和外生变量的单变量时间序列。
Python 代码
# 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)
向量自回归 (VAR) 方法使用 AR 模型方法对每个时间序列的下一步进行建模。 本质上,它扩展了 AR 模型以适应多个并行时间序列, 例如多变量时间序列。 该模型的符号涉及将 AR(p) 模型的顺序指定为 VAR 函数的参数,例如 VAR(p)。 该方法适用于无趋势和季节成分的多元时间序列。
Python 代码
# VAR example
from statsmodels.tsa.vector_ar.var_model import VAR
from random import random
# contrived dataset with dependency
data = list()
for i in range(100):
v1 = i + random()
v2 = v1 + random()
row = [v1, v2]
data.append(row)
# fit model
model = VAR(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.forecast(model_fit.y, steps=1)
print(yhat)
向量自回归移动平均 (VARMA) 方法利用 ARMA 模型方法对多个时间序列中的即将出现值进行建模。 它是 ARMA 对多个并行时间序列(例如多变量时间序列)的推广。
该模型的符号涉及将 AR(p) 和 MA(q) 模型的阶数指定为 VARMA 函数的参数, 例如 VARMA(p, q)。 VARMA 模型还可用于开发 VAR 或 VMA 模型。 该方法适用于无趋势和季节成分的多元时间序列。
Python 代码
# VARMA 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)
# fit model
model = VARMAX(data, order=(1, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.forecast()
print(yhat)
带外生回归量的向量自回归移动平均 (VARMAX) 扩展了 VARMA 模型的功能, 其中还包括外生变量的建模, 它是 ARMAX 方法的多变量版本。
外生变量,也称为协变量, 可以被认为是与原始序列的时间步骤对齐的平行输入序列。 主要序列被称为内生数据,以将其与外生序列进行对比。 外生变量的观测值直接包含在每个时间步骤的模型中, 并且与主要内生序列的建模方式不同(例如 AR、MA 等过程)。
VARMAX 方法还可以用于对含有外生变量的包含模型进行建模, 例如 VARX 和 VMAX。 该方法适用于无趋势、无季节成分且含有外生变量的多元时间序列。
Python 代码
# 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)
简单指数平滑 (SES) 方法将下一个时间步建模为先前时间步观测值的指数加权线性函数。 该方法适用于没有趋势和季节性成分的单变量时间序列。
Python 代码
# SES example
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = SimpleExpSmoothing(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
霍尔特温特指数平滑法(HWES) 也称为三重指数平滑法, 将下一个时间步建模为前几个时间步观测值的指数加权线性函数, 同时考虑到趋势和季节性。
该方法适用于具有趋势和/或季节性成分的单变量时间序列。
Python 代码
# HWES example
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ExponentialSmoothing(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
如果您想深入了解,本节将提供有关该主题的更多资源。
在本文中,我们发现了一套经典的时间序列预测方法, 可在时间序列数据集上测试和调整这些方法。 这些方法适用于广泛的时间序列数据集, 可让您在各种场景和行业中实施它们。 无论处理的是股市趋势、天气预报还是销售预测, 这些方法都能提供有价值的预测。