2016-05-09 43 views
5

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!

risposta

0

Credo che il problema è questa riga:

lstval <- prices[N] 

perché se si prende un prezzo delle azioni, che non può mai essere negativo, si produce un vettore vuoto in questa riga nella funzione:

lossOnly <- abs(p[p<0]) 

si dovrebbe cercare invece:

lstval <- min(returns) 

se si desidera che il più alto rendimento negativo del set di dati