Tag

value at risk Archives - Análise Macro

Value At Risk no R

By | mercado financeiro

O Value At Risk é uma importante medida de risco no mundo das finanças, que estima a probabilidade de perda monetária em um dado horizonte de tempo. Se tornou famosa por sua simplicidade e pelo fato de estimar as perdas ao longo do tempo dado um nível de confiança. Existem diversas formas de se calcular o VaR, e no post de hoje mostraremos duas formas, a forma gaussiana (normal) e a histórica.

Há diversos métodos para se calcular o VaR, dentre aqueles relativamente mais simples, que podem ser o ponto inicial para aqueles que estão iniciando os estudos e a prática com medidas de risco, até aqueles que possuem uma maior nível de complexidade. Como diversas outras medidas de risco, o cálculo do VaR deve ser feito a partir dos retornos dos ativos, mais comumente os retornos contínuos, por conta de suas medidas estatísticas.

Historical Value at Risk

A primeira forma de calcular o VaR que elencaremos aqui pode ser através do Historical VaR, que calcula a perda monetária com base em um nível de probabilidade dado um quantil do retornos negativos passados. Esse método é útil quando se obtém um nível grande de dados passados, ou seja, por definição é uma analise ex-post da distribuição de retorno.

    $$VaR = q_p$$

Em que $q_p$ é o quantil empírico dos retornos negativos da série.

Gaussian Value At Risk

Outra forma de calcular o VaR é assumindo que os seus retornos são normais, isto é, possui um distribuição Gaussiana

    $$R \sim N(\mu, \sigma)$$

. Deste modo, é necessário estimação da média dos retornos, a variância (e consequentemente o desvio padrão) e os retornos passados da série.

    $$VaR = -\overline{R} - \sqrt{\sigma}\bullet z_c$$

onde z_c é o quantil da distribuição normal

Outros métodos de estimação de VaR levam em consideração as características das séries de retornos, bem como outro meios estimação para a volatilidade e a média.

library(quantmod)
library(PerformanceAnalytics)
library(magrittr)
library(timetk)
library(ggplot2)

Para calcular o VaR devemos ter em mãos os retornos passados dos ativos.

# Retiramos os preços

tickers <- c("PETR4.SA", "VALE3.SA", "LAME3.SA")

env <- new.env()

getSymbols(tickers,
auto.assign = TRUE,
warnings = FALSE,
src = "yahoo",
env = env)

prices_list <- lapply(env, Ad)

prices <- do.call(merge, prices_list)


# Transformamos em log retornos

returns <- Return.calculate(prices, method = "log") %>%
na.omit() %>%
`colnames<-`(tickers)

Com os retornos diários em mãos, podemos utilizar o pacote {PerformanceAnalytics} para auxiliar no cálculo do VaR. A função VaR possibilita calcular a medida em diferentes métodos (no qual utilizaremos somente o historical e gaussian) e também a um dado nível de confiança. É possível também adicionar diferentes parâmetros na função, o que deixaremos para outro momento.

# utilizamos o Portfolio Analytics para calcular o VaR

## Historical

var_historical <- VaR(R = returns, p = 0.99, method = "historical")

var_historical

## Gaussian

var_gaussian <- VaR(R = returns, p = 0.95, method = "gaussian")

var_gaussian

É possível também juntar os retornos das ações em torno de um portfólio dentro da função, possibilitando conferir a contribuição de cada ativo para o risco. Para isso, definimos de forma aleatórias os pesos de cada ação e inserimos nos argumentos da função.


# Definimos os pesos do portfólio

w <- c(0.65, 0.15, 0.20)

# Calcula o VaR com o portfolio

VaR(returns, p = 0.99, weights = w,
portfolio_method = "component")

Uma forma interessante de averiguar os resultados dos diferentes métodos com diversos níveis de confiança, pode ser visto utilizando a função chart.VaRSensitivity.

chart.VaRSensitivity(R = returns$LAME3.SA,
methods = c("GaussianVaR",
"HistoricalVaR"))

Por fim, vemos através de um gráfico de densidade dos retornos onde a possibilidade de perda.


returns_tbl <- tk_tbl(returns,
preserve_index = TRUE,
rename_index = "date")

ggplot(returns_tbl, aes(x = LAME3.SA))+
geom_density(color = "darkblue",
size = .8)+
geom_vline(xintercept = var_historical[,"LAME3.SA"],
linetype = "dotted",
color = "red",
size = 1)+
annotate(geom = "text",
x = var_historical[,"LAME3.SA"],
y = 6,
label = paste("99% Historical VaR"),
color = "red",
angle = 90,
alpha = .8,
vjust = -1.75)+
geom_vline(xintercept = var_gaussian[,"LAME3.SA"],
linetype = "dotted",
color = "black",
size = 1)+
annotate(geom = "text",
x = var_gaussian[,"LAME3.SA"],
y = 6,
label = paste("95% Gaussian VaR"),
color = "black",
angle = 90,
alpha = .8,
vjust = -1)+
theme_minimal()+
labs(title = "Densidade de retornos da LAME3",
subtitle = "99% Historical Var e 95% Gaussian VaR",
caption = "Dados: Yahoo Finance | Elaboração: analisemacro.com.br",
x = "",

y = "")

________________________

(*) Para conhecer mais sobre medidas de risco do mundo das finanças, veja nossos de Cursos de Finanças Quantitativas.

________________________

Calculando o Historical VaR

By | mercado financeiro

O Historical Value at Risk é um método de calculo para mensurar da perda monetária de um determinado portfólio, utilizando como base os valores passados dos ativos e de seus respectivos retornos, criando uma série de Profits e Losses (P&L) que é tomada a um dado nível de intervalo para mensurar a perda potencial.

Assim como o Gaussian Value at Risk, o método Historical é uma das formas mais simples para se calcular o VaR. A diferença é que para o segundo método é necessário que haja mais dados. Neste post, iremos coletar dados de 4 ações para compor nosso portfólio, com dados diários de 1 de janeiro de 2013 até o dia atual.

Primeiro carregamos os pacotes, coletamos os preços e transformamos em retornos.

library(tidyquant)
library(timetk)
library(tidyverse)

 


# 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 <- "2012-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()

 

Estaremos então interessados em conhecer o valor diário dos nossos ativos dentro do nosso portfólio. Podemos fazer isso através da função Return.portfolio(). A função calcula o retorno do nosso portfólio com base nos retornos dos nossos ativos. Por padrão, a função considera que temos um portfólio com pesos iguais (que é o que utilizaremos aqui, cada ativo terá o peso de 25%). Se utilizarmos o argumento verbose = TRUE, a função também calcula o peso e os valores dos ativos ao longo do tempo.

Suponha então que nosso portfólio possuía um valor monetário de 4563 no primeiro dia, a função retornará uma lista com os retornos do portfólio, os pesos dos ativos e os valores monetários ao longo do tempo.


# Calcula o retorno do portfolio

portfolio_returns <- Return.portfolio(asset_returns, verbose = TRUE, value = 4563)

# Calcular o valor

value <- portfolio_returns$EOP.Value * asset_returns

&nbsp;

p_l <- value[,1] + value[,2] + value[,3] + value[,4]

p_l <- `colnames<-`(p_l, "pl")

var_01_historical <- quantile(-p_l$pl, 0.99)

var_05_historical <- quantile(-p_l$pl, 0.95)

 

Calculamos o P&L como a soma dos valores diários dos ativos ponderados pelos seus respectivos retornos. Por fim, calculamos o quartil para o intervalo de confiança em 99% ou 95%.

 

________________________

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

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.
________________________

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

Assinar Gratuitamente