似乎突如其来,似乎合情合理,我们和巴菲特老先生一起亲见了一次,又一次,双一次,叒一次的美股熔断。身处历史的洪流,渺小的我们会不禁发问:那以后呢?还会有叕一次吗?于是就有了这篇记录:利用ARIMA模型来预测美股的走势。

1. Get Train Dataset and Test Dataset


本例子简单地以2020年第一季度的道指的收盘价为数据集(数据来源雅虎财经),将前面95%的数据用作本次预测的训练集,后面5%的数据用作本次预测的测试集。

library(quantmod)
stock <- getSymbols("^DJI", from="2020-01-01", from="2020-03-31", auto.assign=FALSE)
names(stock) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
stock <- stock$Close
stock <- na.omit(stock)
train.id <- 1: (0.95*length(stock))
train <- stock[train.id]
test <- stock[-train.id]

2. Stationarity Test


由于ARIMA预测要求输入数据为平稳时间序列。如果输入数据为非平稳时间序列,则需要对数据进行平稳化处理。识别数据集是否为平稳时间序列,本例子用了两种方法:1)简单粗暴的观察法;2)白噪声检验。

其实对于多次熔断向下再向下的道指来说,撇开各种观察和检验的方法,我们都知道他一定是非平稳时间序列了。下面两种方法就是打个版:当我们遇到不太明显的时间序列时可以怎么做?

2.1 Observational Method

下图断崖式下降的曲线表明训练集为非平稳时间序列。

library(ggplot2)
library(scales)
plot<-ggplot(data=train) +
geom_line(aes(x=as.Date(Index), y=Close), size=1, color="#0072B2")+
scale_x_date(labels=date_format("%m/%d/%Y"), breaks=date_breaks("2 weeks"))+
ggtitle("Dow Jones Industrial Average") +
xlab("")+
theme_light()
print(plot)

2.2 Ljung‐Box Statistics Test

利用 Ljung–Box test 得到 p-value = 2.2e-16 < 0.05, 由此拒绝时间序列为白噪声的假设。

Box.test(train, lag=1, type = "Ljung-Box")

3. Differencing


上述我们可知本训练集为非平稳时间序列,所以我们利用差分对它进行平稳化处理。对训练集分别进行一阶差分和二阶差分后,从下图其实并不能很容易看出一阶差分以及二阶差分是否为平稳序列。于是我们对其进行了ADF检验。从检验结果可知:
原序列:p-value = 0.5336 > 0.05,拒绝它是平稳序列的假设;
一阶差分:p-value = 0.4495 > 0.05,拒绝它是平稳序列的假设;
二阶差分:p-value = 0.01 所以我们将利用其二阶差分序列进行ARIMA预测。

library("tseries")
train.diff1 <- diff(train, lag = 1, differences = 1)
train.diff2 <- diff(train, lag = 1, differences = 2)
adf.test(train)
adf.test(na.exclude(train.diff1))
adf.test(na.exclude(train.diff2))

4. ARIMA Model


4.1 Choosing the order

当我们确定用二阶差分序列进行预测后,则需要对模型进行定阶。如下图所示,对于ACF,滞后1-2阶在2倍标准差外,所以q=2;对于PACF,同样也是滞后1-2阶都在2倍标准差外,所以p=2,所以将会选择模型ARIMA(2,2,2)。

acf <- acf(na.omit(train.data.diff2$Close), plot=TRUE)
pacf <- pacf(na.omit(train.data.diff2$Close), plot=TRUE)



为了保证选择的模型是最优的,建议可以多选择接近的模型,然后根据AIC准则或者BIC准则选取最优的模型。比如利用自动定阶的方法,得出一个模型ARIMA(1,1,0)

library(forecast)
auto.arima(train.data,trace=TRUE) #Best model is ARIMA(1,1,0)

经过比较发现还是模型ARIMA(2,2,2)较优:

data.autofit<-arima(train.data,order=c(1,1,0))
AIC(data.autofit)
BIC(data.autofit)
data.fit<-arima(train.data,order=c(2,2,2))
AIC(data.fit)
BIC(data.fit)
Model AIC BIC
ARIMA(1,1,0) 930.5894 934.6755
ARIMA(2,2,2) 919.8881 930.0149
4.2 Model Validation

对拟合残差进行白噪声检验,得到p-value = 0.8221 > 0.05,而且acf在lag=1后迅速减小,可得残差为白噪声。

forecast <-forecast(data.fit, h=4, level=c(99.5))
forecast.data <- data.frame("Date"=index(train), "Input"=forecast$x, "Fitted"=forecast$fitted, "Residuals"=forecast$residuals)
acf(forecast.data$Residuals)
Box.test(forecast.data$Residuals, lag=sqrt(length(forecast.data$Residuals)), type = "Ljung-Box")



我们将训练集数据和拟合数据同时画在图上,可以看到两者的差别是在可接受范围的。

4.3 Forecast and Test Data

将预测结果与测试集对比,两者的最大相对误差为 0.056,可见模型是表达充分的,预测结果良好。



5. Forecast


上述已经找到合适的预测模型了, 于是就可以用这个模型ARIMA(2,2,2)来预测未来5天的道指走势了。预测未来道指将在22000波动,均值微跌(呈下跌趋势),波动范围为16000-26000左右。简单说,这个模型的预测是前景不容乐观。

data.forecast<-arima(stock,order=c(2,2,2))
newforecast<-forecast(data.forecast, h=5, level=c(99.5))



R与金钱游戏:美股与ARIMA模型预测的更多相关文章

  1. 【R实践】时间序列分析之ARIMA模型预测___R篇

    时间序列分析之ARIMA模型预测__R篇 之前一直用SAS做ARIMA模型预测,今天尝试用了一下R,发现灵活度更高,结果输出也更直观.现在记录一下如何用R分析ARIMA模型. 1. 处理数据 1.1. ...

  2. R与金钱游戏:均线黄金交叉2

    从上一篇分析已经得知均线黄金交叉原则并不适用于震荡期,那有什么办法可以规避震荡期呢或者说有什么办法可以减少无脑跟的损失?我们继续玩一下. Required Packages library(quant ...

  3. 用R做时间序列分析之ARIMA模型预测

    昨天刚刚把导入数据弄好,今天迫不及待试试怎么做预测,网上找的帖子跟着弄的. 第一步.对原始数据进行分析 一.ARIMA预测时间序列 指数平滑法对于预测来说是非常有帮助的,而且它对时间序列上面连续的值之 ...

  4. R与金钱游戏:均线黄金交叉1

    双11临近的我发现自己真的很穷很穷很穷(重要的问题说三遍)-- 贫穷催人上进.于是我就寻思着在空闲时间自己捣鼓一下钱生钱的游戏是怎么玩的,毕竟就算注定做韭菜也要做一根有知识有理想的韭菜. 第一个要玩的 ...

  5. R语言的ARIMA模型预测

    R通过RODBC连接数据库 stats包中的st函数建立时间序列 funitRoot包中的unitrootTest函数检验单位根 forecast包中的函数进行预测 差分用timeSeries包中di ...

  6. 不知道怎么改的尴尬R语言的ARIMA模型预测

    数据还有很多没弄好,程序还没弄完全好. > read.xlsx("H:/ProjectPaper/论文/1.xlsx","Sheet1") > it ...

  7. Redhat 5.8系统安装R语言作Arima模型预测

    请见Github博客:http://wuxichen.github.io/Myblog/timeseries/2014/09/02/RJavaonLinux.html

  8. 时间序列分析之ARIMA模型预测__R篇

    http://www.cnblogs.com/bicoffee/p/3838049.html

  9. ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数

    https://www.cnblogs.com/bradleon/p/6827109.html 文章里写得非常好,需详细看.尤其是arima的举例! 可以看到:ARIMA本质上是error和t-?时刻 ...

随机推荐

  1. async/await实现图片的串行、并行加载

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Java基础--冒泡排序算法

    冒泡排序算法的运作如下:(从后往前) 比较相邻的元素,如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的元素. 针对 ...

  3. Python3关于current_app传递给子线程

    在学习Flask的时候,<Flask Web开发>这本书中有一个异步发送email的例子,其中用到了线程 from . import mail,create_app def send_as ...

  4. 微服务优化之使用gRPC做微服务的内部通信

    使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSO ...

  5. ffmpeg 编程常用 pcm 转 aac aac 转 pcm mp4 h264解码

    ffmpeg 是现在开源的全能编解码器,基本上全格式都支持,纯 c 语言作成,相对比其它的 VLC ,GStreamer glib2 写的,开发更简单些,文档很棒,就是 examples 比较少. 常 ...

  6. PHP把图片存入数据库(非路径)【待测试】

    大部分人的图片上传都是保存一个路径到数据库,这样在插入时确实快,也符合web的特点,但是在删除时就很麻烦,需要找到文件并删除,该代码能够把代码直接存入数据库,删除时一并删除.请注意:这样的话数据库大小 ...

  7. Golang package轻量级KV数据缓存——go-cache源码分析

    作者:Moon-Light-Dream 出处:https://www.cnblogs.com/Moon-Light-Dream/ 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文 ...

  8. 使用pyecharts绘制词云图-淘宝商品评论展示

    一.什么是词云图? 词云图是一种用来展现高频关键词的可视化表达,通过文字.色彩.图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息. 制作词云图的网站有很多,简单方便,适合小批量操作. BI ...

  9. Netty源码分析之ChannelPipeline—出站事件的传播

    上篇文章中我们梳理了ChannelPipeline中入站事件的传播,这篇文章中我们看下出站事件的传播,也就是ChannelOutboundHandler接口的实现. 1.出站事件的传播示例 我们对上篇 ...

  10. Hadoop集群搭建(三)~centos6.8网络配置

    安装完centos之后,进入系统,进行网络配置.主要分为五个部分: 修改虚拟机网络编辑器:配置Winodws访问虚拟机:配置centos网卡:通过网络名访问虚拟机配置网络服务. (一)虚拟机网络编辑器 ...