Engle e Manganelli (2004) sugerem quatro possíveis funções para a estimação do CAViaR:
- Adaptive: $VaR_{t}=VaR_{t-1}+\beta_{1}\left\{\left[1+\exp\left(G\left[y_{t-1}-VaR_{t-1}\right]\right)^{-1}\right]-\tau\right\}$.
- Symmetric absolute value: $VaR_{t}=\beta_{1}+\beta_{2}VaR_{t-1}+\beta_{3}|y_{t-1}|$.
- Asymmetric slope: $VaR_{t}=\beta_{1}+\beta_{2}VaR_{t-1}+\beta_{3}(y_{t-1})^{+}+\beta_{4}(y_{t-1})^{-}$.
- Indirect GARCH(1, 1): $VaR_{t}=\left(\beta_{1}+\beta_{2}VaR_{t-1}^{2}+\beta_{3}y_{t-1}^{2}\right)^{1/2}$
onde $y_{t}$ é o retorno do ativo no tempo $t$ com $t=1,\dots, T$. $G$ é uma constante positiva (Engle e Manganelli (2004) sugerem $G=10$), $\tau$ é o nível do VaR desejado (usualmente $\tau=0.01$ ou $\tau=0.05$) e $(x)^{+}=\max(x,0)$ e $(x)^{-}=-\min(x,0)$
Como as funções são recursvivas é necessário uma primeira estimativa para o $VaR_{t=1}$. Considerando os mesmos dados de Engle e Manganelli (2004) os quais trabalharam com os retornos dos preços das açoes da GM, IBM e SP500 para Abril 7, 1986 até Abril 7, 1999, podemos obter a primeira estimativa de $VaR_{t=1}$ como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #Limpa os workspace rm (list= ls ()) #Lê os dados stocks<- read.table ( "dataCAViaR.txt" ) colnames (stocks)<- c ( "GM" , "IBM" , "SP500" ) #Nível do VaR desejado tau<-0.05 #Divide a base em treinamento e validação train<-stocks[1:2892,] valid<-stocks[2893:3392,] #Criar o vetor de VaR VaR<- rep ( NA , nrow (train)) #Primeira estimativa VaR[1]<- - qnorm (tau)* sd (train$GM) |
1 2 3 4 5 6 7 8 9 10 11 12 | #Sugestão Engle e Manganelli (2004) G<-10 #Function adpatative<- function (x){ beta1<-x[1] for (i in 2: nrow (train)){ VaR[i]<- VaR[i-1] + beta1*((1+( exp (G*(train[i-1, "GM" ] - VaR[i-1]))^(-1)))-tau) } #Objective Function res<- sum ((tau-(train$GM < VaR))*(train[, "GM" ]-VaR))/ nrow (train) return (res) } |
1 2 3 4 | #Realiza a otimização usando o métood de Brent res<- optim (par= c (0), adpatative, method= "Brent" , lower= c (-10), upper= c (10)) #Resultado do parâmetro de interesse beta<-res$par |
1 2 3 4 5 6 7 8 9 10 11 | VaR<- rep ( NA , nrow (dados)) VaR[1]<- - qnorm (tau)* sd (dados[, "GM" ]) #Previsão do CAViaR adpatativeForecast<- function (x){ beta1<-x[1] for (i in 2: nrow (dados)){ VaR[i]<- VaR[i-1] + beta1*((1+( exp (G*(dados[i-1, "GM" ]-VaR[i-1]))^(-1)))-tau) } #Objective Function return (VaR) } |
1 2 3 4 5 6 | #Base de treinamento dados<-train #Faz a previsão VaR.train<- adpatativeForecast (beta) #Medida de acuracia hits mean (dados$GM< -VaR.train)-tau |
O mesmo processo pode ser realizado para as demais funções.