作者:李应硕,人大在读
授权转载 收藏順便 点个 赞 ,创作不易
前言:时间序列算是我接触的第一个统计学实践项目,也是它把我带进了机器学习的大门。当时的我的工作是根据过往投资和赎回量,每天预估一个需要留的钱,有点类似银行准备金。我本想自己写个代码,无奈能力不足,最后让算法工程师帮我写了一套,每天预测准确率大约90%。回头过了1年多我现在都不会,当时肯定写不出来了。正好这周末学习统计预测,上课老师讲的是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)
第三步:对差分序列性质进行考察
#对差分序列性质考察
plot(diff(x))
acf(diff(x))
pacf(diff(x))
结果如下图:
第四步:水平相关信息提取,拟合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))
输出的P值还不错。
第六步:水平预测,并绘制预测图
x.fore<-forecast(x.fit,h=5)
x.fore
plot(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 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 import Dataset, DataLoader
第二步:利用tushare包去下载最近两年ICBC的的历史股票行情
第三步:数据预处理
第四步:创建LSTM层和超参数
第五步:万事俱备,可以输出了
5.645258 , 5.5933948, 5.5533557, 5.527862 , 5.536109则为LSTM预测的ICBC 2019年9月23日至9月27日的股价。
三、ARIMA与LSTM预测结果对比
1、工行股价预测值与真实值对比
2、外币对美元日兑换率预测值与真实值对比
3、沪深300指数交易额预测值与真实值对比
沪深300指数交易额
例1和例2的真实值波动比较小,例3的数据波动比较大。例1例2是ARIMA更接近真实值,例3除了第一天结果LSTM差距较大,剩下四天都是LSTM的预测结果更接近。
从结果来看,当数据波动不大时,用ARIMA模型比LSTM要更好。而当数据变化比较大时,ARIMA的预测效果就不如LSTM了。个人理解ARIMA原理时滑动平均和自回归,所以预测的结果都和历史的平均值比较接近,当真实值波动不是很剧烈是,用ARIMA预测可能更适用。而神经网络LSTM由于对于过往数据都会存到‘记忆神经’,也就是遗忘门,输入门,输出门中。也就不是只简单看一个平均,所以预测可能会激进偏颇一点,但是对于原始数据波动比较大时,可能效果更好。
简单的结论就是:原始数据波动不大(例如稳定股票每天价格,汇率等),建议用ARIMA模型。原始数据波动较大(例如每天成交额,购买额),建议用神经网络预测效果更好。
后续:记得原来单位的高手,用神经网络时先做一个标记,把所有假期,周末标记出来再训练预测,这样的效果肯定比我直接用更好。个人感觉我在ARIMA与LSTM的代码水平需要进一步提升可能结论效果更有说服力,下一步要继续努力吧。
至此也感谢你的认真拜读,喜欢点个赞就好
感谢你的阅读,关注公.众.号:趣味数据周刊,后台回复:idw007,可以获取文章数据。 和志同道合的伙伴一起学习统计学,数据分析,机器学习,走向人生巅峰,有问题可以撩我;很乐意为你效劳。