Recentemente uma discussão apareceu no Twitter (ou carinhosamente chamada de \(\textit{fintweet}\)), envolvendo pessoas ligadas ao mercado financeiro e alguns acadêmicos, tratando das vantagens de alocação de recursos em renda fixa e renda variável. Mais precisamente, dois ativos foram focados nessas categorias, o CDI e o IBOVESPA.
A discussão chegou em artigo de jornal, escrito por Samy Dana (EAESP/FGV) e Rodrigo De Losso (FEA/USP), que reportaram um estudo mostrando a comparação de ganhos entre CDI e Ibovespa em várias janelas. A matéria completa pode ser verificada em “No Brasil, retorno não compensou risco maior da renda variável”.
As páginas de jornal não permitem a reprodução exata do exercício, o que é um complicado para avaliação dos pares, além do fato que ele foi implementado inicialmente em VBA. Por este fato, Guilherme Duarte e Arthur Lula se uniram para tratar o problema de forma que qualquer um possa realizar a reprodução em suas próprias máquinas, sendo necessário apenas o software livre R e copiar todos os comandos abaixo.
Foi conversado com um dos autores do artigo do Valor, o Samy Dana, para confirmar os passos que foram dados no estudo.
A ideia é que o estudo mostre quem “ganha mais” ao considerar todos as possibilidades de compra e venda entre 1986 e 2019, em termos de dias. A pessoa que ficou 50 dias úteis com os dois ativos ou aquela que sentou em 4000 dias úteis será representada pelo estudo, seja em qualquer data que ela tenha operado entre 1986 e 2019.
Cabe aqui ressaltar que não estamos entrando no debate se renda variável é superior ou não a renda fixa, independente do prazo. Como estamos tratando apenas de Ibovespa e CDI e não possuimos o conhecimento de todos os ativos relevantes para tal comparação, vamos nos limitar a comparação direta de ganhos envolvendo apenas esses ativos.
Vale destacar também que não é levado em consideração custos de transações, apenas o resultado fruto da operação do preço de saída e de entrada (podendo ser negativo ou positivo). O interesse é que as críticas e o \(\textit{review}\) seja feito de forma positiva, para avançar na discussão.
Os dados foram baixados, de forma automática, na B3 e no IpeaData, conforme os comandos abaixo.
#install.packages('installr') se não tiver o intallr, retirar o #
#devtools::install_github('ipea/ipeaData') se não tiver, o devtools retirar o #
library(installr)
require2(devtools)
require2(ipeaData)
require2(dplyr)
require2(purrr)
require2(glue)
require2(readxl)
require2(xml2)
require2(ggplot2)
require2(tidyr)
download_data_ibovespa_file <- function() {
download.file('http://bvmf.bmfbovespa.com.br/indices/download/IBOVDIA.zip',
destfile = "IBOVDIA.zip")
unzip("IBOVDIA.zip",exdir = ".")
}
read_ibovespa_year_file <- function(year) {
readxl::read_excel(unzip("IBOVDIA.zip",exdir = "."),
sheet = as.character(year),
range = "A3:M33",
col_names = c("Dia", 1:12)
) %>%
dplyr::slice(1:31) %>%
dplyr::mutate(Ano = year)
}
download_data_ibovespa_file()
ibov <- 1968:1997 %>%
map(read_ibovespa_year_file) %>%
bind_rows() %>%
gather(mes, ibov_valor, -Dia, - Ano) %>%
mutate(data = stringr::str_c(Dia,"/", mes, "/",Ano) %>%
lubridate::dmy()) %>%
filter(!is.na(data)) %>%
select(-(Dia:mes))
ibov_ipea <- ipeadata('GM366_IBVSP366') %>%
mutate(data = stringr::str_c(DIA,"/", MES, "/",ANO) %>%
lubridate::dmy()) %>%
filter(!is.na(data)) %>%
select(data, ibov_valor = VALVALOR) %>%
filter(lubridate::year(data) >= 1998 )
## [1] "Bolsa de Valores, Mercadorias e Futuros (BM&FBovespa). 07/1994 a 04/2019. Acesso em: 08/04/2019"
ibov <- bind_rows(ibov, ibov_ipea)
Agora baixando os dados do CDI
cdi <- ipeadata('GM366_TJOVER366')
## [1] "NA. 06/1986 a 04/2019. Acesso em: 08/04/2019"
cdi <- cdi %>%
mutate(data = stringr::str_c(DIA, "/", MES, "/", ANO) %>%
lubridate::dmy()) %>%
mutate(cdi_valor = (1 + VALVALOR/100)^(1/252)-1) %>%
select(data, cdi_valor)
dados <- inner_join(ibov, cdi)
Desta forma, a série do Ibovespa desde 1986 é a junção dos dados da B3 e do IpeaData, ao passo que o resultado do CDI tem como base única o IpeaData.
Com os dados juntos, é possível criar as comparações de forma semelhante ao estudo no Valor, com janelas com mais de 5 mil dias úteis. Inicialmente vamos reportar os resultados considerando o período de 1986 até 2019.
Para facilitar trabalho, foi criado um índice CDI, que reflete os resultados diários, o que facilita o cálculo do ganhos ou perdas, assim como já é feito no Ibovespa.
dados <- dados %>%
filter(lubridate::year(data) >= 1986) %>%
# 1)
filter(!is.na(cdi_valor) | !is.na(ibov_valor)) %>%
arrange(data) %>%
# 2)
tidyr::fill(ibov_valor) %>%
# 3)
mutate(cdi_valor = ifelse(is.na(cdi_valor), 0, cdi_valor))
dados <- dados %>%
mutate(cdi_index = (1 + cdi_valor) %>%
accumulate(`*`)) %>%
mutate(first_ibov = first(ibov_valor)) %>%
mutate(cdi_index = cdi_index * first(ibov_valor))
retorna_resultado <- function(dados, janela) {
dados %>%
filter(lubridate::year(data) >= 1986) %>%
mutate(cdi_diferenca = lead(cdi_index, janela)/cdi_index - 1,
ibov_diferenca = lead(ibov_valor, janela)/ibov_valor - 1) %>%
mutate(resultado = cdi_diferenca > ibov_diferenca) %>%
summarise(resultado = mean(resultado, na.rm=T)) %>%
pull(resultado)
}
resultados <- tibble(janelas = 1:10000)
resultados <- resultados %>%
mutate(cdi_vitoria = map_dbl(janelas, ~ retorna_resultado(dados, .x)))
resultados <- bind_rows(resultados %>%
mutate(ativo = "CDI") %>%
rename(vitoria = cdi_vitoria),
resultados %>%
mutate(ativo = "IBOVESPA",
vitoria = 1 - cdi_vitoria))
ggplot(resultados %>%
filter(!is.na(vitoria))) +
geom_line(aes(x = janelas, y = vitoria, color = ativo)) +
theme_bw()
Cosiderando apenas o período pós Real, ou seja, de 1994 até 2019
retorna_resultado <- function(dados, janela) {
dados %>%
filter(lubridate::year(data) >= 1994) %>%
mutate(cdi_diferenca = lead(cdi_index, janela)/cdi_index - 1,
ibov_diferenca = lead(ibov_valor, janela)/ibov_valor - 1) %>%
mutate(resultado = cdi_diferenca > ibov_diferenca) %>%
summarise(resultado = mean(resultado, na.rm=T)) %>%
pull(resultado)
}
resultados <- tibble(janelas = 1:10000)
resultados <- resultados %>%
mutate(cdi_vitoria = map_dbl(janelas, ~ retorna_resultado(dados, .x)))
resultados <- bind_rows(resultados %>%
mutate(ativo = "CDI") %>%
rename(vitoria = cdi_vitoria),
resultados %>%
mutate(ativo = "IBOVESPA",
vitoria = 1 - cdi_vitoria))
ggplot(resultados %>%
filter(!is.na(vitoria))) +
geom_line(aes(x = janelas, y = vitoria, color = ativo)) +
theme_bw()
Considerando apenas o século XXI, de 2000 até 2019.
retorna_resultado <- function(dados, janela) {
dados %>%
filter(lubridate::year(data) >= 2000) %>%
mutate(cdi_diferenca = lead(cdi_index, janela)/cdi_index - 1,
ibov_diferenca = lead(ibov_valor, janela)/ibov_valor - 1) %>%
mutate(resultado = cdi_diferenca > ibov_diferenca) %>%
summarise(resultado = mean(resultado, na.rm=T)) %>%
pull(resultado)
}
resultados <- tibble(janelas = 1:10000)
resultados <- resultados %>%
mutate(cdi_vitoria = map_dbl(janelas, ~ retorna_resultado(dados, .x)))
resultados <- bind_rows(resultados %>%
mutate(ativo = "CDI") %>%
rename(vitoria = cdi_vitoria),
resultados %>%
mutate(ativo = "IBOVESPA",
vitoria = 1 - cdi_vitoria))
ggplot(resultados %>%
filter(!is.na(vitoria))) +
geom_line(aes(x = janelas, y = vitoria, color = ativo)) +
theme_bw()
E, por fim, considerando apenas o período pós 2016, para pegar os resultados pós-impeachment. Naturalmente o período se encurtou, sendo possível avaliar o que aconteceu em janelas de menos de 1000 dias úteis. Nesse caso, considerando um período curto e momento de otimismo, o Ibovespa venceu o CDI na maior parte das vezes.
retorna_resultado <- function(dados, janela) {
dados %>%
filter(lubridate::year(data) >= 2016) %>%
mutate(cdi_diferenca = lead(cdi_index, janela)/cdi_index - 1,
ibov_diferenca = lead(ibov_valor, janela)/ibov_valor - 1) %>%
mutate(resultado = cdi_diferenca > ibov_diferenca) %>%
summarise(resultado = mean(resultado, na.rm=T)) %>%
pull(resultado)
}
resultados <- tibble(janelas = 1:10000)
resultados <- resultados %>%
mutate(cdi_vitoria = map_dbl(janelas, ~ retorna_resultado(dados, .x)))
resultados <- bind_rows(resultados %>%
mutate(ativo = "CDI") %>%
rename(vitoria = cdi_vitoria),
resultados %>%
mutate(ativo = "IBOVESPA",
vitoria = 1 - cdi_vitoria))
ggplot(resultados %>%
filter(!is.na(vitoria))) +
geom_line(aes(x = janelas, y = vitoria, color = ativo)) +
theme_bw()
Em suma, o estudo teve por objetivo deixar aberto e de fácil acesso o estudo feito por Samy Dana e De Losso, de forma que aumenta a transparência e formas de crítica/aperfeiçoamento. Os resultados sugerem que os ganhos do CDI batem o Ibovespa na maior parte das janelas e períodos avaliados, exceto o mais recente (pós-impeachment)
Isso quer dizer que daqui para frente será o mesmo? NÂO. O resultado de um período longo de \(\textit{bull market}\) e juros baixos podem inverter os resultados no futuro, por exemplo.
Verificar o quão superior (em p.p) um ativo foi em relação ao outro em todos os dias úteis de todas as janelas, para ver ao longo do tempo o quanto um trouxe maiores ganhos. Dessa forma, calcular a diferença acumulada de retornos ao longo da janela, dado que na presença de retornos compostos, um monte de ganhos pequenos pode facilmente compensar um ganho grande que ocorre só uma vez;
Ajustar ao risco;
Demais sugestões feitas por críticas válidas e educadas.