【问题标题】:Optim function in RR中的优化函数
【发布时间】: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


【解决方案1】:

我换了

paraoptim <- optim(para, GARCH, gr=NULL, method=c("BFGS"),lower = 0, upper = Inf, control = list(), hessian = FALSE, SP500_ret)

para <- c(0.2,0.8,0.15)
paraoptim <- optim(para, GARCH, gr=NULL, method=c("BFGS"),lower = 0, upper = Inf, control = list(), hessian = FALSE, SP500_ret)
h<-H

您的代码将运行。

如果相信你的 2 个问题是

  1. 正如@G.Grothendieck 所指出的,您正在GARCH 函数中定义para 参数。因此它不是全局的,并且 garch 调用看不到 para。
  2. GARCH 创建 H,但您的后续调用使用 h。

【讨论】:

  • 完美! @JoeErinjeri 您知道如何“框定”x 轴吗?基本上我想在所有年份都显示在“索引”上方以显示每年的差异。但是,如果我点击与 GSPC 相关的 csv 文件,系统不会对“日期”列进行分类作为一个列本身,所以它就像它不可读......
  • 我不怎么用情节,所以不懂语法。但是用ggplot,试试。也请将问题标记为已回答。库(润滑)库(ggplot)plot_data%选择(日期)%>%变异(日期=ymd(日期))%>%变异(SP500_ret=SP500_ret[row_number ()]) ggplot(data=plot_data, aes(x=dates, y=SP500_ret, group=1)) + geom_line()
  • @fcm 由于 SPX1 的类是“数字”,对 plot 的调用将由 plot.default 处理,因此您将禁止使用 xaxt 绘制索引,然后调用 @ 987654327@ 功能。我猜你会想使用SP500 的索引作为labels 参数。请参阅 ?plot.default?axis 以及进一步了解基础绘图所需的任何“另请参阅”项目。
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多