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.

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)))

Nenhum comentário:

Postar um comentário