【发布时间】:2022-01-17 01:06:35
【问题描述】:
我和我的同事有一个任务要提交,并附上以下说明:
-
在不使用任何内置 R 函数的情况下,编写一个通用函数来估计时间序列的 GARCH(1,1),并返回参数、标准误差和过滤后的方差过程。
-
下载 15 年的每日 SP500 数据并估计 GARCH 模型。
-
使用估计参数和过滤后的波动率来模拟 30 天预测期的 95% 置信区间。在您的示例中每天执行此操作。
-
验证提前 30 天的实现违反置信区间的频率。 Makeanice 情节。
我们代码中的主要问题是 optim 函数似乎存在错误,我们不知道如何修复它。由于这个问题,我们找不到标准误差(因为它会从 optim 函数中的 hessian 派生而来)。我们希望您能帮助我们。谢谢你。 请注意,“h”指的是方差。 “ster”是指“标准错误”。
请在下面附上代码:
#R PROJECT GARCH(1,1) MODEL written by Alice, Christian and Diana
#S&P 500 data from 01.01.2005 to 31.12.2021
library(xts)
library(ggplot2)
library(readr)
library(quantmod)
library(cvar)
SPX1 <- getSymbols("^GSPC",auto.assign = FALSE, from = "2005-01-01", to="2021-12-31")
SPX_Adj <- SPX1$GSPC.Adjusted
#SP500 <- read_csv("SP500.csv", col_types = cols(Close = col_number(), Date = col_character()))
#View(SP500)
#BETTER FITTING THE DATA FOR OUR WORK
SP500log <- as.data.frame(log10(SPX_Adj[,1]))
N <- length(SP500log[,1])
SP500_ret <- ((SP500log[2:N,]-SP500log[1:N-1,]))
x <- SP500_ret
#WRITING THE GARCH (1,1) FUNCTION
GARCH <-function(para,x){
# Volatility and loglik initialisation
mu <- mean(x)
para <- c(0.2,0.8,0.15)
Beta0 <- para[1]
Beta1 <- para[2]
Beta2 <- para[3]
e <- x - mean(x)
e2 <- e^2
h <- c(0)
loglik=c(0)
# Start of the loop
vol=c()
for (t in 2:length(x)){
h[t]=Beta0+Beta1*e2[t-1]+Beta2*h[t-1]
ster <- sqrt(h[t]/N)
loglik[t]=loglik[t-1]+log(dnorm(x[t],mean(x[1:t]),sqrt(h[t])))
}
Ster <<- ster
H <<- h
return(tail(loglik,1))
}
paraoptim <- optim(para, GARCH, gr=NULL, method=c("BFGS"),lower = 0, upper = Inf, control = list(), hessian = FALSE, SP500_ret)
paraoptim$par
Beta0 <- paraoptim$par[1]
Beta1 <- paraoptim$par[2]
Beta2 <- paraoptim$par[3]
GARCH(para,SP500_ret)
#CONFIDENCE INTERVAL
data <- diff(h, lag=29)
ConfInt <- function(data, alpha=0.05) {
x <- x[!is.na(data)]
m <- mean(x)
z <- qnorm(1-alpha/2)
s <- sd(x)/sqrt(length(x))
CONFIDENCE <- c("inf"=m-z*s, "sup"=m+z*s)
return(CONFIDENCE)
}
ConfInt(data)
bounds <- ConfInt(data)
#
ValueAtRisk <- function(x){
VaR = c()
for (t in 1:length(x)) {
VaR[t] <- as.numeric(VaR(H[1:t], p=0.95, method=c("historical")))
}
return(VaR)
}
ValueAtRisk(SP500_ret)
VaRline <- (h/ValueAtRisk(SP500_ret))/1000
#
#PLOT
plot(SP500_ret, type = "l", col="blue", ylim = c(-0.08,0.05))
lines(VaRline)
【问题讨论】:
-
我们不能运行这个,因为 para(传递给 optim)没有定义。请在新的 R 实例中对此进行测试,以确保它可以被复制。
-
@G.Grothendieck 感谢您注意到这一点,我已经修复了参数。你现在能看到它们吗?
标签: r optimization prediction finance standard-error