Value at Risk e Conditional Value at Risk com o Python

As empresas em geral são expostas a diferentes tipos de risco, portanto, é de interesse saber qual o montante monetário a companhia pode perder em um determinado horizonte de tempo. Para tanto, é possível utilizar o VaR e CVaR, que estimam essa probabilidade de perda monetária. No post de hoje, iremos aprender a como calcular essas medidas utilizando o Python por meio de exemplos reais.

Riscos

Empresas em geral sofrem de diferentes tipos de risco, mas usualmente são mais expostas a três classes de risco: operacional, estratégico e financeiro. Os riscos financeiros estão ligados às variações de variáveis financeiras (juros, câmbio, entre outros) e que implicam perdas financeiras.

Os riscos financeiros podem ser classificados em vários tipos, como operacional, de crédito, de liquidez,  portanto, estes são os de maiores interesse para o mercado financeiro, pois representam perdas potenciais associadas ao comportamento do mercado.

Value At Risk

O Value at Risk é uma medida da variação potencial máxima do valor de um ativo (ou carteira), sobre um período pré-fixado, com dada probabilidade. Em outras palavras, expressa a perda monetária, com probabilidade p, sobre um horizonte h fixado.

E como calcular o VaR? Existem diversos métodos, com os respectivos parâmetros da medida estimados por diferentes modelos,  entretanto, trabalharemos aqui com um método bastante simples, o Historical VaR.

Historical VaR

O VaR Histórico calcula a perda monetária com base em um quantil dos 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. Esse quantil é estabelecido de acordo o nível de confiança, usualmente 95% e 99%.

Vamos calcular o Historical VaR com o Python. Utilizaremos os retornos do preço de fechamento diários de quatro empresas escolhidas aleatoriamente. No código abaixo, realiza-se a importação dos dados e o calculo dos retornos.


# Importa as bibliotecas
import numpy as np
import pandas as pd
from pandas_datareader import data as pdr
!pip install yfinance
import yfinance as yf
yf.pdr_override()
from matplotlib import pyplot as plt
plt.style.use("seaborn")


# Busca os preços das ações
## Define as ações
assets = ['ITUB4.SA', 'PETR4.SA', 'VALE3.SA', 'BRFS3.SA']
## Define a data início
start = '2021-01-01'
end = "2022-11-01"
# Busca os preços ajustados
prices = pdr.get_data_yahoo(assets, start = start, end = end)['Close']


# Calcula os retornos e retira dados faltantes
returns = prices.pct_change().dropna()




weights = np.ones((4, 1))
# Normaliza para obter os pesos (iguais)
weights = weights / np.sum(weights)




# Calcula o retorno do portfolio
returns_portfolio = returns.assign(portfolio = returns.dot(weights))



Uma vez que temos os retornos, podemos calcular o VaR Histórico tanto dos ativos individualmente, quanto dos ativos em conjunto, em forma de um portfólio, que para tanto, definimos com pesos iguais dos ativos.


# Cria a função para calcular o VaR
def value_at_risk(valor_investido, retornos, alpha = 0.95):
    # Calcula o percentil de perda e multiplica pelo valor investido
    return np.percentile(retornos, 100 * (1-alpha)) * valor_investido



# Define o valor investido
valor_investido = 1000
# Calcula o VaR com base nos retornos históricos do portfolio
portfolio_var = value_at_risk(valor_investido = valor_investido, retornos = returns_portfolio['portfolio'])
# Transforma em retornos
portfolio_var_return = portfolio_var / valor_investido

Agora podemos visualizar cada resultado (no caso do escolhido, o do portfolio) e entender por meio de um histograma a distribuição dos retornos e onde o VaR histórico reside.


# Plota a distribuição e os retornos
plt.figure(figsize = (11,7))
plt.hist(returns_portfolio['portfolio'].values, bins=20)
plt.axvline(portfolio_var_return, color='red', linestyle='solid');
plt.legend(['VaR para 95%', 'Distribuição do retornos históricos'])
plt.title('VaR Histórico');
plt.xlabel('Retorno');

Conditional Value at Risk

O CVar é considerado como se fosse uma melhoria do VaR, devido ao fato de que diferente do VaR, que considera uma distribuição normal dos dados históricos do retorno, considera não uma distribuição pré-estabelecido, mas sim dos dados empiricos. É conhecido também como Expected Shortfall (ES), devido ser uma expectativa de diferentes perdas possíveis maiores que o VaR.

O CVaR é uma estimativa das perdas esperadas, calculado com base no piores 1 -x% dos cenários. Define-se o CVaR como

  CVaR_{p} = \frac{1}{1-p} \int_{0}^{p}VaR_{p}dp

Agora vamos calcular o CVaR com o Python. Seguindo o mesmo conjunto de dados do Historical VaR , definimos a construção do CVaR como:


# Cria a função do CVAR
def cvar(valor_investido, retornos, alpha = 0.95):
    var = value_at_risk(valor_investido, retornos, alpha)

    # Get back to a return rather than an absolute loss
    var_pct_loss = var / valor_investido

    return valor_investido * np.nanmean(returns[returns < var_pct_loss])

E o resultado empírico com dado montante R$ 1000 investido será:


# Calcula o CVaR
portfolio_cvar = cvar(valor_investido, returns_portfolio['portfolio'], alpha = 0.95)




# Transforma o CVaR em retornos
portfolio_cvar_returns = portfolio_cvar / valor_investido


Podemos comparar as duas medidas visualmente por meio de um histograma:

# Retira os valores dos retornos para o plot do histograma
values_returns = returns_portfolio['portfolio'].values



# Plota a distribuição dos retornos, o VaR e o CVaR
plt.figure(figsize = (11,7))
plt.hist(values_returns[values_returns > portfolio_var_return], bins=20)
plt.hist(values_returns[values_returns < portfolio_var_return], bins=10)
plt.axvline(portfolio_var_return, color='red', linestyle='solid');
plt.axvline(portfolio_cvar_returns, color='red', linestyle='dashed');
plt.legend(['VaR',
            'CVaR',
            'Distribuição do retornos históricos',
            'Retornos < VaR'])
plt.title('VaR e CVaR Históricos');



 

______________________________________

Quer saber mais?

Veja nosso curso de Python para Investimentos.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como selecionar variáveis para modelos de previsão no Python?

Em oposição à crença popular, grande parte dos modelos de machine learning não produzem previsões magicamente. É papel do cientista de dados executar uma boa engenharia de variáveis para não cair no clássico problema de “garbage in, garbage out” (GIGO) em aprendizado de máquina. Neste sentido, aprender a fazer uma boa seleção de variáveis é fundamental e neste artigo exploramos algumas possibilidades práticas usando o Python.

Resultado IPCA-15 - Novembro/2024

A Análise Macro apresenta os resultados do IPCA-15 de Novembro de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Resultado PNADc Trimestral - 3° Trimestre/2024

A Análise Macro apresenta os resultados da PNADc Trimestral do 3º trimestre de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Boletim AM

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

Boletim AM

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

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.