似乎突如其来,似乎合情合理,我们和巴菲特老先生一起亲见了一次,又一次,双一次,叒一次的美股熔断。身处历史的洪流,渺小的我们会不禁发问:那以后呢?还会有叕一次吗?于是就有了这篇记录:利用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. C++走向远洋——31(六周,项目一,1.1)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:fenshu.cpp * 作者:常轩 * 微信公众号:World ...

  2. ado.net DataSet

    一.概念 DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataS ...

  3. Python中max()内置函数使用(list)

    在学习完列表和元组的基础知识后,做到一个题: 求出列表中频次出现最多的元素. 学习到了python内置函数max的用法 其参数key的用法 匿名函数lamda的用法 python内置函数max() m ...

  4. 【译】使用FormData对象

    系列文章说明 原文 FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对.它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据.其传输的数据格式和表单使用subm ...

  5. Electron打包H5网页为桌面运行程序

    一.安装配置环境 Electron(一种桌面应用程序运行时),Electron 把 Chromium 和 Node 合并到一个单独的运行时里面,很适合开发桌面 web 形式的应用程序,通过Node它提 ...

  6. yuchuan_Linux_C 编程之七系统IO函数

    一.整体大纲 二. 系统IO函数 1. 一些概念    文件描述符     PCB     C库函的IO缓冲区 1) 文件描述符            int 类型            一个进程最多 ...

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

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

  8. 处理asp.net core连接mysql的一个异常Sequence contains more than one matching element

    晚上在那里调程序,把mysql.data组件的nuget包进行了更新,前几天好好的程序,开始抛错,跟踪断点发现以下的异常: Unable to connect to any of the specif ...

  9. 项目测试中发现产品bug怎么办

    我所在的产品线,并非公司最大最强的产品 甚至为了推广我们这个产品,一般会拿给客户先免费试用 而在试用之前,是要经过一番通测的,测得很急,测得很快 所以产品bug非常多 那么在测试项目的时候,自然会发现 ...

  10. python基础学习day6

    代码块.缓存机制.深浅拷贝.集合 id.is.== id: 可类比为身份号,具有唯一性,若id 相同则为同一个数据. #获取数据的内存地址(随机的地址:内存临时加载,存储数据,当程序运行结束后,内存地 ...