Ho codice che calcola correttamente il VaR basato su Extreme Value Theory utilizzando dati storici. Sto provando a eseguire questo stesso codice su più percorsi di prezzo simulati (cioè calcolando un VaR per ogni percorso) e quindi prendendo la mediana o la media di quei VaR.Value-at-Risk (teoria del valore estremo) utilizzando Monte Carlo Simulation in R
Ogni esempio che ho trovato in linea aveva la funzione di simulazione restituire il prezzo alla fine del periodo e quindi hanno replicato la funzione X per molte volte. Questo ha senso per me, tranne che essenzialmente ho bisogno di calcolare il value-at-risk per ogni percorso simulato. Di seguito è riportato il codice che ho finora. Posso dire che il codice funziona quando si utilizzano i dati storici (ad esempio la funzione "evt" funziona correttamente e il datatable viene popolato correttamente quando le linee lossOnly, u, evtVar non sono in una funzione). Tuttavia, ho cercato di implementare la simulazione nella seconda funzione e provare diverse combinazioni, che hanno tutte fallito.
library('RODBC')
library('nor1mix')
library('fExtremes')
library('QRM')
library('fGarch')
#function for computing the EVT VaR
evt <- function(data,u){
#fit excess returns to gpd to get estimates
gpdfit = tryCatch({
gpdfit <- gpdFit(data,u,type="mle")
}, warning = function(w) {
gpdfit <- gpdFit(data,u,type="mle",optfunc="nlminb")
return(gpdfit)
}, error = function(e) {
gpdfit <- gpdFit(data,u,type="pwm",optfunc="nlminb")
return(gpdfit)
}, finally = {})
#now calculate VaRs
xi <- [email protected]$par.ests["xi"]
beta <- [email protected]$par.ests["beta"]
Nu <- length([email protected]$exceedances)
n <- length(data)
evtVar95 <- (u+((beta/xi)*(((n/Nu)*.05)^(-xi) - 1.)))*100
evtVar99 <- (u+((beta/xi)*(((n/Nu)*.01)^(-xi) - 1.)))*100
evtVar997 <- (u+((beta/xi)*(((n/Nu)*.003)^(-xi) - 1.)))*100
evtVar999 <- (u+((beta/xi)*(((n/Nu)*.001)^(-xi) - 1.)))*100
#return calculations
return(cbind(evtVar95,evtVar99,evtVar997,evtVar999,u,xi,beta,Nu,n))
}
#data <- read.table("pricedata.txt")
prices <- data$V1
returns <- diff(log(prices)) #or returns <- log(prices[-1]/prices[-n])
xi <- mean(returns)
std <- sd(returns)
N <- length(prices)
lstval <- prices[N]
options(scipen = 999)
p <- c(lstval, rep(NA, N-1))
gen.path <- function(){
N <- length(prices)
for(i in 2:N)
p[i] <- p[i-1] * exp(rnorm(1, xi, std))
# plot(p, type = "l", col = "brown", main = "Simulated Price")
#evt calculation
#first get only the losses and then make them absolute
lossOnly <- abs(p[p<0])
#get threshold
u <- quantile(lossOnly, probs = 0.9, names=FALSE)
evtVar <- evt(lossOnly,u)
return(evtVar)
}
runs <- 10
sim.evtVar <- replicate(runs, gen.path())
evtVar <- mean(sim.evtVar)
#add data to total table
VaR <- c(evtVar[1],evtVar[2],evtVar[3],evtVar[4],evtVar[5],evtVar[6],evtVar[7],evtVar[8],evtVar[9])
DF <- data.frame(VaR, row.names=c("evtVar95","evtVaR_99","evtVaR_997","evtVaR_999","u","xi","beta","Nu","n"))
In breve, sto cercando di eseguire la funzione del valore a rischio (prima funzione) all'interno della funzione (seconda funzione) Montecarlo e cercando di mettere i valori medi simulati in un tabelle di dati. So che la prima funzione funziona, ma è la seconda funzione che mi sta facendo impazzire. Ci sono errori che sto ottenendo:
> sim.evtVar <- replicate(runs, gen.path())
Error in if (xi > 0.5) { : missing value where TRUE/FALSE needed
Called from: .gpdpwmFit(x, u)
Browse[1]> evtVar <- mean(sim.evtVar)
Error during wrapup: object 'sim.evtVar' not found
Browse[1]>
> #add data to total table
> VaR <- c(evtVar[1],evtVar[2],evtVar[3],evtVar[4],evtVar[5],evtVar[6],evtVar[7],evtVar[8],evtVar[9])
Error: object 'evtVar' not found
> DF <- data.frame(VaR, row.names=c("evtVar95","evtVaR_99","evtVaR_997","evtVaR_999","u","xi","beta","Nu","n"))
Error in as.data.frame.default(x[[i]], optional = TRUE) :
cannot coerce class ""function"" to a data.frame
Qualsiasi aiuto tu possa fornire è molto apprezzato! Grazie in anticipo!