Python中的自回归移动平均模型详解

1.自回归移动平均模型(ARMA)

自回归移动平均模型(ARMA)是在时间序列模型中常用的一种模型,它能够用来预测时间序列中未来的数值,同时也可以用来分析时间序列的性质和结构。

ARMA模型包含两个部分,一个是自回归(AR)模型部分,另一个是移动平均(MA)模型部分,AR部分描述了当前值与过去值的相关性,MA部分描述了当前值与过去的误差的相关性。

ARMA模型可以表示为:

ARMA(p,q):

其中,p表示自回归模型中包含多少个滞后项,q表示移动平均模型中包含多少个滞后误差项。而ARMA(1,1)模型可以写成:

ARMA(1,1):

其中,a和b分别是AR部分和MA部分的系数。

ARMA模型通常是通过最大似然估计来确定模型中的参数。然而,ARMA模型有一个很大的限制,就是所有的滞后项必须是已知的和固定的。

2.自回归移动平均模型的扩展(ARIMA)

2.1 ARIMA模型

ARIMA(Autoregressive Integrated Moving Average)模型是对ARMA模型的一个扩展,它在ARMA模型的基础上增加了对时间序列差分的处理,从而能够处理非平稳时间序列。

ARIMA模型包含三个部分,分别是自回归(AR)模型、差分(I)模型和移动平均(MA)模型。其中,差分模型用于将非平稳时间序列转化为平稳时间序列。

ARIMA模型可以表示为:

ARIMA(p,d,q):

其中,p表示自回归模型中的滞后项数,q表示移动平均模型中的滞后误差数,d表示时间序列差分的阶数。

2.2 ARIMA模型的调参

在实际应用中,我们需要手动选择ARIMA模型的参数p、d、q,以得到最好的模型拟合结果。

ARIMA模型的调参过程可以分为以下几个步骤:

2.2.1 数据可视化

首先,我们需要对时间序列进行可视化,了解其整体趋势和波动性。

以下是一个时间序列的可视化图表:

import pandas as pd

import matplotlib.pyplot as plt

# 读取数据

data = pd.read_csv('data.csv', index_col=0)

# 绘制时间序列图

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

plt.plot(data)

plt.title('Time Series')

plt.xlabel('Time')

plt.ylabel('Value')

plt.show()

2.2.2 差分次数确定

如果时间序列是非平稳的,我们需要对其进行差分处理,将其转化为平稳时间序列。差分的次数可以通过时间序列的自相关图(ACF)和偏自相关图(PACF)来确定。

以下是一个时间序列的ACF图和PACF图:

import statsmodels.api as sm

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 绘制ACF和PACF图

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 4))

plot_acf(data, ax=ax1)

plot_pacf(data, ax=ax2)

plt.show()

通过观察ACF和PACF图,我们可以发现时间序列的差分次数为1,因为在差分一次后时间序列的自相关和偏自相关均已消失。

2.2.3 ARIMA(p,d,q)参数确定

在确定差分次数后,我们就可以通过观察ACF和PACF图来确定ARIMA(p,d,q)模型的参数。

如果ACF图在滞后项k处截尾,PACF图在滞后项j处截尾,那么我们就可以选择ARIMA(p,d,q)模型的参数为:

ARIMA(p = j, d, q = k):

以下是一个时间序列的ARIMA模型训练过程的代码:

import statsmodels.api as sm

# ARIMA模型拟合

arma_model = sm.tsa.ARIMA(data, order=(1, 1, 1)).fit()

# 打印模型的AIC和BIC值

print('AIC:', arma_model.aic)

print('BIC:', arma_model.bic)

2.3 ARIMA模型的预测

在训练好ARIMA模型后,我们可以用其来进行未来数值的预测。

以下是一个时间序列的ARIMA模型预测过程的代码:

# ARIMA模型预测

pred = arma_model.predict(start='2021-09-27', end='2021-10-27')

# 绘制原时间序列和预测结果图表

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

plt.plot(data)

plt.plot(pred, color='red')

plt.title('Time Series Prediction')

plt.xlabel('Time')

plt.ylabel('Value')

plt.show()

3.自回归移动平均模型的扩展(ARMA模型)

ARMA(Autoregressive Moving Average)模型是ARIMA模型的一个特殊情况,它省略了差分(I)模型,适用于一类平稳时间序列。

ARMA模型可以表示为:

ARMA(p,q):

以下是一个时间序列的ARMA模型训练过程的代码:

import statsmodels.api as sm

# ARMA模型拟合

arma_model = sm.tsa.ARMA(data, order=(1, 1)).fit()

# 打印模型的AIC和BIC值

print('AIC:', arma_model.aic)

print('BIC:', arma_model.bic)

3.1 ARMA模型的预测

在训练好ARMA模型后,我们可以用其来进行未来数值的预测。

以下是一个时间序列的ARMA模型预测过程的代码:

# ARMA模型预测

pred = arma_model.predict(start='2021-09-27', end='2021-10-27')

# 绘制原时间序列和预测结果图表

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

plt.plot(data)

plt.plot(pred, color='red')

plt.title('Time Series Prediction')

plt.xlabel('Time')

plt.ylabel('Value')

plt.show()

3.2 ARMA模型参数的选择

在选择ARMA模型的参数p和q时,我们可以通过观察ACF和PACF图来确定。

以下是一个时间序列的ACF图和PACF图:

import statsmodels.api as sm

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 绘制ACF和PACF图

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 4))

plot_acf(data, ax=ax1)

plot_pacf(data, ax=ax2)

plt.show()

根据ACF和PACF图,我们可以选择较好的ARMA(p, q)模型参数。例如,在上面的ACF和PACF图中,我们可以观察到,ACF在1处截尾,PACF在1处截尾,因此我们可以选择ARMA(1,1)模型,然后进行模型训练和预测。

4.总结

自回归移动平均模型是时间序列模型中常用的一种模型。ARMA模型和ARIMA模型是ARMA模型的一个扩展,它们可以用于预测和分析时间序列的性质和结构。在选择ARMA模型和ARIMA模型的参数时,我们可以通过时间序列的ACF和PACF图来确定。在实际应用中,我们可以使用Python中的statsmodels库来拟合和预测ARMA模型和ARIMA模型。

后端开发标签