Tag

var no r Archives - Análise Macro

Calculando o Value at Risk gaussiano no R

By | mercado financeiro

Uma das medidas de risco mais populares no mundo das finanças está representado no Value at Risk, ou popularmente conhecido como VaR. O VaR mensura a perda em valor monetário de um portfólio em um determinado horizonte de tempo, com base em um intervalo de confiança. Dentre as diversas possibilidades de cálculo do VaR, que depende tanto da forma que se encontram os dados, quanto o objetivo a ser alcançado, iremos ensinar no post de hoje o método do VaR gaussiano.

O VaR gaussiano é uma da formas mais simples que existem para se calcular o risco da perda monetária de um portfólio, assumindo que a distrubuição dos retornos seja normal. Portanto, para calcular o VaR nesse tipo de medida, necessitamos apenas do intervalo de confiança, da média dos retornos e o desvio padrão dos retornos. Seguimos a seguinte equação:

(1)   \begin{equation*}VaR_\alpha = -(\mu - \sigma * Z_\alpha) * I, \end{equation*}

onde \alpha é o nível de significância do VaR, \mu é média dos retornos, \sigma é o desvio padrão, Z_\alpha é o z-score baseado no nível de significância do VaR e I é o atual valor monetário do portfólio.

Vamos então realizar os cálculos do VaR.

library(tidyverse)
library(PerformanceAnalytics)
library(timetk)
library(quantmod)

Primeiro, iremos retirar os dados dos preços e calcular o retorno do portfólio, com base no peso de cada ativo.

# Define os ativos que irão ser coletados

tickers <- c("PETR4.SA", "ITUB4.SA", "ABEV3.SA", "JBSS3.SA")

# Define a data de início da coleta

start <- "2019-12-01"

# Realiza a coleta dos preços diários

prices <- getSymbols(tickers,
                     auto.assign = TRUE,
                     warnings = FALSE,
                     from = start,
                     src = "yahoo") %>% 
  map(~Cl(get(.))) %>% 
  reduce(merge) %>% 
  `colnames<-`(tickers)


# Calcula os retornos mensais

asset_returns <- Return.calculate(prices,
                                  method = "log") %>% 
  na.omit()


# Define os pesos

w <- c(0.50, 0.27, 0.13, 0.10)

# Calcula o retorno do portfolio baseado no peso de cada ativo

portfolio_return <- Return.portfolio(asset_returns,
                                      weights = w) %>% 
  `colnames<-`("port_returns")

# Calcula o retorno do portfolio com 1000 reais investidos

value <- cumprod(1 + portfolio_return) * 1000

Feito isso, podemos calcular o VaR. Devemos definir o valor monetário do nosso portfólio. Considerando que investimos 1000 reais no primeiro dia, sem aportar nenhum outro valor, temos que nosso portfólio até então chegou ao valor de 683,38 reais (podemos dizer que a montagem do portfólio não foi boa).

Em seguida, calculamos nosso VaR com base na média e no desvio padrão do portfólio. Utilizaremos dois níveis de significância para comparação: 1% e 5%.

# Calcula a média dos retornos

port_mean <- mean(portfolio_return)

# Calcula o desvio-padrão dos retornos

port_risk <- sd(portfolio_return)


# Calcula o Var gaussiano com 1% e 5% de significância

var_01 <- -(port_mean + port_risk * qnorm(0.01))

  
var_05 <- -(port_mean + port_risk * qnorm(0.05)) 


# Calcula o valor monetário com base na significância


value_01 <- round(last(value) * var_01)

value_05 <- round(last(value) * var_05)

Por fim, podemos comparar em um gráfico nosso VaR.

# Transforma em tibble

portfolio_return_tbl <- portfolio_return %>% 
  tk_tbl(preserve_index = TRUE,
         rename_index = "date")


# Plota o gráfico de densidade

ggplot(portfolio_return_tbl, aes(x = port_returns))+
  geom_density(color = "darkblue",
               size = .8)+
  geom_vline(xintercept = -var_01,
             linetype = "dotted",
             color = "red",
             size = 1)+
  annotate(geom = "text",
           x = -var_01,
           y = 6,
           label = paste("1% 1 Dia VaR", "R", value_01),
           color = "red",
           angle = 90,
           alpha = .8,
           vjust = -1.75)+
   geom_vline(xintercept = -var_05,
             linetype = "dotted",
             color = "black",
             size = 1)+
  annotate(geom = "text",
           x = -var_05,
           y = 6,
           label = paste("5% 1 Dia VaR", "R", value_05),
           color = "black",
           angle = 90,
           alpha = .8,
           vjust = -1)+
  theme_minimal()+
  labs(title = "Densidade de retornos do Portfólio",
       subtitle = "1% e 5% 1 Dia Gaussian Value at Risk",
       caption = "Dados: Yahoo Finance | Elaboração: analisemacro.com.br",
       x = "",
       y = "")

________________________

(*) Para entender mais sobre Mercado Financeiro e medidas de risco, confira nosso curso de R para o Mercado Financeiro.
________________________

Modelos VAR no R

By | Hackeando o R

Quem trabalha com modelagem e previsão provavelmente já teve que construir modelos baseados em vetores autorregressivos. Nessa Dicas de R - disponível toda quarta-feira aqui no blog da AM -vamos mostrar como é possível implementar esse tipo de modelo no R e utilizá-lo para fins de previsão. Essa aula, inclusive, faz parte do nosso novíssimo Curso de Previsão Macroeconométrica usando o R.

Em análises de séries temporais, é bastante comum considerar simultaneamente duas ou mais séries. Por exemplo, o nível de ociosidade da economia certamente tem influência sobre a taxa de crescimento dos preços, assim como um aumento da taxa de juros tem relação com a taxa de desemprego. Ademais, pode ser necessário em algumas ocasiões avaliar o quanto um choque em X_{t} afeta Y_{t}. Essas questões, bastante pertinentes no dia a dia, são tratadas dentro do que chamamos de análise multivariada de séries temporais. São objetivos básicos da análise multivariada de séries temporais:

  • Estudar as relações dinâmicas entre séries diversas;
  • Melhorar as previsões sobre uma variável específica.

Seja z_{t} = (z_{1t}, z_{2t}, ..., z_{kt})^{'} um vetor de dimensão k que contém séries temporais observadas em um período de tempo comum. Por exemplo, z_{1t} é o PIB trimestral brasileiro e z_{2t} é a taxa de desemprego também trimestral. Acaso, estudemos z_{1t} e z_{2t} conjuntamente poderemos verificar a dependência contenporânea e passada que existe entre essas duas variáveis. Poderemos verificar o quanto um choque no PIB afeta a taxa de desemprego e quanto tempo isso tende a durar. Analogamente, podemos estar interessados na relação entre a taxa de desemprego e a inflação.


desemprego = Quandl('BCB/24369', start_date='2012-03-01',
end_date='2018-12-01', order='asc', type='ts')
inflacao = Quandl('BCB/13522', start_date='2013-03-01',
end_date='2019-12-01', order='asc', type='ts')
data = data.frame(desemprego, inflacao)

A correlação entre as variáveis é -0,81, bastante elevada, mas isso, claro, não é o bastante para identificarmos a natureza da relação entre elas. Algumas questões devem ser levadas em consideração. Em primeiro lugar, para uma análise econométrica, precisamos definir se as séries são estacionárias. Essa primeira (grande) questão definirá o tipo de análise que faremos entre elas. Vamos supor que elas sejam estacionárias. Podemos, nesse caso, estimar um \textbf{Vetor Autoregressivo} de primeira ordem, de modo que:

(1)   \begin{align*} Unemployment_{t} = \delta_{1} + \gamma_{11}Unemployment_{t-1} + \gamma_{12}Inflation_{t-1} + \varepsilon_{1t} \\ Inflation_{t} = \delta_{2} + \gamma_{21}Inflation_{t-1} + \gamma_{22}Unemployment_{t-1} + \varepsilon_{2t} \end{align*}

O VAR(1) vai descrever a evolução dinâmica da interação entre a inflação e desemprego. Uma vez estimado esse modelo, poderemos nos perguntar se existe causalidade nessa relação, isto é, se inflação de fato ajuda a prever o desemprego, se o contrário ocorre ou se há uma simultaneidade. Nesse último caso, dizemos que existe uma causalidade bidirecional.

Ademais, esse tipo de análise também irá nos permitir estimar funções de impulso-resposta, onde analisamos a resposta a impulsos em uma das variáveis. Por exemplo, um choque no desemprego tem qual efeito sobre a inflação? E o caso contrário? Uma análise como essa pode ser muito interessante para avaliar a relação que existe entre duas ou mais variáveis, não é mesmo?

Um dos pressupostos, entretanto, do modelo acima é que as variáveis sejam estacionárias, no sentido que discutimos anteriormente. Isso significa que se essa hipótese for violada, teremos que partir para outro tipo de análise. No nosso Curso de Previsão Macroeconométrica usando o R, discutiremos a existência de cointegração entre duas ou mais variáveis, isto é, para o caso em que lidamos com séries não estacionárias, pode ser o caso de nos perguntarmos se existe uma relação entre de longo-prazo entre elas. Para o exemplo acima, se as séries não forem estacionárias, como de fato aparentam não ser, as mesmas podem estar relacionadas ao longo do tempo. Se for esse o caso, dizemos que as séries possuem uma tendência comum, o que nos permite avaliar a relação entre elas ao longo do tempo.

Para além disso, vamos agora ilustrar a aplicação de um modelo VAR a dados reais brasileiros. Estamos, por suposto, interessados em construir um modelo VAR que seja utilizado para fins de previsão da inflação mensal medida pelo IPCA. Para isso, vamos começar, como de praxe, carregando alguns pacotes.


### Pacotes
library(ggplot2)
library(forecast)
library(mFilter)
library(BETS)
library(vars)
library(scales)
library(gridExtra)
library(stargazer)

Os dados que precisaremos são coletados com uso do pacote \texttt{BETS} abaixo. Pegamos as séries de inflação, taxa Selic, taxa de câmbio e a produção industrial. Ademais, já tratamos as séries, preparando-as para o modelo VAR.


### Coletar os dados
inflacao <- BETSget(433)
selic <- BETSget(4189)
cambio <- BETSget(3697)
industria <- BETSget(21940)
# Transformações
dselic <- diff(selic)
dcambio <- diff(cambio)
# Criar e projetar hiato t+1
hp <- hpfilter(industria, freq=14400, type='lambda')
hiato <- ts(hp$cycle, start=start(industria), freq=12)
hiatof <- forecast(auto.arima(hiato, max.p=4, max.q=4,
seasonal = F), h=1, level=40)$mean
hiato <- ts(c(hiato, hiatof), start=start(industria), freq=12)
# Criar dummies sazonais
dummies <- window(ts(seasonaldummy(inflacao),
start=start(inflacao), freq=12), start=c(2007,01))
# Juntar séries
data <- window(ts.intersect(inflacao, dselic, dcambio, hiato),
start=c(2007,01))
colnames(data) <- c('inflacao', 'dselic', 'dcambio', 'hiato')

Um gráfico com as séries que utilizaremos é colocado abaixo.

Coletados e tratados os dados, o modelo VAR é então estimado com o código abaixo.


lag <- VARselect(data, lag.max=12, type='trend', season = 12)
var <- VAR(data, min(lag$selection), type='both', exogen = dummies)

Com o modelo em mãos, podemos gerar uma previsão como abaixo.


# Previsão
h <- 7
fvar <- stats::predict(var, n.ahead=h, ci=.4, dumvar=head(dummies,h))
fvar$fcst$inflacao

O output da previsão pode ser visto abaixo.

fcst lower upper CI
1 0.38 0.25 0.51 0.13
2 0.45 0.30 0.59 0.15
3 0.41 0.26 0.56 0.15
4 0.40 0.25 0.55 0.15
5 0.36 0.20 0.51 0.15
6 0.30 0.14 0.45 0.15
7 0.24 0.09 0.39 0.15

Esse tipo de modelagem é bastante utilizado entre profissionais que precisam de previsões acuradas no curto prazo para diversos tipos de variáveis. Ela é vista em detalhes nos nossos Cursos avançados de Macro Aplicada e de Análise de Séries Temporais.
____________________

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente