简单讲解三种时间序列预测方法
时间序列预测是根据历史数据预测未来值的任务。跨行业的例子包括天气、销售数字和股票价格的预测。最近,它已被应用于预测比特币等加密货币的价格趋势。鉴于时间序列预测应用在各行各业的盛行,每个数据科学家都应该对时间序列预测的可用方法有所了解。
有多种方法可用于时间序列预测。最常用的一种是自回归移动平均 (ARMA),这是一种使用过去值预测未来值的统计模型。然而,这种方法有缺陷,因为它没有捕捉季节性趋势。它还假设时间序列数据是平稳的,这意味着其统计属性不会随时间变化。这种类型的行为是一种理想化的假设,在实践中并不成立,这意味着 ARMA 可能会提供有偏差的结果。
ARMA的扩展是自回归综合移动平均(ARIMA)模型,该模型不假设平稳性,但仍假设数据几乎没有季节性。幸运的是,Seasonal ARIMA (SARIMA)变体是一种统计模型,可以处理非平稳数据并捕获一些季节性。
Python 提供了许多易于使用的库和工具来执行时间序列预测。具体来说,Python 中的stats库提供了只需几行代码即可构建 ARMA、ARIMA 和 SARIMA 模型的工具。由于所有这些模型都在单个库中可用,因此您可以在同一脚本或笔记本中使用不同模型轻松运行许多实验。
接下来我们来学习如何构建ARMA、ARIMA和SARIMA模型来预测比特币(BTC)未来价格。
读取和显示BTC时间序列数据
使用Pandas数据阅读器读取BTC的历史价格:
打开Python脚本并从 Pandas库中导入数据读取器:
导入Pandas库本身并放宽列和行的显示限制:
导入日期时间库,定义数据拉取的开始和结束日期:
现在已经做好了提取比特币价格时间序列数据所需的一切准备工作,接下来正式开始。

图中数据框包含许多列,来看看每列的含义:
日期:这是我们时间序列中的索引,用于指定与价格相关的日期。
收盘价:当天购买BTC的最后价格。
开盘价:当天购买BTC的第一个价格。
高:当天购买BTC的最高价格。
低:当天购买BTC的最低价格。
成交量:当天的总交易次数。
Adj Close:根据股息和股票分割调整的收盘价。
我们将在我们的预测模型中使用收盘价,具体来说,我们将使用历史收盘BTC价格来预测未来的BTC价格。
让我们将收盘价BTC数据写入csv文件。这样,我们就可以避免使用Pandas数据读取器重复拉取数据。
读入csv文件并显示前五行:

为了使用stats库提供的模型,需要将日期列设置为数据框索引,使用 to_datetime方法格式化该日期:
现在日期是索引,我们可以删除日期列:
显示数据框:

绘制我们的时间序列数据,导入数据可视化库Seaborn和Matplotlib:
使用Seaborn来格式化可视化:
并使用Matplotlib标记y轴和x轴。将调整x轴上的日期,以便它们更易于阅读:
最后,使用Matplotlib生成我们的绘图:

继续构建第一个时间序列模型,即自回归移动平均线。
为训练和测试拆分数据
模型构建的一个重要部分是拆分我们的数据以进行训练和测试。拆分用于训练和测试的数据可确保您构建的模型可以在训练数据之外进行泛化,并确保性能和输出具有统计意义。
拆分数据,使得2020年11月之前的所有数据都作为训练数据,2020年之后的所有数据都成为测试数据:

自回归移动平均线 (ARMA)
ARMA 中的术语“自回归”意味着该模型使用过去的值来预测未来的值。具体来说,预测值是过去值的加权线性组合。这种回归方法类似于线性回归,不同的是这里的特征输入是历史值。
移动平均是指由白噪声项的加权线性组合表示的预测,其中白噪声是随机信号。这里的想法是ARMA使用过去值和白噪声的组合来预测未来值。自回归模拟市场参与者的行为,例如买卖 BTC。白噪声模拟战争、经济衰退和政治事件等冲击事件。
我们可以使用SARIMAX包定义ARMA模型:
定义输入:
定义模型,使用SARIMAX类定义ARMA模型,传入 (1, 0 ,1) 的顺序参数:
ARMAmodel = SARIMAX(y, order = (1, 0, 1))
拟合模型:
生成预测:
绘制结果:

使用均方根误差来评估性能:

RMSE相当高,我们可以在检查图时猜到。不幸的是,当价格实际上涨时,该模型预测价格会下降。同样,ARMA的局限性在于它对非平稳时间序列失败并且不能捕捉季节性。让我们看看我们是否可以使用ARIMA提高性能
自回归综合移动平均线 (ARIMA)
从stats库中导入ARIMA包:
ARIMA 任务具有三个参数:
第一个参数对应于滞后(过去的值);
第二个对应于差分(这是使非平稳数据平稳的原因);
最后一个参数对应于白噪声(用于模拟冲击事件)。
用顺序参数(2,2,2)定义一个ARIMA模型:

图中看到ARIMA预测(黄色)落在ARMA预测之上,接下来尝试将差分参数增加到ARIMA(2,3,2):

感觉这有助于捕捉价格上涨的方向,接着尝试使用 ARIMA(5,4,2) 进一步调整参数:

RMSE为793,比ARMA好。
最后,测试加入季节性的SARIMA是否会进一步提高性能。
Seasonal ARIMA (SARIMA)
Seasonal ARIMA捕捉历史价值、冲击事件和季节性。我们可以使用SARIMAX类定义一个SARIMA模型:

这里我们的RMSE为966,比ARIMA稍差。这可能是由于缺乏超参数调整。如果我们使用SARIMA模型的参数,我们应该能够进一步提高性能。
如果又大神可以使用超参数,看看是否可以构建一个性能优于ARIMA的SARIMA模型。此外,也可以使用网格搜索等方法通过算法找到每个模型的最佳参数。
本文代码:
https://github.com/spierre91/builtiin/blob/main/time_series_forecasting.py
总结
时间序列预测是许多数据科学团队面临的跨行业常见任务。充分了解可用的常用工具和方法将使数据科学家能够快速运行新实验并生成结果。了解每个模型中参数的重要性,例如滞后参数、差分、白噪声和季节性,可以为构建简单的时间序列模型奠定基础。这也为理解一些可用的更高级技术奠定了良好的基础。
能够准确可靠地预测未来事件是一项宝贵的技能,在加密货币和传统金融市场之外也有应用。但是始终记得,对于任何数据科学家来说,无论他们从事什么行业,熟悉基础知识都是有用的。
如果你想要学习时间序列方面的相关知识,需要积累时间序列方面的项目经验,可以学习下图中的项目课程。
原文链接:
https://pub.towardsai.net/time-series-forecasting-in-python-4e7d65580b9
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
