O drawdown é uma importante medida de volatilidade para os investidores. De forma simples, o drawdown é calculado como a porcentagem de quanto um ativo, fundo ou portfólio caiu em relação ao seu topo.
Suponha que o Ibovespa esteja cotado a 100.000 pontos em uma determinada data. Durante os próximos dias, ele cai para 90.000 sem superar a marca dos 100.000 pontos. O drawdown nesse período foi de 10%.
Agora, se depois de alcançar os 90.000 pontos o Ibovespa suba para 115.000 pontos, o próximo drawdown será calculado utilizando o mais novo topo. Nesse caso, se ele cair para 100.000 logo em seguida, o drawdown será de:
115.000(115.000−100.000)×100≈13%
A importância do drawdown
O drawdown é bastante utilizado para medir a volatilidade, ou o risco, de um determinado investimento. Se dois ativos, A e B, possuem o mesmo retorno ao longo de um período, mas o drawdown de A é menor que o de B, o ativo A tende a ser preferível.
A discussão entre volatilidade x risco é extensa e está além do escopo desse artigo. No entanto, como exemplos, se um investimento observa quedas maiores, o investidor incorre no risco:
de ter uma chamada de margem (caso alavancado),
de encerrar o investimento prematuramente antes da recuperação (comum em fundos de investimento),
e de precisar resgatar em um momento de forte queda (devido a uma emergência ou até mesmo para a aposentadoria).
No caso específico de uma estratégia de trade, um menor drawdown significa uma menor exposição ao risco, e portanto minimizá-lo pode ser interessante mesmo que a rentabilidade da estratégia caia.
O que é melhor: uma estratégia A com rentabilidade de 20% e um drawdown de 15%, ou uma estratégia B com rentabilidade de 25% e drawdown de 40%? Mesmo que a resposta correta não exista, uma vez que é dependente da gestão de risco e perfil de cada pessoa, calcular o drawdown é de suma importância para qualquer investimento.
Calculando o drawdown do Ibovespa
Nossa primeira tarefa será calcular o drawdown máximo do Ibovespa em um determinado período. É importante entender o termo drawdown máximo: ele é a medida do maior drawdown ocorrido no período estabelecido. No exemplo anterior, a primeira queda foi de 100.000 para 90.000 (drawdown de 10%), e depois de 115.000 para 100.000 (drawdown de 13%). Um investidor analisando esse período específico observaria que o drawdown máximo foi de 13%.
O primeiro passo é importar as bibliotecas que vamos utilizar e baixar os preços de fechamento do Ibovespa em 2020 utilizando o Yahoo Finance. Note que o ticker do Ibovespa no yfinance é ^BVSP. Os símbolos podem ser pesquisados diretamente na plataforma.
# %%capture means we suppress the output
%%capture
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
!pip install yfinance
import yfinance as yf
data = yf.download("^BVSP", start="2020-01-01", end="2020-12-31").copy()[['Adj Close']]
data.head() # returns the first 5 rows of the dataframe
Adj Close
Date
2020-01-02
118573.0
2020-01-03
117707.0
2020-01-06
116878.0
2020-01-07
116662.0
2020-01-08
116247.0
Em seguida vamos utilizar a função cummax para criar uma nova coluna com o valor máximo de Adj Closeaté o elemento em questão. Repare a diferença entre cummax e max: enquanto cummax retorna, para cada elemento, o valor máximo anterior ou igual a ele, max retorna o valor máximo na coluna inteira, independente de ter ocorrido antes ou depois do elemento.
Pronto! O código acima nos diz qual o drawdown atual do ativo, dentro do período selecionado, em qualquer momento do tempo. Assim, podemos rapidamente dizer que o drawdown do Ibovespa em 2020, no dia 27 de Janeiro de 2020, era de 4,22%.
Como fazemos então para calcular o drawdown máximo no período?
Simples assim. O drawdown máximo do Ibovespa em 2020 foi de impressionantes 46,18% (2020 não foi pra amadores!)
Encontrando o período de máximo drawdown no gráfico
Como sempre, faz parte das nossas análises facilitar o entendimento com a melhor visualização possível. Vamos então identificar, via código, os pontos que compreenderam o drawdown máximo de 2020 e marcá-los em um gráfico.
# Get the position of the point with maximum Drawdown value
bottom_day = np.argmax(data['Drawdown'])
bottom_index = data[['Drawdown']].index.get_loc(bottom_day)
print(bottom_day, bottom_index, sep="\n")
2020-03-23 00:00:00 54
Repare que nós utilizamos argmax para retornar o índice (no caso, o dia) onde observamos o maior drawdown. Esse dia é o fundo do mercado e foi observado na linha 55 (índice número 54).
Para identificar o topo, vamos achar o valor máximo do Ibovespa na data do fundo, e buscar quando foi a primeira ocorrência desse preço.
# Get the position of the point with peak value before bottom
max_value = data.iloc[bottom_index]['Max']
top_day = (data['Max'] == max_value).idxmax()
top_index = data[['Max']].index.get_loc(top_day)
print(top_day, top_index, sep="\n")
2020-01-23 00:00:00 15
Dessa vez usamos idxmax para retornar a primeira ocorrência de quando o index foi igual ao valor máximo observado anteriormente ao fundo estabelecido. O topo foi definido no dia 23 de Janeiro de 2020, no 16º pregão do ano.
Plotando os pontos de topo e fundo
Com os pontos em mãos, podemos utilizar o matplotlib para visualizar esse período no gráfico:
Veja como a visualização nos ajuda a confirmar que os pontos marcados em vermelho foram, de fato, os pontos que compreenderam a maior queda do Ibovespa durante o ano de 2020.
Calculando o drawdown de vários anos
Nosso código está pronto e é capaz de nos retornar o drawdown em qualquer período, para qualquer ativo. Vamos facilitar ainda mais a nossa vida e escrever um código que nos permita analisar o drawdown máximo por ano em um determinado período.
O primeiro passo é transformar o cálculo do drawdown máximo em uma função:
Pronto! Temos todos os drawdowns do Ibovespa nos últimos 5 anos de forma extremamente simples.
Calculando o drawdown de diversos ativos
Nós mencionamos anteriormente que o drawdown pode ser utilizado como uma medida comparativa entre duas estratégias de investimento. Sendo assim, é bastante útil colocar o drawdown em contexto.
Agora que calculamos o drawdown do Ibovespa nos últimos 5 anos, podemos repetir o raciocínio para diversos outros papeis da bolsa. No entanto, em vez de fazermos isso manualmente, vamos escrever um código que nos possibilite compará-los de forma bastante objetiva:
O raciocínio é o mesmo: iteraremos sobre a lista de ativos e calcularemos o drawdown anual, armazenando essa informação em um dicionário. Eis o código:
all_drawdowns = {}
for ticker in tickers:
data = stocks[[ticker]]
drawdowns = {}
for year in years:
yearly_data = data[data.index.year == year].copy()
yearly_drawdown = get_drawdown(yearly_data, column = ticker)
drawdowns[year] = yearly_drawdown
all_drawdowns[ticker] = drawdowns
all_drawdowns
Os drawdowns estão calculados mas a visualização não é das melhores. Vamos criar um dataframe onde os ativos estarão nas linhas e cada ano será uma nova coluna:
O drawdown é uma forma de expor a volatilidade de um ativo. Note que mesmo em um ano relativamente calmo e direcional para a bolsa como 2019, ativos como GOLL4 e BTOW3 chacoalharam bastante. Em contrapartida, EQTL3 costuma ser bastante estável e mesmo em um ano de queda brutal como 2020, ela teve o menor drawdown da lista;
IRBR3, AZUL4 e MOVI3 fizeram seu IPO em 2017 e portanto não possuem drawdown antes disso;
A média é apenas uma pista, mas não conta a história toda. Note como IRBR3 possuía uma média extremamente baixa até o ano de 2020, onde apresentou o maior tombo de todos (inclusive maior que as aéreas!)
Agora que já sabemos calcular o drawdown podemos utilizar essa medida nas nossas estratégias de trade. Fique ligado para os próximos posts, onde compareremos estratégias não somente no seu retorno financeiro, mas no seu drawdown máximo.