Fundos de Investimento Brasileiros

Nos últimos anos há uma coleção de comparadores de fundos de investimentos aparecendo na internet, ainda que a coleta dos dados não seja algo trivial. A CVM avançou bastante em liberar os dados dos fundos em um site http://www.cvm.gov.br/menu/regulados/fundos/consultas/fundos.html, no qual você consegue dados cadastrais, cotas diárias, informações do administrador, do gestor e etc.

É possível fazer a raspagem desses dados por conta própria, mas há também uma alternativa mais fácil (e que por ora está de graça): O API da Okanebox. Abaixo alguns exemplos que criei para baixar os dados e as possibilidades rápidas do que fazer com ele.

Baixando dados cadastrais da CVM

Para baixar o dado de um fundo, é necessário saber o seu CNPJ. No script abaixo baixo o zip da CVM que é atualizado diariamente com os dados dos fundos, sobretudo seu CNPJ. Nesse sentido, basta buscar o nome do fundo na função abaixo (sempre com letra maiúscula) e ver o fundo do seu interesse na tabela. Claro, você pode simplesmentar Googlar e pegar o CNPJ.

library(httr)
library(xts)
library(dplyr)
library(PerformanceAnalytics)
library(quantmod)
library(stringr)
library(tidyr)
library(knitr)


NomeFundo<-function(x){
  temp <- tempfile()
  download.file("http://dados.cvm.gov.br/dados/FI/CAD/DADOS/cad_fi_hist.zip",temp)
  data <- read.table(unz(temp, "cad_fi_hist_denom_social.csv"),sep=';')%>% filter(str_detect(V3, x))%>% select(V1,V3)
}

df<-NomeFundo('VERDE')## função para buscar o nome
DT::datatable(head(df), editable = 'cell')

Baixando os dados do Fundo

Agora utilizando o API, coletando as cotas e demais informações do fundo desde 2017

cnpj<-23243536000133 ## esse é o CNPJ do Long Bias do Verde Asset
data_inicial<-20170101 #de 2017 para frente
data_final<-20201210 #provavelmente não terá informações do dia corrente, há delay na CVM

fundosBR<-function(cnpj,data_inicial,data_final){
  df<-GET(paste0('https://www.okanebox.com.br/api/fundoinvestimento/hist/',cnpj,'/',data_inicial,'/',data_final,'/')) %>%
    content() %>% do.call(rbind.data.frame,.)
  df<-xts(df[,4:8],order.by = as.POSIXct(df$DT_COMPTC))
  colnames(df)<-c('Quota','PL_liquido','Capt_dia','Resg_dia','N_cotista')
  return(df)
}

base1<-fundosBR(cnpj,data_inicial,data_final) # baixando os dados do CNPJ e do período selecionado

head(base1)
##                Quota PL_liquido Capt_dia Resg_dia N_cotista
## 2017-02-21 1.0000000   10000000    1e+07        0         1
## 2017-02-22 0.9999185    9999185    0e+00        0         1
## 2017-02-23 0.9967447    9967447    0e+00        0         1
## 2017-02-24 0.9845934    9845934    0e+00        0         1
## 2017-03-01 0.9874963    9874963    0e+00        0         1
## 2017-03-02 0.9817820    9917820    1e+05        0         2

Algumas funções

Pronto, agora que você tem a evolução no tempo dos dados de Cota, Patrimônio Líquido, Captação Diária e número de Cotista, o céu é o limite.

Agora aproveitando o pacote \(PerformanceAnalytics\) vamos ver algumas funções básicas.

Evolução do retorno acumulado desde o começo da base

chart.CumReturns(dailyReturn(base1$Quota),main="Cumulative Returns",begin='2020-01-01') ## retorno acumulado em 2020

Evolução dos Drawdowns

chart.Drawdown(dailyReturn(base1$Quota))## evolução do drawdown

Evolução da Performance Acumulada em 252 dias (1 ano)

chart.RollingPerformance(dailyReturn(base1$Quota),width = 252) #performance móvel em 252 dias (1 ano)

Sumarização dos gráficos

charts.PerformanceSummary((dailyReturn(base1$Quota)),main='Sumário do Fundo') ## gráfico que summariza tudo

Achando os 5 piores drawdowns do fundo nos últimos anos.

n = table.Drawdowns(dailyReturn(base1$Quota),top=5)
DT::datatable((n), editable = 'cell')
chart.Events(Drawdowns(dailyReturn(base1$Quota)), 
             dates = n$Trough, 
             prior=max(na.omit(n$"To Trough")), 
             post=max(na.omit(n$Recovery)), 
             lwd=2, colorset=redfocus, legend.loc=NULL, 
             main = "Piores Drawdowns")

Agora a criatividade é com vocês. Há o pacote \(quantmod\) para baixar cotação de moedas e índices, dá para estimar vários outros indicadores de performance e de alocação.

Arthur Lula Mota (Twitter: @ArthurLulaM)