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):
#Habilita o pacote quantmod library(quantmod)
#Cria um novo ambiente para armazenar os dados stockData <- new.env()
#Especifica as datas de interesse startDate = as.Date("2011-01-01") endDate = as.Date("2011-12-31")
#Obtêm os dados do ativo PETR4 e PETR3 getSymbols("PETR4.SA", src="yahoo",from=startDate,to=endDate)
#Calcula o log-retorno retorno<-na.omit(diff(log(Cl(PETR4.SA))))Para o método NFHS com $\lambda=0.05$ tem-se:
#Estima o VaR pelo método NFHS (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.FHS <- garchFit( ~garch(1, 1), fit.res , cond.dist = "norm") sresi<-(modelo.N.FHS@residuals/modelo.N.FHS@sigma.t)
#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]
#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
#Passo4: Calcular o VaR VaR.t1<- -quantile(Retornos, lambda) VaR.t1O valor do $VaR_{0.05}=0.0006525116$ o que significa que com base nos dados da PETR4 entre 01/01/2011 até 31/12/2011 a probabilidade de se obter um retorno menor do que 0.06% é de 5%. Usando o método STFHS:
#Estima o VaR pelo método STFHS (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.FHS <- garchFit( ~garch(1, 1), fit.res , cond.dist = "sstd") sresi<-(modelo.N.FHS@residuals/modelo.N.FHS@sigma.t)
#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]
#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
#Passo4: Calcular o VaR VaR.t1<- -quantile(Retornos, lambda) VaR.t1O valor do VaR obtido aqui aproximadamente igual ao obtido pelo método NFHS $VaR_{0.05}=0.0006524376$ o que significa que com base nos dados da PETR4 entre 01/01/2011 até 31/12/2011 a probabilidade de se obter um retorno menor do que 0.06% é de 5%. Utilizando a abordagem paramétrica de valores extremos, temos para o método NEVT:
#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)
#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]
#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]
mu<- MLE@fit$par.ests[2]
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.t1O VaR obtido para o método NEVT foi de $0.0006521597$ e a interpretação é análoga aos exemplos anteriores. Por fim, o cálculo do VaR usando o método STEVT:
#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)
#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]
#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]
mu<-MLE@fit$par.ests[2]
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.t1O VaR obtido para o método STEVT foi de $0.0006521516$. Graficamente, temos: O código para a criação do gráfico de barras é:
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)))