点击上方“趣味数据周刊”关注公众号
文章期号:201901007
方法对比显优劣
前言:时间序列算是我接触的第一个统计学实践项目,也是它把我带进了机器学习的大门。当时的我的工作是根据过往投资和赎回量,每天预估一个需要留的钱,有点类似银行准备金。我本想自己写个代码,无奈能力不足,最后让算法工程师帮我写了一套,每天预测准确率大约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模型开头有下载办法。
#导入下载的数据wxplot(x);
第三步:对差分序列性质进行考察
#对差分序列性质考察plot(diff(x))acf(diff(x))pacf(diff(x))
结果如下图:
第四步:水平相关信息提取,拟合ARIMA(5,1,2)模型
#这个例子用的ARIMA(5,1,2),也可以用auto.arima来建立模型x.fitx.fit
第五步:残差白噪声检验
for (i in 1:2) print(Box.test(x.fit$residual,lag=6*i))
输出的P值还不错。
第六步:水平预测,并绘制预测图
x.forex.foreplot(x.fore)
这里 Point Forecast 一列就是对未来5天的预测结果。而后面Lo 80、Hi 80组成的区间,意思是有80%的落在区间内。95%同理。
可以看到,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 pdimport matplotlib.pyplot as pltimport datetimeimport osimport torchimport torch.nn as nnimport numpy as npfrom torch.utils.data importDataset, DataLoader
第二步:
利用tushare包去下载最近两年ICBC的的历史股票行情
第三步:数据预处理
第四步:创建LSTM层和超参数
第五步:万事俱备,可以输出了
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 |
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 |
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 |
例1和例2的真实值波动比较小,例3的数据波动比较大。
例1例2是ARIMA更接近真实值,例3除了第一天结果LSTM差距较大,
剩下四天都是LSTM的预测结果更接近。
从结果来看,当数据波动不大时,用ARIMA模型比LSTM要更好。而当数据变化比较大时,ARIMA的预测效果就不如LSTM了。
个人理解ARIMA原理时滑动平均和自回归,所以预测的结果都和历史的平均值比较接近,当真实值波动不是很剧烈是,用ARIMA预测可能更适用。
而神经网络LSTM由于对于过往数据都会存到‘记忆神经’,也就是遗忘门,输入门,输出门中。
也就不是只简单看一个平均,所以预测可能会激进偏颇一点,但是对于原始数据波动比较大时,可能效果更好。
简单的结论就是:
原始数据波动不大(例如稳定股票每天价格,汇率等),建议用ARIMA模型。原始数据波动较大(例如每天成交额,购买额),建议用神经网络预测效果更好。
后续:
记得原来单位的高手,用神经网络时先做一个标记,把所有假期,周末标记出来再训练预测,这样的效果肯定比我直接用更好。个人感觉我在ARIMA与LSTM的代码水平需要进一步提升可能结论效果更有说服力,下一步要继续努力吧。
推荐阅读:
探索时间序列,预测未来
《哪吒之魔童降世》:异化让人成魔
一个公式缓解 你99%的蕉绿