Press "Enter" to skip to content

时间序列分析:Python中的ARIMA模型

时间序列分析广泛应用于时间序列中的预测和未来点的预测。自回归移动平均(ARIMA)模型广泛用于时间序列预测,并被认为是最流行的方法之一。在本教程中,我们将学习如何在Python中构建和评估用于时间序列预测的ARIMA模型。

 

什么是ARIMA模型?

 

ARIMA模型是一种用于分析和预测时间序列数据的统计模型。ARIMA方法明确地针对时间序列中的标准结构,提供了一种简单而强大的方法,用于进行精确的时间序列预测。

ARIMA代表自回归差分移动平均。它结合了三个关键方面:

  • 自回归(AR):使用当前观察值和滞后观察值之间的相关性的模型。滞后观察值的数量被称为滞后阶数或p。
  • 差分(I):通过对原始观测值进行差分使时间序列平稳化。差分操作的次数被称为d。
  • 移动平均(MA):模型考虑了当前观测值与应用于过去观测值的移动平均模型的残差之间的关系。移动平均窗口的大小是阶数或q。

ARIMA模型的定义是ARIMA(p,d,q),其中p,d和q被替换为整数值以指定所使用的确切模型。

采用ARIMA模型时的关键假设:

  • 时间序列是由基础的ARIMA过程生成的。
  • 参数p,d,q必须根据原始观测值适当指定。
  • 在拟合ARIMA模型之前,必须通过差分使时间序列数据平稳。
  • 如果模型拟合良好,则残差应该是不相关且符合正态分布的。

总之,ARIMA模型为建模时间序列数据提供了一种结构化和可配置的方法,用于预测等目的。接下来,我们将学习如何在Python中拟合ARIMA模型。

 

Python代码示例

 

在本教程中,我们将使用Kaggle上的Netflix股票数据来使用ARIMA模型预测Netflix股票价格。

 

数据加载

 

我们将使用具有“Date”列作为索引的股票价格数据集。

import pandas as pd


net_df = pd.read_csv("Netflix_stock_history.csv", index_col="Date", parse_dates=True)
net_df.head(3)

 

时间序列分析:Python中的ARIMA模型 四海 第1张

 

数据可视化

 

我们可以使用pandas的’plot’函数来可视化股票价格和成交量随时间的变化。很明显,股票价格呈指数增长。

net_df[["Close","Volume"]].plot(subplots=True, layout=(2,1));

 

时间序列分析:Python中的ARIMA模型 四海 第2张

 

滚动预测ARIMA模型

 

我们的数据集已被拆分为训练集和测试集,并继续训练了一个ARIMA模型。然后进行了第一次预测。

由于通用ARIMA模型产生了一条平直线,我们得到了糟糕的结果。因此,我们决定尝试滚动预测方法。

注意:代码示例是BOGDAN IVANYUK笔记本的修改版本。

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math


train_data, test_data = net_df[0:int(len(net_df)*0.9)], net_df[int(len(net_df)*0.9):]


train_arima = train_data['Open']
test_arima = test_data['Open']


history = [x for x in train_arima]
y = test_arima
# make first prediction
predictions = list()
model = ARIMA(history, order=(1,1,0))
model_fit = model.fit()
yhat = model_fit.forecast()[0]
predictions.append(yhat)
history.append(y[0])

 

处理时间序列数据时,由于依赖于先前的观察结果,通常需要进行滚动预测。一种方法是在收到每个新观察结果后重新创建模型。

为了跟踪所有观察结果,我们可以手动维护一个名为history的列表,该列表最初包含训练数据,并在每次迭代中附加新的观察结果。这种方法可以帮助我们获得准确的预测模型。

# 滚动预测
for i in range(1, len(y)):
    # 预测
    model = ARIMA(history, order=(1,1,0))
    model_fit = model.fit()
    yhat = model_fit.forecast()[0]
    # 反向转换预测
    predictions.append(yhat)
    # 观察结果
    obs = y[i]
    history.append(obs)

 

模型评估

 

我们的滚动预测ARIMA模型相比简单实现提高了100%,取得了令人印象深刻的结果。

# 报告性能
mse = mean_squared_error(y, predictions)
print('MSE: '+str(mse))
mae = mean_absolute_error(y, predictions)
print('MAE: '+str(mae))
rmse = math.sqrt(mean_squared_error(y, predictions))
print('RMSE: '+str(rmse))

 

MSE: 116.89611817706545
MAE: 7.690948135967959
RMSE: 10.811850821069696

 

让我们将实际结果与预测结果进行可视化和比较。很明显,我们的模型进行了高度准确的预测。

import matplotlib.pyplot as plt
plt.figure(figsize=(16,8))
plt.plot(net_df.index[-600:], net_df['Open'].tail(600), color='green', label = 'Train Stock Price')
plt.plot(test_data.index, y, color = 'red', label = 'Real Stock Price')
plt.plot(test_data.index, predictions, color = 'blue', label = 'Predicted Stock Price')
plt.title('Netflix Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Netflix Stock Price')
plt.legend()
plt.grid(True)
plt.savefig('arima_model.pdf')
plt.show()

 

时间序列分析:Python中的ARIMA模型 四海 第3张

 

结论

 

在这个简短的教程中,我们提供了ARIMA模型的概述以及如何在Python中实现时间序列预测。ARIMA方法提供了一种灵活且结构化的建模时间序列数据的方式,该方法依赖于先前的观察结果以及过去的预测误差。如果您对ARIMA模型和时间序列分析的全面分析感兴趣,我建议您查看《使用时间序列分析进行股市预测》。Abid Ali Awan(@1abidaliawan)是一位持有认证数据科学家职业的专业人士,热衷于构建机器学习模型。目前,他专注于内容创作,并在机器学习和数据科学技术方面撰写技术博客。Abid拥有技术管理硕士学位和电信工程学士学位。他的愿景是利用图神经网络为患有心理疾病的学生构建一个AI产品。

Leave a Reply

Your email address will not be published. Required fields are marked *