R语言做滚动garch模型 roll-garch model
前几天帮人做了一个滚动garch模型,刚开始那个人没搞清楚,走了很多弯路,最后终于搞好了,主要就是没有有效的沟通好。
接下来就是分析我写roll-garch的思路。
其实roll-garch模型在rugarch
里面其实是有的。但是,我也看了开发者写的文档,如果你希望更快,更复杂的滚动garach模型,你就要自己写函数。我的天,我哪里会,其实我连garch模型都没搞懂,但是我会代码。
和客户交流搞懂了,他想要的滚动garch是什么样子的:
用第1天到第100天真实数据预测第101天数据。
用第2天到第101天真实数据预测第102天数据。
用第3天到第102天真实数据预测第103天数据。
……
以此类推,他就是窗口为100,预测这个窗口下一天的sigma
和series
。后来想了一下这不是很简单么。
思路
就是选择1-100真实数据然后预测1期的,选择2-201真实数据预测1期的…………。
说干就干。
library(rugarch)
library(tseries)
library(zoo)
library(readxl)
library(quantmod)
raw_data <- read_xlsx('沪深300交易日收益率.xlsx')
time<-as.Date(raw_data$'date',format="%Y/%m/%d")
return<-raw_data$'return'
data<-zoo(return,time)
chartSeries(data)
前面几个是加载包,然后读取数据,改一下数据的时间格式,将数据设置为zoo
类型的数据,然后把或者数据画出来。
接下来就是一个函数,这个函数只要给定一个连续的100个,然后就可以吐出下一天的sigma
和series
。
my_series_sigma <- function(i) {
library(rugarch)
data_temp <- data[(i):(99 i)]
ug_spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)), #这个是必须要加
mean.model = list(armaOrder = c(0, 1)), #这个不要随便改,不然有错误
distribution.model = "std")
ugfit <- ugarchfit(ug_spec, data = data_temp)
fit_temp <- ugarchforecast(ugfit, data = data_temp, n.ahead = 1)
temp_data <- data.frame(t(fit_temp@forecast[["sigmaFor"]]),t(fit_temp@forecast[["seriesFor"]]))
colnames(temp_data) <- c("sigma", 'series')
return(temp_data)
}
上面代码什么意思??
一行一行解释:
library(rugarch)
这个虽然已经加载过了,但是我想用并行运算(用for多没面子哇)。并行运算下面各个子群对这个原始的环境里面加载的包是不继承的。所以必须在环境里面重新加载。data_temp <- data[(i):(99 i)]
这句话是说,截取data这个数据的第i
到i 99
个赋值给data_temp
,其实如果上过大学都知道,这个长度刚好是100。ug_spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)), #这个是必须要加 mean.model = list(armaOrder = c(0, 1)), #这个不要随便改,不然有错误 distribution.model = "std")
。这个里面不要介绍了,这都不知道,还咋用garch。
variance.model = list(model = "sGARCH", garchOrder = c(1, 1)
一般这个都这样设置。mean.model = list(armaOrder = c(0, 1))
这个之所以是这样设置,是根据你数据的arima来的,在做之前还要做很多检验。
distribution.model = "std"
这个也都是这样设置的,具体啥原因,我也不知道。ugfit <- ugarchfit(ug_spec, data = data_temp)
这步是拟合模型,fit_temp <- ugarchforecast(ugfit, data = data_temp, n.ahead = 1)
这步是拟合模型后,预测下一个。
temp_data <- data.frame(t(fit_temp@forecast[["sigmaFor"]]),t(fit_temp@forecast[["seriesFor"]])) colnames(temp_data) <- c("sigma", 'series') return(temp_data)
这句话是说提取预测里的sigmaFor
变量和seriesFor
变量。然后保存为数据框格式。
并行运算
为了加快数据,使用parallel,这样快哇,代码如下:
library(doParallel)
cl <- makeCluster(detectCores())
registerDoParallel(cl) #注册并开始并行计算
result_parallel <- foreach(x=c(1:(2919-100 1)),.combine='rbind') %dopar% my_series_sigma(x)
stopCluster(cl)
write.csv(result_parallel, file = "my_result_sigma_series.csv")
解释一下为什么是2919-100 1,这个其实很简单,因为我这个data就是2919这么长,然后2919-100 1就代表移动这么多次。这个是很简单的计算题啦。
for循环,
有些人可能喜欢for循环:
代码如下:
# 下面这段for循环代码太慢了,用并行计算
# result_1 <- data.frame()
#
# for (i in c(1:(2919-100 1))) {
#
# data_temp <- data[(i):(99 i)]
# ug_spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
# mean.model = list(armaOrder = c(0, 1)),
# distribution.model = "std")
# ugfit <- ugarchfit(ug_spec, data = data_temp)
# fit_temp <- ugarchforecast(ugfit, data = data_temp, n.ahead = 1)
#
# temp_data <- data.frame(t(fit_temp@forecast[["sigmaFor"]]),t(fit_temp@forecast[["seriesFor"]]))
# colnames(temp_data) <- c("sigma", 'series')
# cat(round(i/(2919-100 1), 3), '\t')
# result_1 <- rbind(result_1, temp_data)
#
# }
github
https://github.com/yuanzhoulvpi2017/plot_data/tree/master/roll_garch