1 Sobre o Pacote

A CVM disponibiliza diversas bases de dados de fundos de investimento no ‘Portal Dados Abertos’ que pode ser acessado clicando aqui. O objetivo das funções do pacote dadosCVM é possibilitar o acesso intuitivo e direto aos dados lá contidos através do R (R Core Team (2020)), os quais muitas vezes estão distribuídos em dezenas de arquivos distintos.

O portal de dados da CVM é muito bem organizado e para cada base de dados há um arquivo ‘meta’ descrevendo as variáveis, como você pode conferir nesse caso.

O pacote atualmente está em desenvolvimento e pode ser acessado no GitHub através do site https://github.com/lucasan93/dadosCVM. Nesse link você poderá acompanhar quais funções já foram desenvolvidas, quais estão em desenvolvimento, verificar exemplos e protocolar issues.

Você também pode entrar em contato comigo para sugestões, comentários e dúvidas através do e-mail lucas.avelleda@gmail.com.

1.1 Sobre o Portal de Dados da CVM

O Portal de Dados da CVM está em constante evolução como resultado do Plano de Dados Abertos (PDA) iniciado em 2016, o qual ‘visa, entre outros objetivos, aprimorar a cultura de transparência pública, franqueado ao cidadão o acesso, de forma aberta, aos dados produzidos ou acumulados pela Administração Pública.’ O cronograma de elaboração e sustentação do PDA é extenso e envolve principalmente a abertura de novas bases de dados, o que implicará em atualizações nesse pacote para acompanhar a evolução da abertura de dados.

Ademais, as bases de dados disponíveis também passam por mudanças de nomeclaturas, pastas e formatos de arquivos. Felizmente, a CVM registra aqui as alterações futuras e passadas, facilitando o trabalho de ajustes no pacote sempre que necessário.

Lembre-se que os dados contidos no portal da CVM não estão isentos de erros. Como você pode verificar nessa notícia, é possível se deparar com ‘inconsistências, ausência de informações e divergências contábeis.’

1.2 Instalação do Pacote

A versão em desenvolvimento do pacote dadosCVM pode ser instalada via GitHub através das seguintes linhas de código (caso não possua o pacote devtools instalado, execute a primeira linha).

# install.packages("devtools")
devtools::install_github("lucasan93/dadosCVM")

2 Exemplos

2.1 Obtendo os Dados Cadastrais da CVM

A função cad_fi() obtem o arquivo mais recente dos dados cadastrais dos fundos registrados na CVM. A página em que os dados estão armazenados pode ser acessada clicando aqui. A base de dados possui dezenas de informações de todos os fundos (estejam eles em funcionamento ou não). Atualmente há mais de 60.000 observações no arquivo que é frequentemente (quase que diariamente) atualizado pela CVM.

No exemplo abaixo são filtrados apenas os fundos que estão em funcionamento, selecionados os 10 maiores fundos de acordo com o patrimônio líquido e gera-se uma tabela com algumas das mais de 35 colunas disponíveis na base de dados. Nesse exemplo são utilizados os pacotes dadosCVM (Avelleda (2022)), dplyr (Wickham et al. (2021)) e kableExtra (Zhu (2021)).

library(dadosCVM)
library(dplyr)
library(kableExtra)

cad_fi() %>% 
    filter(situacao == 'EM FUNCIONAMENTO NORMAL') %>% 
    select(cnpj,
           classe,
           tipo,
           inicio_atv,
           pl_data,
           pl) %>% 
    arrange(desc(pl)) %>% 
    slice_head(n = 10) %>% 
    mutate(pl = format(pl, big.mark = ',')) %>% 
    kable(align = c(rep('l', 5), 'r')) %>% 
    kable_styling(latex_options = 'striped')
cnpj classe tipo inicio_atv pl_data pl
01.608.573/0001-65 Fundo de Renda Fixa FI 1997-01-02 2022-03-24 157,940,967,444
27.146.328/0001-77 Fundo de Renda Fixa FI 2017-05-03 2022-03-24 137,073,313,624
07.593.972/0001-86 Fundo de Renda Fixa FI 2005-09-21 2022-03-24 122,342,877,809
22.985.157/0001-56 FIP Multi FIP 2015-09-01 2021-12-31 107,568,311,434
01.597.187/0001-15 Fundo de Renda Fixa FI 1996-12-30 2022-03-24 95,992,293,229
00.822.055/0001-87 Fundo de Renda Fixa FI 1995-10-02 2022-03-24 95,034,051,888
42.592.302/0001-46 Fundo de Renda Fixa FI 2021-09-30 2022-03-24 72,408,926,082
42.592.315/0001-15 Fundo de Renda Fixa FI 2021-09-30 2022-03-24 72,403,897,072
04.288.966/0001-27 Fundo de Renda Fixa FI 2002-07-15 2022-03-24 57,365,529,639
03.737.219/0001-66 Fundo de Renda Fixa FI 2005-08-24 2022-03-24 55,216,849,867

Já na tabela abaixo podemos conferir os gestores e administradores dos fundos apresentados acima:

cad_fi() %>% 
    filter(situacao == 'EM FUNCIONAMENTO NORMAL') %>% 
    arrange(desc(pl)) %>% 
    select(cnpj,
             gestor,
             adm) %>% 
    slice_head(n = 10) %>% 
    kable(align = c(rep('l', 3))) %>% 
    kable_styling(latex_options = 'striped', font_size = 9)
cnpj gestor adm
01.608.573/0001-65 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
27.146.328/0001-77 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
07.593.972/0001-86 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
22.985.157/0001-56 BRL TRUST INVESTIMENTOS LTDA. BRL TRUST INVESTIMENTOS LTDA.
01.597.187/0001-15 ITAU UNIBANCO ASSET MANAGEMENT LTDA. ITAU UNIBANCO S.A.
00.822.055/0001-87 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
42.592.302/0001-46 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
42.592.315/0001-15 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
04.288.966/0001-27 BB GESTAO DE RECURSOS DTVM S.A BB GESTAO DE RECURSOS DTVM S.A
03.737.219/0001-66 CAIXA DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS S.A. CAIXA ECONOMICA FEDERAL

2.2 Obtendo os Dados Diários dos Fundos

A CVM disponibiliza (aqui) bases de dados contendo informações diárias dos fundos de investimento. Para datas a partir de 01/01/2021 os dados diários estão condidos em arquivos .csv para cada mês, enquanto no período entre 01/01/2005 e 31/12/2016 são por sua vez organizados em bases .csv mensais dentro de arquivos .zip para cada ano. Os arquivos são deveras volumosos uma vez que possuem as informações diárias de todos os fundos, portanto pesquisas que envolvam grandes períodos temporais podem ser custosas em termos de tempo. Caso você necessite frequentemente dos dados sugere-se que armazene uma única vez todos os arquivos históricos, transformando-os em uma única base de dados que pode ser atualizada com novas observações de acordo com sua necessidade. Contudo, note que até mesmo os arquivos mais antigos são atualizados com frequência pela CVM, portanto seja cuidadoso ao implementar essa sugestão.

A função dados_diarios() que executa a obtenção dos dados dários requer três argumentos: um vetor de CNPJs (cnpj) dos fundos que se deseja analisar, a data de início (start) e a data de fim (end) do período de interesse.

No exemplo abaixo são extraídos os CNPJs dos fundos abordados no período anterior, obtidos os dados históricos desde 2005 (ano mais antigo disponibilizado) e elaborado um gráfico do patrimônio líquido, em BRL, dos fundos.

Além do PL, as informações de número de cotistas, valor da cota, resgates, captações e valor total da carteira também estão na base obtida através da função dados_diarios(). Nesse exemplo são utilizados os pacotes dadosCVM (Avelleda (2022)), dplyr (Wickham et al. (2021)), ggplot2 (Wickham (2016)) e scales (Wickham and Seidel (2020)).

library(dadosCVM)
library(dplyr)
library(ggplot2)
library(scales)

cnpjs <- cad_fi() %>% 
            filter(situacao == 'EM FUNCIONAMENTO NORMAL') %>% 
            arrange(desc(pl)) %>% 
            slice_head(n = 10) %>%
            pull(cnpj)

dados_diarios(cnpj  = cnpjs,
              start = as.Date('2005-01-01'),
              end   = as.Date('2022-03-22')) %>% 
      select(data, cnpj, pl) %>% 
      ggplot() +
      aes(x = data, y = pl, color = cnpj) +
      geom_line() +
      scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
      xlab('Date') +
      ylab('Equity (BRL)') +
      theme_minimal()
## [1] "Obtaining data between 2021-01-01 and 2022-03-22"
## [1] "Obtaining data between 2005-01-01 and 2022-03-22"

Atenção: Você notará que há apenas 9 fundos plotados no gráfico: ocorre que a base de dados diários da CVM disponibiliza informações apenas de fundos do tipo ‘FI.’

Ademais, caso você saiba o nome de um fundo, mas não seu CNPJ, pesquise-o na base de dados obtida via a função cad_fi() ou através do portal de consulta a fundos da CVM clicando aqui. O mesmo procedimento pode ser realizado para consultar a data de início do fundo (argumento start da função).

2.3 Obtendo Dados de FIDCS

Para os scripts dos exemplos de FIDCs serão utilizados os pacotes dadosCVM (Avelleda (2022)), kableExtra, (Zhu (2021)), dplyr (Wickham et al. (2021)), janitor (Firke (2021)), scales (Wickham and Seidel (2020)), stringr (Wickham (2019)) e ggplot2 (Wickham (2016)).

A CVM disponibiliza 16 bases mensais de dados de FIDCS nessa página. O pacote dadosCVM possui uma base de dados (tabs_fidc) que informa o conteúdo de cada uma dessas bases, conforme demonstra o script abaixo:

tabs_fidcs %>% 
kable(align = c('l', 'l')) %>% 
    kable_styling(latex_options = 'striped')
tabela conteudo
I_TODOS informacoes cadastrais dos fundos e ativos
II classificacoes da carteira
III passivos
IV patrimonio liquido
V direitos creditorios com aquisicao substancial dos riscos e beneficios classificados por prazo de vencimento inadimplencia e pagamentos antecipados
VI direitos creditorios sem aquisicao substancial dos riscos e beneficios classificados por prazo de vencimento inadimplencia e pagamentos antecipados
VII aquisicoes alienacoes substituicoes e recompras
IX taxas de desconto e de juros das compras e vendas
X_1 informacoes sobre cotistas por classe e serie
X_1_1 classificacoes dos cotistas
X_2 informacoes sobre as cotas
X_3 rentabilidade
X_4 transacoes de cotas do fundo
X_5 ativos classificados pela liquidez
X_6 taxas de desempenho real e esperada
X_7 garantias

2.3.1 Composição da Carteira

Suponhamos que temos interesse em analisar a composição da carteira histórica dos 10 maiores FIDCs em funcionamento. Sabemos pela tabela acima que a base de dados que contém essas informações é a ‘II.’ Vamos então selecionar os CNPJs e as datas de início dos 10 maiores FIDCs através dos dados disponíveis nas informações cadastrais, acessados via a função cad_fi().

fidcs <- cad_fi() %>% 
          filter(situacao == 'EM FUNCIONAMENTO NORMAL',
                 tipo     == 'FIDC') %>% 
          arrange(desc(pl)) %>% 
          slice_head(n = 10) %>% 
          select(cnpj,
                 inicio_atv)

Agora, vamos obter a série histórica dos segmentos das carteiras de cada um desses 10 fundos e plotar os gráficos separadamente. Note que a função dados_fidc() transforma as bases de dados do formato original wide para long, facilitando a elaboração de gráficos e demais análises. Ao realizar essa transformação, a função também insere as classificações de segmento e item, as quais serão doravante apresentadas.

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-01'),
           table = 'II') %>% 
        replace(is.na(.), 0) %>% 
        filter(value > 0) %>% 
        group_by(cnpj, data, segment) %>% 
        summarise(value = sum(value)) %>% 
        ggplot() +
        aes(x = data, y = value, fill = segment) +
        geom_bar(position = 'stack', stat     = 'identity') +
        scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
        xlab('Data') +
        ylab('Valor (BRL)') +
        theme_minimal() +
        facet_wrap(~cnpj) +
        theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank(), axis.text = element_text(size = 9),
            strip.text.x = element_text(size = 9), 
            axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-01"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

Pode-se ademais explorar os itens que compõem cada segmento das carteiras do fundo. Antes de prosseguir com a elaboração dos gráficos, vamos explorar a base de dados disponível no pacote dadosCVM, defs_fidcs, a qual apresenta as variáveis de todas os 16 conjuntos de dados de FIDCs disponíveis na CVM. Vamos filtrar essa tabela para verificarmos apenas as definições do conjunto II de dados. É importante ressaltar que a função dados_fidcs() exclui as observações em que o item é ‘total’ para evitar contagens duplas de valores.

defs_fidcs %>% 
    filter(str_detect(category, '^TAB_II_')) %>% 
    kable(align = c('l', 'l')) %>% 
    kable_styling(latex_options = 'striped')
category table id base segment class item
TAB_II_VL_CARTEIRA II II carteira carteira total total
TAB_II_A_VL_INDUST II II.A carteira industrial industrial industrial
TAB_II_B_VL_IMOBIL II II.B carteira imobiliario imobiliario imobiliario
TAB_II_C_VL_COMERC II II.C carteira comercial total total
TAB_II_C1_VL_COMERC II II.C.1 carteira comercial comercial comercial
TAB_II_C2_VL_VAREJO II II.C.2 carteira comercial varejo varejo
TAB_II_C3_VL_ARREND II II.C.3 carteira comercial arrendamento mercantil arrendamento mercantil
TAB_II_D_VL_SERV II II.D carteira servicos total total
TAB_II_D1_VL_SERV II II.D.1 carteira servicos servicos servicos
TAB_II_D2_VL_SERV_PUBLICO II II.D.2 carteira servicos servicos publicos servicos publicos
TAB_II_D3_VL_SERV_EDUC II II.D.3 carteira servicos servicos educacionais servicos educacionais
TAB_II_D4_VL_ENTRET II II.D.4 carteira servicos servicos entretenimento servicos entretenimento
TAB_II_E_VL_AGRONEG II II.E carteira agronegocio agronegocio agronegocio
TAB_II_F_VL_FINANC II II.F carteira financeiro total total
TAB_II_F1_VL_CRED_PESSOA II II.F.1 carteira financeiro credito pessoal credito pessoal
TAB_II_F2_VL_CRED_PESSOA_CONSIG II II.F.2 carteira financeiro credito pessoal consignado credito pessoal consignado
TAB_II_F3_VL_CRED_CORP II II.F.3 carteira financeiro credito corporativo credito corporativo
TAB_II_F4_VL_MIDMARKET II II.F.4 carteira financeiro middle market middle market
TAB_II_F5_VL_VEICULO II II.F.5 carteira financeiro veiculos veiculos
TAB_II_F6_VL_IMOBIL_EMPRESA II II.F.6 carteira financeiro carteira imobiliaria empresarial carteira imobiliaria empresarial
TAB_II_F7_VL_IMOBIL_RESID II II.F.7 carteira financeiro carteira imobiliaria residencial carteira imobiliaria residencial
TAB_II_F8_VL_OUTRO II II.F.8 carteira financeiro outros outros
TAB_II_G_VL_CREDITO II II.G carteira cartao de credito cartao de credito cartao de credito
TAB_II_H_VL_FACTOR II II.H carteira factoring total total
TAB_II_H1_VL_PESSOA II II.H.1 carteira factoring pessoal pessoal
TAB_II_H2_VL_CORP II II.H.2 carteira factoring corporativo corporativo
TAB_II_I_VL_SETOR_PUBLICO II II.I carteira setor publico total total
TAB_II_I1_VL_PRECAT II II.I.1 carteira setor publico precatorios precatorios
TAB_II_I2_VL_TRIBUT II II.I.2 carteira setor publico creditos tributarios creditos tributarios
TAB_II_I3_VL_ROYALTIES II II.I.3 carteira setor publico royalties royalties
TAB_II_I4_VL_OUTRO II II.I.4 carteira setor publico outros outros
TAB_II_J_VL_JUDICIAL II II.J carteira acoes judiciais acoes judiciais acoes judiciais
TAB_II_K_VL_MARCA II II.K carteira prop intelectual prop intelectual prop intelectual

Vamos então avaliar de forma agregada as composições das carteiras dos fundos em maior detalhe:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-01'),
           table = 'II') %>% 
        replace(is.na(.), 0) %>% 
        filter(value > 0) %>% 
        group_by(data, segment, item) %>% 
        summarise(value = sum(value)) %>% 
        ggplot() +
        aes(x = data, y = value, fill = item) +
        geom_bar(position = 'stack', stat     = 'identity') +
        scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
        xlab('Data') +
        ylab('Valor (BRL)') +
        theme_minimal() +
        facet_wrap(~segment) +
        theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank(), axis.text = element_text(size = 9),
            strip.text.x = element_text(size = 9), 
            axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-01"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.2 Ativos

Vamos começar a explorar o balanço patrimonial dos fundos. Através da tabela apresentada no exemplo 3 (tabs_fidcs) sabe-se que a base de dados que contém os ativos do balanço patrimonial do fundo é a ‘I.’ Vamos baixar os dados históricos mensais dos ativos do maior FIDC em funcionamento e plotar o gráfico de seus segmentos. Note que a função dados_fidc() transforma os dados originais da CVM de wide para long e também insere as classificações e sub-classificações em cada item. É importante mencionar que nessa base de dados, em alguns casos, os fundos inserem o CNPJ ou CPF dos cedentes dos FIDCS como parte dos ativos. Esses dados são classificados como ‘identificacao’ na coluna ‘base,’ enquanto os demais dados de ativos são classificados como ‘ativos.’ Note também que para esse conjunto de dados há três níveis de classificação: base, segment, class e item. A função também transforma os valores do item ‘provisao para reducao no valor de recuperacao’ (TAB_I2A11_VL_REDUCAO_RECUP) em negativos.

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = fidcs$inicio_atv[1],
           end   = as.Date('2022-03-31'),
           table = 'I') %>%
      filter(base == 'ativo', 
             value != 0) %>% 
      group_by(data, segment) %>% 
              summarise(valor = sum(value)) %>% 
      ggplot() +
      aes(x = data, y = valor, fill = segment) +
      geom_bar(position = 'stack', stat     = 'identity') +
      scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
      xlab('Date') +
      ylab('Value (BRL)') +
      theme_minimal() +
      theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank())
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2016-04-20 and 2018-12-31"

Podemos também explorar os itens que compõem cada um dos segmentos acima:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = fidcs$inicio_atv[1],
           end   = as.Date('2022-03-31'),
           table = 'I') %>%
      filter(base == 'ativo', value != 0) %>% 
      group_by(data, segment, item) %>% 
              summarise(valor = sum(value)) %>% 
      ggplot() +
      aes(x = data, y = valor, fill = item) +
      geom_bar(position = 'stack', stat     = 'identity') +
      scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
      xlab('Date') +
      ylab('Value (BRL)') +
      theme_minimal() +
      facet_wrap(~segment, scales = 'free_y') +
      theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank(), axis.text = element_text(size = 9),
            strip.text.x = element_text(size = 9), 
            axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2016-04-20 and 2018-12-31"

E por fim fazer uma tabela dos ativos no mês mais recente:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = as.Date('2022-02-28'),
           end   = as.Date('2022-02-28'),
           table = 'I') %>%
  filter(base == 'ativo', 
         value != 0) %>% 
  select(segment, item, value) %>% 
  adorn_totals('row') %>% 
  mutate(value = format(value, big.mark = ',')) %>%
  kable(align = c('l', 'l', 'r')) %>% 
  kable_styling(latex_options = 'striped')
## [1] "Obtaining data between 2022-02-28 and 2022-02-28"
segment item value
disponibilidades disponibilidades 1,328,115
direitos creditorios com aquisicao substancial dos riscos e beneficios creditos existentes a vencer e adimplentes 2,019,452,767
valores mobiliarios debentures 3,316,318,260
valores mobiliarios cotas de fundos da ICVM 555 33,731,070
valores mobiliarios outros 11,947,411
outros ativos realizacao ate 12 meses 10,110,399
outros ativos realizacao apos 12 meses 9,388,784
Total
5,402,276,805

2.3.3 Passivos

Os passivos do balanço patrimonial dos fundos podem ser obtidos através da Tabela III:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = fidcs$inicio_atv[1],
           end   = as.Date('2022-03-31'),
           table = 'III') %>%
      group_by(data, segment) %>% 
              summarise(valor = sum(value)) %>% 
      ggplot() +
      aes(x = data, y = valor, fill = segment) +
      geom_bar(position = 'stack', stat     = 'identity') +
      scale_y_continuous(labels = unit_format(unit = "MM", scale = 1e-6)) +
      xlab('Date') +
      ylab('Value (BRL)') +
      theme_minimal() +
      theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank(), axis.text = element_text(size = 9),
            strip.text.x = element_text(size = 9), 
            axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2016-04-20 and 2018-12-31"

E assim como nos ativos, podemos explorar os itens que compõem os segmentos do passivo do fundo:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = fidcs$inicio_atv[1],
           end   = as.Date('2022-03-31'),
           table = 'III') %>%
      group_by(data, segment, item) %>% 
              summarise(valor = sum(value)) %>% 
      ggplot() +
      aes(x = data, y = valor, fill = item) +
      geom_bar(position = 'stack', stat     = 'identity') +
      scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
      xlab('Date') +
      ylab('Value (BRL)') +
      theme_minimal() +
      facet_wrap(~segment, scales = 'free_y') +
      theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank(), axis.text = element_text(size = 9),
            strip.text.x = element_text(size = 9), 
            axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2016-04-20 and 2018-12-31"

E elaborar a tabela dos passivos do mês mais recente:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = as.Date('2022-02-28'),
           end   = as.Date('2022-02-28'),
           table = 'III') %>%
  select(segment, item, value) %>% 
  adorn_totals('row') %>% 
  mutate(value = format(value, big.mark = ',')) %>%
  kable(align = c('l', 'l', 'r')) %>% 
  kable_styling(latex_options = 'striped')
## [1] "Obtaining data between 2022-02-28 and 2022-02-28"
segment item value
valores a pagar curto prazo 30,392,967
valores a pagar longo prazo 7,683,088
posicoes em derivativos mercado a termo posicoes vendidas 0
posicoes em derivativos mercado de opcoes posicoes lancadas 0
posicoes em derivativos mercado futuro ajustes negativos 0
posicoes em derivativos diferencial de swap a pagar 0
Total
38,076,055

2.3.4 Patrimônio Líquido

E após explorar os ativos e passivos, vamos ao patrimônio líquido, cujas únicas variáveis disponíveis na base são o PL e o PL médio dos últimos 3 meses:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = fidcs$inicio_atv[1],
           end   = as.Date('2022-02-28'),
           table = 'IV') %>%
  ggplot() +
  aes(x = data, y = value, color = item) +
  geom_line() +
  scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
  xlab('Date') +
  ylab('Value (BRL)') +
  theme_minimal()
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2016-04-20 and 2018-12-31"

2.3.5 Prazos dos Direitos Creditórios

A Tabela V disponibiliza os volumes financeiros direitos creditórios com aquisição substancial dos riscos e benefícios classificados por prazo de vencimento, por período de inadimplência e pelo período de pagamentos antecipados. Vamos analisar as séries históricas desses dados para os 10 maiores FIDCS:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'V') %>% 
  filter(value > 0) %>% 
  group_by(data, segment, item) %>% 
  summarise(valor = sum(value)) %>% 
  ggplot() +
  aes(x = data, y = valor, fill = item) +
  geom_bar(position = 'stack', stat     = 'identity') +
  scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
  xlab('Date') +
  ylab('Value (BRL)') +
  theme_minimal() +
  facet_wrap(~segment, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

E podemos elaborar os mesmos gráficos para os direitos creditórios sem aquisição substancial dos riscos e benefícios, cujos dados estão disponíveis na Tabela VI:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'VI') %>% 
  filter(value > 0) %>% 
  group_by(data, segment, item) %>% 
  summarise(valor = sum(value)) %>% 
  ggplot() +
  aes(x = data, y = valor, fill = item) +
  geom_bar(position = 'stack', stat     = 'identity') +
  scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
  xlab('Date') +
  ylab('Value (BRL)') +
  theme_minimal() +
  facet_wrap(~segment, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.6 Operações de Direitos Creditórios

A base de dados VII possui as operações de aquisições, alienações, recompras e substituições de direitos creditórios (classificados por com e sem aquisição substancial de riscos e benefícios). Vamos primeiro explorar as quantidades históricas de aquisições, alienações, recompras e substituições dos dez maiores FIDCs:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'VII') %>% 
  filter(item    == 'quantidade',
         value != 0) %>% 
  group_by(data, segment, class) %>% 
  summarise(valor = sum(value)) %>%  
  ggplot() +
  aes(x = data, y = valor, fill = class) +
  geom_bar(position = 'stack', stat     = 'identity') +
  scale_y_continuous(labels = comma) +
  xlab('Date') +
  ylab('Quantidade') +
  theme_minimal() +
  facet_wrap(~segment, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

E abaixo analisamos os valores históricos de aquisições, alienações, recompras e substituições dos dez maiores FIDCs::

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'VII') %>% 
  filter(item    == 'valor',
         value != 0) %>% 
  group_by(data, segment, class) %>% 
  summarise(valor = sum(value)) %>%  
  ggplot() +
  aes(x = data, y = valor, fill = class) +
  geom_bar(position = 'stack', stat     = 'identity') +
  scale_y_continuous(labels = comma) +
  xlab('Date') +
  ylab('Valor (BRL)') +
  theme_minimal() +
  facet_wrap(~segment, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.7 Taxas de Desconto e de Juros

A tabela IX apresenta as taxas de juros e de desconto das aquisições de direitos creditórios, CDBs, valores mobiliários e outros ativos financeiros de renda fixa. O exemplo abaixo plota as informações disponibilizadas para os direitos creditórios com e sem aquisição substancial dos riscos e benefícios de um dos maiores FIDCs em funcionamento:

dados_fidc(cnpj  = '12.428.086/0001-37',
                start = min(fidcs$inicio_atv),
                end   = as.Date('2022-02-28'),
                table = 'IX') %>% 
  filter(segment == 'direitos creditorios sem aquisicao substancial dos riscos e beneficios' |
         segment == 'direitos creditorios com aquisicao substancial dos riscos e beneficios',
         class   == 'taxa de juros dos direitos creditorios',
         value > 0) %>%
  ggplot() +
  aes(x = data, y = value, color = item) +
  geom_point() +
  xlab('Date') +
  ylab('Taxa de Juros') +
  theme_minimal()
## Warning in dados_fidc(cnpj = "12.428.086/0001-37", start =
## min(fidcs$inicio_atv), : Data unavailable for selected start date. Setting start
## date to 2013-01-01.
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.8 Quantidade de Cotistas por Série/Classe

Através da base X_1 de dados podemos obter o histórico de cotistas por classe/série, conforme demonstra o script abaixo:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'X_1') %>%
  filter(value > 0) %>% 
  ggplot() +
  aes(x = data, y = value, fill = serie) +
  geom_bar(position = 'stack', stat = 'identity') +
  xlab('Date') +
  ylab('Quantidade') +
  theme_minimal() +
  facet_wrap(~cnpj, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.9 Classificação dos Cotistas

A base X_1_1, (disponível apenas para dados após novembro de 2019) possui as classificações dos cotistas das cotas sênior e subordinada. Abaixo estão as composição históricadas cotas sênior:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'X_1_1') %>% 
  filter(class == 'classe senior',
         value > 0) %>% 
  group_by(data, cnpj, item) %>% 
  summarise(value = sum(value)) %>% 
  ggplot() +
  aes(x = data, y = value, fill = item) +
  geom_bar(position = 'stack', stat = 'identity') +
  xlab('Date') +
  ylab('Quantidade') +
  theme_minimal() +
  facet_wrap(~cnpj, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-11-30 and 2022-02-28"

E, a seguir, das cotas subordinadas:

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'X_1_1') %>% 
  filter(class == 'classe subordinada',
         value > 0) %>% 
  group_by(data, cnpj, item) %>% 
  summarise(value = sum(value)) %>% 
  ggplot() +
  aes(x = data, y = value, fill = item) +
  geom_bar(position = 'stack', stat = 'identity') +
  xlab('Date') +
  ylab('Quantidade') +
  theme_minimal() +
  facet_wrap(~cnpj, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## Warning in dados_fidc(cnpj = fidcs$cnpj, start = min(fidcs$inicio_atv), : Data
## unavailable for selected start date. Setting start date to 2013-01-01.
## [1] "Obtaining data between 2019-11-30 and 2022-02-28"

2.3.10 Valor das Cotas

Através da tabela X_2 é possível obter o valor das cotas (no exemplo abaixo, por série/classe e CNPJ)

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'X_2') %>% 
  filter(value > 0,
         class == 'valor da cota') %>% 
  ggplot() +
  aes(x = data, y = value, color = serie) +
  geom_line() +
  xlab('Date') +
  ylab('Valor da Cota (BRL)') +
  scale_y_continuous(label = comma) +
  theme_minimal() +
  facet_wrap(~cnpj, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.11 Rentabilidade das Cotas

A tabela X_3 possui uma única variável, apresentada abaixo: a rentabilidade apurada no mês.

dados_fidc(cnpj  = fidcs$cnpj,
           start = min(fidcs$inicio_atv),
           end   = as.Date('2022-02-28'),
           table = 'X_3') %>% 
  filter(value > 0) %>% 
  ggplot() +
  aes(x = data, y = value, color = serie) +
  geom_line() +
  xlab('Date') +
  ylab('Rentabilidade Apurada no Mês') +
  scale_y_continuous(label = comma) +
  theme_minimal() +
  facet_wrap(~cnpj, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"

2.3.12 Operações de Cotas

Através da tabela X_4 podemos visualizar as captações, amortizações e resgates históricos. No exemplo abaixo, obtemos os dados para o maior FIDC, transformamos os valores de amortizações e resgates em negativos e elaboramos o gráfico:

dados_fidc(cnpj  = fidcs$cnpj[1],
           start = fidcs$inicio_atv[1],
           end   = as.Date('2022-02-28'),
           table = 'X_4') %>% 
      filter(value > 0) %>% 
      mutate(value = case_when(operacao  == 'Amortizações' | 
                               operacao  == 'Resgates no Mês' ~ - value,
                               TRUE ~ value)) %>% 
      ggplot() +
      aes(x = data, y = value, fill = operacao) + 
      geom_bar(position = 'stack', stat = 'identity') +
      scale_y_continuous(label = comma) +
      xlab('Date') +
      ylab('Valor (BRL)') +
      theme_minimal() +
      theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
            legend.title = element_blank(), axis.text = element_text(size = 9),
            strip.text.x = element_text(size = 9), 
            axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2016-04-20 and 2018-12-31"

2.3.13 Liquidez de Ativos

Já a tabela X_5 disponibiliza informações sobre a liquidez de ativos do fundo. Através do código abaixo visualizam-se os ativos dos dez maiores FIDCs classificados pela liquidez que possuem esses dados.

dados_fidc(cnpj  = fidcs$cnpj,
           start      = min(fidcs$inicio_atv),
           end        = as.Date('2022-02-28'),
           table      = 'X_5') %>% 
  filter(value != 0) %>% 
  group_by(data, cnpj, item) %>% 
  summarise(value = sum(value)) %>% 
  ggplot() +
  aes(x = data, y = value, fill = item) + 
  geom_bar(position = 'stack', stat = 'identity') +
  scale_y_continuous(labels = unit_format(unit = "Bi", scale = 1e-9)) +
  xlab('Date') +
  ylab('Valor (BRL)') +
  theme_minimal() +
  facet_wrap(~cnpj, scales = 'free_y') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.1, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## Warning in dados_fidc(cnpj = fidcs$cnpj, start = min(fidcs$inicio_atv), : Data
## unavailable for selected start date. Setting start date to 2013-01-01.
## [1] "Obtaining data between 2019-01-01 and 2022-02-28"
## [1] "Obtaining data between 2013-01-01 and 2018-12-31"
## `summarise()` has grouped output by 'data', 'cnpj'. You can override using the
## `.groups` argument.

2.3.14 Taxas de Desempenho

A base de dados X_6 possui as taxas de desempenho real e esperada. No gráfico abaixo visualizamos ambas as taxas para cada classe de cotas de um dos maiores FIDCs em funcionamento:

dados_fidc(cnpj       = fidcs$cnpj[2],
           start      = fidcs$inicio_atv[2],
           end        = as.Date('2022-02-28'),
           table      = 'X_6') %>% 
  ggplot() +
  aes(x = data, y = value, color = item) +
  geom_line() +
  facet_wrap(~serie, scales = 'free_y') +
  theme_minimal() +
  xlab('Data') +
  ylab('Taxa') +
  theme(legend.position = 'bottom', legend.key.size = unit(0.8, 'cm'),
        legend.title = element_blank(), axis.text = element_text(size = 9),
        strip.text.x = element_text(size = 9), 
        axis.title = element_text(size = 9))
## [1] "Obtaining data between 2020-06-22 and 2022-02-28"

2.3.15 Garantias

A base de dados X_7 possui informações acerca das garantias dos direitos creditórios, porém com dados disponível apenas a partir de novembro de 2019:

dados_fidc(cnpj  = '17.250.006/0001-10',
           start = as.Date('2019-01-01'),
           end   = as.Date('2022-02-28'),
           table = 'X_7') %>% 
  ggplot() +
  aes(x = data, y = value, color = item) +
  geom_line() +
  facet_wrap(~item, scales = 'free_y') +
  theme_minimal() +
  xlab('Data') +
  ylab('Taxa') +
  scale_y_continuous(label = comma) +
  theme(legend.position = 'none',
  legend.title = element_blank(), axis.text = element_text(size = 9),
  strip.text.x = element_text(size = 9), 
  axis.title = element_text(size = 9))
## [1] "Obtaining data between 2019-11-30 and 2022-02-28"

Referências

Avelleda, Lucas. 2022. dadosCVM: Obtains Investment Funds’ Data from CVM. https://github.com/lucasan93/dadosCVM.
Firke, Sam. 2021. Janitor: Simple Tools for Examining and Cleaning Dirty Data. https://CRAN.R-project.org/package=janitor.
R Core Team. 2020. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org.
Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
———. 2019. Stringr: Simple, Consistent Wrappers for Common String Operations. https://CRAN.R-project.org/package=stringr.
Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2021. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.
Wickham, Hadley, and Dana Seidel. 2020. Scales: Scale Functions for Visualization. https://CRAN.R-project.org/package=scales.
Zhu, Hao. 2021. kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax. https://CRAN.R-project.org/package=kableExtra.