ARIMA时间序列与LSTM神经网络的PK


前言时间序列算是我接触的第一个统计学实践项目,也是它把我带进了机器学习的大门。当时的我的工作是根据过往投资和赎回量,每天预估一个需要留的钱,有点类似银行准备金。我本想自己写个代码,无奈能力不足,最后让算法工程师帮我写了一套,每天预测准确率大约90%。回头过了1年多我现在都不会,当时肯定写不出来了。

正好这周末学习统计预测,上课老师讲的是ARIMA模型为主,不过老师也说了目前要更高的准确率推荐神经网络。正好我也查到了神经网络相关代码,尝试做一个ARIMA与神经网络结果比对。同时也是为了十月有一个预测比赛打基础。

一、
ARIMA模型


ARIMA模型于1982年提出,是时间序列预测分析方法之一。ARIMA(p,d,q)中,AR是"自回归",p为自回归项数;MA为"滑动平均",q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。后面ARIMA模型我是用R语言来实现的。
第一步:安装包 ;主要用到forecast需要下载以便预测。

第二步:下载导入数据
这里以最近两年ICBC的的历史股票行情为例。数据是2017年4月5日至2019年9月20日每天股票最高价。根据以往数据预测9月23日至9月27日ICBC股价(最高价),下载数据可见后文lstm模型开头有下载办法。
#导入下载的数据	
w<-read.table("F:/ML/习题数据、案例数据、R代码/data/i.csv",sep=",",header = T);	
x<-ts(w$high,start=c(2017,4,5),frequency = 365);	
plot(x);

第三步:对差分序列性质进行考察
#对差分序列性质考察p	
lot(diff(x))	
acf(diff(x))	
pacf(diff(x))

结果如下图:
640?wx_fmt=png

640?wx_fmt=png

第四步:水平相关信息提取,拟合ARIMA(5,1,2)模型
#这个例子用的ARIMA(5,1,2),也可以用auto.arima来建立模型	
x.fit<-arima(x,order= c(5,1,2))	
x.fit

第五步:残差白噪声检验
for (i in 1:2) print(Box.test(x.fit$residual,lag=6*i))
640?wx_fmt=png

输出的P值还不错。
 
第六步:水平预测,并绘制预测图
x.fore<-forecast(x.fit,h=5)	
x.fore	
plot(x.fore)
640?wx_fmt=png

这里 Point Forecast 一列就是对未来5天的预测结果。而后面Lo 80、Hi 80组成的区间,意思是有80%的落在区间内。95%同理。
640?wx_fmt=png

可以看到,ARIMA预测结果是稳中有升,这和实际9月23日至9月27日ICBC股价(最高价)走势也相似。

二、
LSTM模型

LSTM(长短期记忆网络)模型首次提出是在1997年,是在RNN上的一个拓展。更为广为人知的神经网络RNN有一个缺点,就是容易遗忘最开始输入的内容,而LSTM采用长短记忆的方法有效解决这一问题。在2014年之后随着RNN的普及发展,LSTM也有了更广泛的发展应用。明显相比上世纪就已经成熟的ARIMA模型,LSTM更加新颖效果好,但是暂时还没有编写到课本里面。关LSTM模型具体介绍,网上和知乎上的介绍很多,理论方面就不多赘述了,下面直接说我的实战代码。这里我用的pytorch 1.1版本来实现LSTM。


第一步:导入必要包
import pandas as pd	
import matplotlib.pyplot as plt	
import datetime	
import os	
import torch	
import torch.nn as nn	
import numpy as np	
from torch.utils.data importDataset, DataLoader

第二步: 利用tushare包去下载最近两年ICBC的的历史股票行情
640?wx_fmt=png
第三步:数据预处理
640?wx_fmt=png

第四步:创建LSTM层和超参数
640?wx_fmt=png
640?wx_fmt=png

第五步:万事俱备,可以输出了  
640?wx_fmt=png 5.645258, 5.5933948, 5.5533557, 5.527862 , 5.536109则为LSTM预测的ICBC 2019年9月23日至9月27日的股价。
 

三、 
ARIMA与LSTM预测结果对比

1工行股价预测值与真实值对比

工行股价
LSTM预测值
ARIMA预测值
实际值
2019/9/23
5.645258
5.533711
5.52
2019/9/24
5.593395
5.539133
5.52
2019/9/25
5.553356
5.545886
5.52
2019/9/26
5.527862
5.548225
5.56
2019/9/27
5.536109
5.543076
5.58
640?wx_fmt=png

2外币对美元日兑换率预测值与真实值对比

外币对美元日兑换率
LSTM预测值
ARIMA预测值
实际值
1998/12/24
1.798039
1.675239
1.684
1998/12/25
1.721841
1.675217
1.6793
1998/12/26
1.696460
1.675475
1.6707
1998/12/27
1.692524
1.675466
1.6765
1998/12/28
1.690321
1.675580
1.667
640?wx_fmt=png

3沪深300指数交易额预测值与真实值对比

沪深300指数交易额
LSTM预测值
ARIMA预测值
实际值
2015/6/15
2,588,379
4,355,696
4,757,457
2015/6/16
4,153,069
4,388,063
4,116,756
2015/6/17
4,214,358
4,298,799
3,971,242
2015/6/18
3,886,355
4,413,317
3,643,958
2015/6/19
4,167,379
4,582,995
3,581,047
640?wx_fmt=png

例1和例2的真实值波动比较小,例3的数据波动比较大。
例1例2是ARIMA更接近真实值,例3除了第一天结果LSTM差距较大,
剩下四天都是LSTM的预测结果更接近。

从结果来看,当数据波动不大时,用ARIMA模型比LSTM要更好。而当数据变化比较大时,ARIMA的预测效果就不如LSTM了。

个人理解ARIMA原理时滑动平均和自回归,所以预测的结果都和历史的平均值比较接近,当真实值波动不是很剧烈是,用ARIMA预测可能更适用。

而神经网络LSTM由于对于过往数据都会存到‘记忆神经’,也就是遗忘门,输入门,输出门中。 也就不是只简单看一个平均,所以预测可能会激进偏颇一点,但是对于原始数据波动比较大时,可能效果更好。

简单的结论就是: 原始数据波动不大(例如稳定股票每天价格,汇率等),建议用ARIMA模型。原始数据波动较大(例如每天成交额,购买额),建议用神经网络预测效果更好。

后续: 记得原来单位的高手,用神经网络时先做一个标记,把所有假期,周末标记出来再训练预测,这样的效果肯定比我直接用更好。个人感觉我在ARIMA与LSTM的代码水平需要进一步提升可能结论效果更有说服力,下一步要继续努力吧。

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

640?wx_fmt=jpeg

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值