O VaR é definido como um valor limite tal que a probabilidade de perda daquele valor para a carteira ao longo do horizonte de tempo for superior a este valor de risco o qual é o nível de probabilidade determinado.
Por exemplo, se uma carteira de ações tem um VaR de um dia de 5% igual a 1 milhão de reais, há uma probabilidade de 0,05 de que a carteira caia a um valor superior 1 milhão de reais em um período de um dia.
O VaR tem quatro principais usos em finanças: gestão de riscos, controle financeiro e relatórios financeiros. VaR é por vezes utilizado em aplicações não-financeiras também.
Segundo Alexander (2009) os principais métodos de estimação do VaR são:
- NFHS: Normal Filtered Historical Simulation.
- STFHS: Student´s T Filtered Historical Simulation.
- NEVT: Normal Extreme Value.
- STEVT: Student´s T Extreme Value.
Considere o ativo PETR4 da Petrobrás para o ano de 2011 (01/01/2011 até 31/12/2011):
1 2 | #Habilita o pacote quantmod library (quantmod) |
1 2 | #Cria um novo ambiente para armazenar os dados stockData <- new.env () |
1 2 3 | #Especifica as datas de interesse startDate = as.Date ( "2011-01-01" ) endDate = as.Date ( "2011-12-31" ) |
1 2 | #Obtêm os dados do ativo PETR4 e PETR3 getSymbols ( "PETR4.SA" , src= "yahoo" ,from=startDate,to=endDate) |
1 2 | #Calcula o log-retorno retorno<- na.omit ( diff ( log ( Cl (PETR4.SA)))) |
1 2 3 | #Estima o VaR pelo método NFHS (lambda=0.05) library (fGarch) lambda<-0.05 |
1 2 3 4 5 | #Passo1: Encotrando os resíduos padronizados fit<- arima (retorno,order= c (1,0,0)) fit.res<- resid (fit) modelo.N.FHS <- garchFit ( ~ garch (1, 1), fit.res , cond.dist = "norm" ) sresi<-(modelo.N.FHS@residuals/modelo.N.FHS@sigma.t) |
1 2 3 | #Passo2: Obtem-se sigma_t+1 e mu_t+1 mu.t1<- predict (fit, n.ahead=1)$pred[1] sigma.t1<- predict (modelo.N.FHS , n.ahead=1)[1,1] |
1 2 3 | #Passo3: Para o período t+1 gera-se um conjunto de Retornos uniforme<- ceiling ( runif (1000)* length (sresi)) Retornos<-(sresi[uniforme]*sigma.t1)+mu.t1 |
1 2 3 | #Passo4: Calcular o VaR VaR.t1<- - quantile (Retornos, lambda) VaR.t1 |
1 2 3 | #Estima o VaR pelo método STFHS (lambda=0.05) library (fGarch) lambda<-0.05 |
1 2 3 4 5 | #Passo1: Encotrando os resíduos padronizados fit<- arima (retorno,order= c (1,0,0)) fit.res <- resid (fit) modelo.N.FHS <- garchFit ( ~ garch (1, 1), fit.res , cond.dist = "sstd" ) sresi<-(modelo.N.FHS@residuals/modelo.N.FHS@sigma.t) |
1 2 3 | #Passo2: Obtem-se sigma_t+1 e mu_t+1 mu.t1<- predict (fit, n.ahead=1)$pred[1] sigma.t1<- predict (modelo.N.FHS , n.ahead=1)[1,1] |
1 2 3 | #Passo3: Para o período t+1 gera-se um conjunto de Retornos uniforme<- ceiling ( runif (1000)* length (sresi)) Retornos<-(sresi[uniforme]*sigma.t1)+mu.t1 |
1 2 3 | #Passo4: Calcular o VaR VaR.t1<- - quantile (Retornos, lambda) VaR.t1 |
1 2 3 4 5 6 7 8 9 | #Estima o VaR pelo método NEVT (lambda=0.05) library (fGarch) lambda<-0.05 #Passo1: Encotrando os resíduos padronizados fit<- arima (retorno,order= c (1,0,0)) fit.res <- resid (fit) modelo.N.EVT <- garchFit ( ~ garch (1, 1), fit.res , cond.dist = "norm" ) sresi<-(modelo.N.EVT@residuals/modelo.N.EVT@sigma.t) |
1 2 3 | #Passo2: Obtem-se sigma_t+1 e mu_t+1 mu.t1<- predict (fit, n.ahead=1)$pred[1] sigma.t1<- predict (modelo.N.EVT , n.ahead=1)[1,1] |
1 2 3 4 5 | #Passo3: Estima o quantil com base na distribuição GEV library (fExtremes) sresi.menos<- -sresi MLE<- gevFit (sresi.menos,type= "pwm" ) xi<- MLE@fit$par.ests[1] |
1 | mu<- MLE@fit$par.ests[2] |
1 2 3 4 5 6 | sigma<- MLE@fit$par.ests[3] #Passo4: Calcular o VaR quantil<- qgev (lambda, xi = xi, mu = mu, beta = sigma, lower.tail = TRUE ) VaR.t1<- -(mu.t1+quantil[1]*sigma.t1) VaR.t1 |
1 2 3 4 5 6 7 8 9 | #Estima o VaR pelo método STEVT (lambda=0.05) library (fGarch) lambda<-0.05 #Passo1: Encotrando os resíduos padronizados fit<- arima (retorno,order= c (1,0,0)) fit.res <- resid (fit) modelo.N.ST.EVT <- garchFit ( ~ garch (1, 1), fit.res , cond.dist = "sstd" ) sresi<-(modelo.N.ST.EVT@residuals/modelo.N.ST.EVT@sigma.t) |
1 2 3 | #Passo2: Obtem-se sigma_t+1 e mu_t+1 mu.t1<- predict (fit, n.ahead=1)$pred[1] sigma.t1<- predict (modelo.N.ST.EVT , n.ahead=1)[1,1] |
1 2 3 4 5 | #Passo3: Estima o quantil com base na distribuição GEV library (fExtremes) sresi.menos<- -sresi MLE<- gevFit (sresi.menos,type= "pwm" ) xi<- MLE@fit$par.ests[1] |
1 | mu<-MLE@fit$par.ests[2] |
1 2 3 4 5 6 | sigma<-MLE@fit$par.ests[3] #Passo4: Calcular o VaR quantil<- qgev (lambda, xi = xi, mu = mu, beta = sigma, lower.tail = TRUE ) VaR.t1<- -(mu.t1+quantil[1]*sigma.t1) VaR.t1 |
1 2 3 4 5 6 7 8 9 10 | VaR<- c (0.0006525116,0.0006524376,0.0006521597,0.0006521516)*100 mybarcol <- "gray20" barplot (VaR, beside = TRUE , + col = c ( "lightblue" , "mistyrose" , + "lightcyan" , "lavender" ), + legend = c ( "NFHS" , "STFHS" , "NEVT" , "STEVT" ), + main = "Value at Risk (VaR)" , font.main = 4, + sub = "Petr4" , col.sub = mybarcol, ylab= "% VaR" , + ylim= c ( min (VaR), max (VaR))) |