R语言做滚动garch模型rollgarchmodel

1 篇文章 0 订阅

R语言做滚动garch模型 roll-garch model

前几天帮人做了一个滚动garch模型,刚开始那个人没搞清楚,走了很多弯路,最后终于搞好了,主要就是没有有效的沟通好。
接下来就是分析我写roll-garch的思路。

其实roll-garch模型在rugarch里面其实是有的。但是,我也看了开发者写的文档,如果你希望更快,更复杂的滚动garach模型,你就要自己写函数。我的天,我哪里会,其实我连garch模型都没搞懂,但是我会代码。

和客户交流搞懂了,他想要的滚动garch是什么样子的:

用第1天到第100天真实数据预测第101天数据。

用第2天到第101天真实数据预测第102天数据。

用第3天到第102天真实数据预测第103天数据。

……

以此类推,他就是窗口为100,预测这个窗口下一天的sigmaseries。后来想了一下这不是很简单么。

思路

就是选择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个,然后就可以吐出下一天的sigmaseries

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这个数据的第ii 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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanzhoulvpi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值