SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.
Mostrando postagens com marcador Value at Risk. Mostrar todas as postagens
Mostrando postagens com marcador Value at Risk. Mostrar todas as postagens

quarta-feira, 29 de agosto de 2012

Value at Risk (VaR) usando o R.

Em matemática financeira e gestão de risco financeiro, a medida Value at Risk (VaR) é uma medida de risco utilizada para mensurar o risco de perda de uma determinada carteira de ativos financeiros.

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.t1
O 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.t1
O 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.t1
O 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.t1
O 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)))