【时间序列】初识时间序列预测神器 NeuralProphet 实战预测股票指数

历经神奇的2022年,终于迎来曙光的2023年,新的一年,MyEncyclopedia 会和小伙伴们一同学习思考实践。长风破浪会有时,直挂云帆济沧海!共勉之

NeuralProphet深度学习Prophet

NeuralProphet 负有盛名,是 Facebook开发的新一代 Prophet 时间序列预测框架,堪称时间序列预测神器。但是它的API使用,调参,原理不太为大家所知,我们会花几期文章和视频,我们将由浅入深,由实践至原理,揭开其神秘面纱。

NeuralProphet 继承了 Prophet 模块可接受性的特点,将预测的值分解到趋势、季节性、AR、事件(节日)几个模块。其中 AR 部分的神经网络实现由 AR-Net: A simple Auto-Regressive Neural Network for time-series 这篇论文详细描述。此外,NeuralProphet 整体用 PyTorch 重新实现,主要特性如下

  • 使用 PyTorch 的优化,性能比原始 Prophet 快不少

  • 引入 AR-Net 建模时间序列自回归,并配有非线性层

  • 自定义损失和指标

  • 滞后协变量(lagged covariates) 和 AR 本地上下文特性 (local context)

尽管 NeuralProphet 有不少优势,但是使用起来小问题不断,主要表现为文档不甚详细,API 设计的比较智能(隐晦),坑不少。这一期我们来实战体验一下,后续会深入代码和论文。

相关论文链接:

  • [Prophet] Forecasting at scale  
    https://peerj.com/preprints/3190/

  • NeuralProphet: Explainable Forecasting at Scale
    https://arxiv.org/abs/2111.15397

  • AR-Net: A simple Auto-Regressive Neural Network for time-series
    https://arxiv.org/abs/1911.12436

安装NeuralProphet

使用命令通过 pip 就可以安装 NeuralProphet。

pip install neuralprophet==0.5.0

如果在 Jupyter Notebook 中使用 NeuralProphet,最好安装实时版本,允许你实时可视化模型损失。

pip install neuralprophet[live]==0.5.0

要注意一点,安装 neuralprophet 会关联安装 Pytorch CPU版本库,如果你需要使用 GPU 或者不希望覆盖原有的 Pytorch 版本,请手动安装。

此外,MyEncyclopedia 和往常一样,为大家准备了一个 docker 镜像,预装最新的 NeuralProphet 库,镜像中还包含预下载的数据集和本文所有的 Jupyter Notebook 代码。大家关注 MyEncyclopedia公众号,执行下面命令后网页打开 http://localhost:8888/ 开箱即用

docker pull myencyclopedia/neuralprophet-tut
docker run -p 8888:8888 myencyclopedia/neuralprophet-tut bash -c 'jupyter notebook --port 8888 --NotebookApp.token='' --NotebookApp.password='' --ip 0.0.0.0 --allow-root'

标准普尔 500 指数数据集

这次实战我们使用过去 10 年标准普尔 500 指数的每日股价数据。可以通过如下命令下载数据集,使用 docker 镜像的同学无需额外下载。

import pandas_datareader as pdr
from datetime import datetime
import matplotlib.pyplot as plt
%matplotlib inlinestart = datetime(2010, 12, 13)
end = datetime(2020, 12, 11)
df_sp500 = pdr.get_data_fred('sp500', start, end)
plt.figure(figsize=(10, 7))
plt.plot(df_sp500)
plt.title('S&P 500 Prices')

ef9f0ccae9bdbcddd52fc120aab0eae7.png

从图中我们可以清楚地看到标准普尔 500 指数总体呈上升趋势,其中有几个点的价格大幅上涨或下跌。我们可以将这些点视为趋势变化点。鉴于此,我们先从一个仅有趋势模块的 NeuralProphet 模型开始,逐渐加入季节性,AR和节日模块,观察其预测表现和API 具体使用。

使用 NeuralProphet,我们必须确保数据的格式包含如下两列:日期列名ds,目标变量列名 y

df_sp500 = df_sp500.reset_index().rename(columns={'DATE': 'ds', 'sp500': 'y'})

ca7b4271870febf0b618df446b591a10.png

89f724e7dcc02468801a70333ade3328.png

len(df_sp500[~df_sp500.y.isnull()])
>>> 2007

总结 SP 500 数据观察到的特点,后面会反复和过程变量做对比:

  • 总共2080条数据中非空数据有2007

  • 开始日期为 2012-12-24,结束日期 2020-12-11

  • 在上述有效时间段内,非交易的日期(周末,节日)没有在列。

模块一:趋势

使用 NeuralProphet,我们可以通过指定几个重要参数来对时间序列数据中的趋势进行建模。

  • n_changepoints — 指定趋势发生变化的点数。

  • trend_reg — 控制趋势变化点的正则化参数。较大的值 (~1–100) 将惩罚更多的变化点。较小的值 (~0.001–1.0) 将允许更多的变化点。

  • changepoints_range — 默认值 0.8,表示后20%的训练数据无 changepoints

model = NeuralProphet(n_changepoints=100,trend_reg=0.05,yearly_seasonality=False,weekly_seasonality=False,daily_seasonality=False,epochs=100)

训练模型

df_train, df_val = model.split_df(df_sp500, freq="D", valid_p=0.2)
metrics = model.fit(df_train,freq='D',validation_df=df_val,progress="plot")

70208ed4e10b6ab15d4b54c1bcca1040.gif

训练最终趋于稳定。我们来看看 split_df API 的细节。

d7f1386a2ce8cb32cffa0272570d33e4.png

92feb2da626de85e7fc18946f927b6eb.png

df_train 共1606 行,为前 80% 记录,df_val 共401 行,为后20% 记录,两者没有交集,合计 2007 行数据,等于 df_sp500 有效数据数。原来默认情况下 split_df 会扔掉 y 值为 NaN 数据。这里两者没有交集,大家注意对比启用AR后的数据切分两者会有交集。原有是启用自回归后,预测需要过去 k 个点作为输入。

预测验证集

接着来看看验证集,即 df_val 上的预测表现。

future = model.make_future_dataframe(df_sp500, periods=60, n_historic_predictions=True)
forecast = model.predict(future)
fig = model.plot(forecast)
fig.show()

1a22d5a9c489f1098d447fcd8942ca47.png

make_future_dataframe 准备好待预测的数据格式,参数 periods=60n_historic_predictions=True 意义扩展 df_sp500 到未来60天后,同时保留所有所有现有 df_sp500 的数据点,这些历史点也将做预测。我们 dump 出 make_future_dataframe 后的 future 变量。

b255754b64d35bd14f20ab7e01d77ada.png

e6ed8868934b1fdcd9354f8e1c25692b.png

future 序列扩展了 df_sp500,有 y 值的共2007条,和 df_sp500 一致。时间扩展到了 2021-02-09,大约是 2021-12-11 后的60天,这个也和总条数 2140 一致,等于 df_sp500 总条数 2080 加上 periods=60 的部分。

接着来看 predict 后的 forecast 变量。y 列依然有 2007 条,多了 yhat1 和 trend 两列。

16b8799f4af24ee95ce79b717a356f3c.png


最后,model.plot(forecast) 会绘制出事实点和预测点的曲线,注意图中预测值比实际值要稍长一些,因为预测值到 2021-02-09,实际值仅到 2020-12-11

模块归因

fig_components = model.plot_components(forecast)

8a60f343500326fff5ca004260c44ec1.png

由于只启用了趋势,只有一个模块输出。

很明显,我们的模型捕捉到了标准普尔 500 指数的总体上涨趋势,但该模型存在欠拟合问题,尤其是当我们查看未知未来的60天的预测,更能发现问题。

仅预测未来

同样的预测代码,将 n_historic_predictions 改成 False 会只预测未知未来60天。

future = model.make_future_dataframe(df_sp500, periods=60, n_historic_predictions=False)
forecast = model.predict(future)
fig = model.plot(forecast)
fig.show()

b07fd315715f2f4009c381a1d601983d.png

print(len(future), len(forecast))
>>> 60 60

根据上图,我们可以看到模型对未来的预测遵循一条直线,天天上涨的股票,还在这里看什么,还不赶紧去买!

模块二:季节性

真实世界的时间序列数据通常涉及季节性模式。即使对于股票市场也是如此,一月效应等趋势可能会逐年出现。我们可以通过添加年度季节性来使之前的模型更加完善。

model = NeuralProphet(n_changepoints=100,trend_reg=0.05,yearly_seasonality=True,weekly_seasonality=False,daily_seasonality=False,epochs=100)df_train, df_val = model.split_df(df_sp500, freq="D", valid_p=0.2)metrics = model.fit(df_train,freq='D',validation_df=df_val,progress="bar")

预测验证集

6c735e658f2b7ca32e0e0913998f4f5f.png

和之前一条直线相比,现在对数据的预测显得更现实些。

模块归因

现在预测的 Y 值是两个部分的模块的加和了。

fig_components = model.plot_components(forecast)

4602a0d0e5d84f515ca696c4ab5c3a58.png

标准普尔 500 指数预测具有年度季节性,包括历史数据。

仅预测未来

plot_forecast(model, sp500_data, periods=60, historic_predictions=False, highlight_steps_ahead=60)

3105ee282e125652fd9e33286444715e.png

根据上图,我们可以看到这个模型更真实一些,但仍然存在欠拟合问题。因此,我们再引入自回归模型 AR 来进一步拟合。

模块三:自回归 AR

AR-Net 是一种用于时间序列预测的自回归神经网络。自回归模型使用来自过去历史数据点来预测后续点,这就是自回归一词的来源。

例如,为了预测标准普尔 500 指数的价格,我们可以训练一个模型,使用过去 60 天的价格来预测未来 60 天的价格。分别对应以下代码中的n_lagsn_forecasts参数。

model = NeuralProphet(n_forecasts=60,n_lags=60,changepoints_range=0.95,n_changepoints=100,yearly_seasonality=True,weekly_seasonality=False,daily_seasonality=False,batch_size=32,epochs=100,learning_rate=1.0,
)

训练模型

df_train, df_val = model.split_df(df_sp500, freq="D", valid_p=0.2)
metrics = model.fit(df_train,freq='D',validation_df=df_val,progress="plot")

切分训练和验证集代码一样,但是由于引入 AR,df_traindf_val 之间有60条数据重合,这是因为,在验证或者预测过程中,传入的 dataframe 前60条不做预测,从61条开始预测,预测会使用当前日期前60条作为 AR 模块的输入。

len(set(df_train.ds.tolist()).intersection(set(df_val.ds.tolist())))
>>> 60

不过奇怪的是,df_train 加上 df_val 总共有 2305 + 665 = 2970 条记录,时间跨度依然是 2012-12-24 至 2020-12-11。但是去除重复的60条记录后居然剩余2910 条, 比 df_sp500 2080 条记录数还要多不少。

0660e5130ad3fb8367da11c05e563200.png

6f37d82bbe4b57f767f7f2ae97a86c0a.png


这里笔者稍微花了点时间终于弄清楚:df_traindf_val 会填充 2012-12-24 至 2020-12-11 所有的 missing 日期,并使用插值填充 y!

15add033390eaf58e5132a4209e6011c.png


预测验证集

这一次,我们将 periods 设成 0,也就是不扩展 df_sp500 时间到未知的未来。

future = model.make_future_dataframe(df_sp500, periods=0, n_historic_predictions=True)

1fc1fae9fecf5ead5126b0940a4e3167.png

forecast = model.predict(future)

f894a2c2843d28e17bd2664b23ce8a16.png

forecast 格式变得复杂,引入了 yhat1, yhat2, ...,yhat60,ar1, ar2, ...,ar60 等众多列,这里的60对应于 n_forecasts=60

第一个预测值开始于 forecast 的第61条记录,对应于 n_lags = 60

70e9004f810506c186e205b9eefeaae3.png

forecast[~forecast.yhat1.isnull()]

fig = model.plot(forecast)
fig.show()

9bee9a839e08d973dd4a778efcb2dce7.png

模块归因

fig_components = model.plot_components(forecast)

03403213e7b0b3a703f25788838b26d4.png

仅预测未来

future = model.make_future_dataframe(df_sp500, periods=60, n_historic_predictions=False)
forecast = model.predict(future)
fig = model.plot(forecast)
fig.show()

0e71187eec4acaabbc6137789daa02b8.png

模块四:事件(节日)

我们还可以配置模型以考虑节假日因素,因为节假日很可能会影响股市走势。

model = NeuralProphet(n_forecasts=60,n_lags=60,changepoints_range=0.95,n_changepoints=100,yearly_seasonality=True,weekly_seasonality=False,daily_seasonality=False,batch_size=32,epochs=100,learning_rate=1.0,
)model = model.add_country_holidays("US", mode="additive", lower_window=-1, upper_window=1)

只需 add_country_holidays 一条语句就可以启用预定义的美国节假日。

plot_forecast(model, sp500_data, periods=60, historic_predictions=False, highlight_steps_ahead=60)

预测验证集

33e9e5077fa98ff5c9f2a9189bf20a23.png

模块归因

fig_components = model.plot_components(forecast)

1f3546a331c7298fedb88708ea629a03.png

仅预测未来

future = model.make_future_dataframe(df_sp500, periods=60, n_historic_predictions=False)
forecast = model.predict(future)
fig = model.plot(forecast)
fig.show()

5e3be3450ee83ffcd060d9f37ddb97e6.png


 

29ca01ea0889d8dc95e265dcc746e5f7.jpeg

 
 
 
 
往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44415.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | Python实现TCN时间卷积神经网络时间序列预测

时序预测 | Python实现TCN时间卷积神经网络时间序列预测 目录 时序预测 | Python实现TCN时间卷积神经网络时间序列预测预测效果基本介绍环境准备模型描述程序设计学习小结参考资料预测效果 基本介绍 递归神经网络 (RNN),尤其是 LSTM,非常适合时间序列处理。 作为研究相关技术…

使用sklearn.ensemble.RandomForestRegressor和GridSearchCV进行成人死亡率预测

原文链接:https://blog.csdn.net/weixin_44491423/article/details/127011461 本文借鉴博主hhhcbw实现方法完成随机森林回归预测成人死亡率,使用训练数据测试模型的最优得分R20.8161,在测试集上得分R20.5825 成年人死亡率指的是每一千人中15岁…

基于TCN时间序列预测Python程序

基于TCN预测模型 特色:1、单变量,多变量输入,自由切换 2、单步预测,多步预测,自动切换 3、基于Pytorch架构 4、多个评估指标(MAE,MSE,R2,MAPE等) 5、数据从excel文件中读取,更换简单…

时序预测 | Python实现Attention-TCN注意力机制时间卷积神经网络的多元时间序列预测

时序预测 | Python实现Attention-TCN注意力机制时间卷积神经网络的多元时间序列预测 目录 时序预测 | Python实现Attention-TCN注意力机制时间卷积神经网络的多元时间序列预测预测效果基本介绍环境配置程序设计模型效果参考资料预测效果 基本介绍 使用时间注意卷积神经网络进行…

AI预测死亡时间,准确率95%

(本内容转载自公众号“科技与Python”) 日前,谷歌新出炉的一项研究报告称,该公司已开发出一种新人工智能(AI)算法,可预测人的死亡时间,且准确率高达95%。最近,谷歌的这项研究发表在了《自然》杂…

FACEBOOK 时间序列预测算法 PROPHET 的研究

1.思想 在时间序列分析领域,有一种常见的分析方法叫做时间序列的分解(Decomposition of Time Series),它把时间序列 分成几个部分,分别是季节项 ,趋势项 ,剩余项 。也就是说对所有的 &#xff…

python 用LSTM预测时间序列之预测新冠肺炎疫情

用到的模块 import numpy import matplotlib.pyplot as plt from pandas import read_csv import math from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from sklearn.metrics import mean_squared_error from keras.call…

基于self-attention-TCN时间序列预测Python程序

基于self-attention-TCN时间序列预测Python程序 特色:1、单变量,多变量输入,自由切换 2、单步预测,多步预测,自动切换 3、基于Pytorch架构 4、多个评估指标(MAE,MSE,R2,M…

Kaggle_Titanic生存预测 -- 详细流程吐血梳理

作者: 大树先生 博客: http://blog.csdn.net/koala_tree 知乎:https://www.zhihu.com/people/dashuxiansheng GitHub:https://github.com/MrLeeTree 2017 年 12 月 5 日 一直想在Kaggle上参加一次比赛,奈何被各种事情所…

python攻陷米哈游《元神》数据?详情请看文章。。

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 《原神》是由米哈游自研的一款全新开放世界冒险RPG。 里面拥有许多丰富得角色,让玩家为之着迷~ 今天,我们就来用python探索一下原神游戏角色信息! 标题大家看看就好了哈~&#xff08…

米哈游技术总监详解《原神》画面效果的技术实现

11月17日,中国Unity线上技术大会游戏专场迎来米哈游技术总监弋振中的分享,此次他围绕“从手机走向主机-《原神》主机版渲染技术”为主题,细致地讲解了《原神》在主机上渲染技术实现的重点内容。 以下是演讲内容(有节选&#xff09…

原神反调试分析

打开CE,打开原神启动器。 至此,游戏未加载驱动。启动器可以被CE正常读写。 打开原神,CE中选择YuanShen.exe,发现原神并不能被读写。 尝试分析不能读写的原因。 CE调用的读取内存函数是NtReadVirtualMemory 猜测有三种可能 1.NtReadVirtu…

关于原神抽奖概率的简要分析

序言 最近迷上了原神这款游戏,趁着保研完,肝了两个星期,也氪了一些金。先不谈这款游戏可玩性有多高,但论氪金强度算是我从小到大玩的游戏中,能排得上第一的了。 对于这种寸卡寸金的游戏,如何在无穷无尽的…

CAD教程:如何将Excel数据快速导入CAD图纸

在平时的设计工作中,为了图纸内容的丰富性,通常会在里面添加一些元素,使得数据更加的完善,那我们想在CAD图纸中添加一份Excel数据表,徒手绘制那就肯定是太过于麻烦了,那怎么才能省时省事呢?这个…

CAD绘图软件中如何将图纸分享给其他人

当我们在CAD绘图软件中打开一张图纸进行查看的时候,查看完成后,在CAD绘图软件中如何将图纸分享给其他人,具体要怎么来进行操作呢?相信很多的小伙伴们都想要知道,那下面小编就来教教大家具体的操作方法吧。 第一步&…

怎么将手机上保存的CAD图纸发送给好友

现在有很多的工作我们也可以在手机中完成,就比如说我们再收集中将图纸进行查看之后保存了下来,之后同事需要使用到这张CAD图纸文件。那么我们就可以将图纸发送给好友。怎么将手机上保存的CAD图纸发送给好友,下面我们一起来看看。 步骤一&…

dat文件导入cad画图步骤_图说CAD|多文件、多布局图纸批量打印设置的8个关键步骤...

在AutoCAD中,Publish(发布)功能具有批量打印图纸的功能:1. 以读取预设页面设置的方式进行打印,可直接打印为一套图纸电子文件,也可以打印为单张图纸电子文件。2. 支持批量自定义图纸名称指定。3. 可对发布图纸内容进行增减、排序。…

怎么把CAD表格转换成Excel表格?CAD表格导出教程

有些小伙伴在使用CAD软件绘制图纸的过程中,想要将CAD表格导出为Excel表格时不知道该如何操作,浩辰CAD软件中提供了CAD表格转Excel功能,可以快速将CAD中由线和文字构成的表格转换成Excel表格。下面就让小编来给大家介绍一下浩辰CAD给排水软件中…

计算机接口cad图,管道接口CAD平面图怎么画

回答: CAD怎么画钢琴平面图 CAD怎么画出钢琴的平面图呢?很简单的,有需要的朋友动手试试吧。 1、启动中望CAD软件,执行“矩形”命令(rec),绘制1575mmX230mm和1575X50mm的直角矩形。 2、执行矩形命令和移动命令(M),绘制出…

cad快速看图软件免费版(手机在线cad快速看图)

很多机械设计师日常工作过程中涉及到多种格式的cad图纸,cad图纸大多都需要cad设计软件才能打开,然而很多小伙伴并没有下载相应的cad设计软件,这种情况下如何进行cad快速看图呢? 今天小编为大家推荐一款cad快速看图软件免费版&…