Dados Corporativos no R

Palestra UFF

Marcelo S. Perlin

EA-UFRGS

06/04/2027

Quem sou

Prazer!

Professor Associado na EA/UFRGS/PPGA, com mais de 15 anos de carreira em análise de dados voltada a ciência, finanças quantitativas e consultoria para empresas e órgãos públicos.

  • Apaixonado por análise de dados, programação e investimentos.
  • Desenvolvedor e consultor em R e Python.
  • Autor de diversos pacotes de código aberto no R: yfR, GetTDData, GetBCBData, etc.
  • Autor de livros sobre análise de dados e investimentos
  • Contato

Livro sobre R

Links disponíveis na página pessoal

Porque aprender programação?

Introdução

  • Automatizar tarefas repetitivas (menos trabalho, mais pensamento)
  • Minimizaçao de erro humano (menos erros, mais confiança)
  • Eficiência em reprodução de resultados de pesquisa;
  • Ter controle total sobre o processo de análise, incluindo dependências de software;
  • Ter acesso a uma variedade imensa de dados públicos e pacotes de código aberto;
  • Vantagem competitiva no mercado de trabalho.

Sobre o R

O que é o R

Ross Ihaka and Robert Gentleman. R: A language for data analysis and graphics. Journal of Computational and Graphical Statistics, 5(3):299–314, 1996.

Por que Escolher o R

  • R é uma plataforma madura, estável, continuamente suportada;
  • Linguagem estruturada, prática e fácil de aprender;
  • As interfaces de programação (RStudio/positron/vscode) facilitam o processo, principalmente para iniciantes;
  • Os pacotes do R permitem as mais diversas funcionalidades além da análise de dados, como:
    • Mandar email, contar piadas, fazer sites, criar relatórios estruturados, fazer provas, …
  • O R tem compatibilidade com diferentes linguagens e sistemas operacionais (Windows, Linux, Mac).
  • O R é totalmente gratuito e vai se manter assim!

Os sistemas da B3 e da CVM

Documentos financeiros e pesquisa

Demonstrações financeiras representam o pilar central nos dados de estudos de finanças corporativas. “Accessing financial reports and corporate events with GetDFPData”, RBFIN 2019

  • em selecionadas revistas Qualis A2/B1, em torno de 70% dos estudos de finanças entre 2013-2017 se utilizaram do economática
  • O economática, na época, só permitia operações do tipo copia e cola
  • A B3 oferece acesso público aos seus conjuntos de dados em quatro sistemas diferentes: DFP, ITR, FRE e FCA, mas com várias limitações para o acesso em larga escala.

DFP e FRE (Exemplo para Petrobrás )

Sistema DFP

Sistema FRE

Dados da CVM

Portal de Dados CVM

Pacotes GetDFPData2 e GetFREData

  • GetDFPData2 fornece uma interface R aberta para todas as demonstrações financeiras anuais distribuídas pela B3 e CVM:
    • Demonstrativos de Resultados do Exercício (DRE)
    • Balanço Patrimonial (BP)
    • Demonstração de Fluxo de Caixa (DFC)
    • Demonstração de Mutações do Patrimônio Líquido (DMPL)
    • Demonstração das Valor Agregado (DVA)
  • GetFREData permite download de tabelas do sistema FRE (Formulário de Referência):
    • controle acionário
    • membros e remuneração do conselho de administração
    • relações familiares
    • várias outras tabelas (30+)..

Exemplo pacote GetDFPData2

Passo 01: instalar requisitos

  1. instalar R e RStudio para o seu sistema operacional
  2. abrir o Rstudio e, no prompt, instalar o pacote GetDFPData2 com os comandos abaixo
# usando base R
install.packages("GetDFPData2")

# usando pak (+ moderno)
pak::pak("GetDFPData2")

# versão no github (mais recente, mais instável)
pak::pak("msperlin/GetDFPData2")

Passo 02: baixar dados das empresas disponíveis

  • Função get_info_companies() baixa e carrega arquivo csv da CVM, com informações das empresas disponíveis atualmente no sistema DFP
df_info <- GetDFPData2::get_info_companies()
  • Resultado é uma tabela com diversas informações sobre as empresas listadas na B3, como código CVM, nome, setor, segmento, data de abertura, etc.:

Amostra das 2675 empresas disponíveis no sistema DFP

Tabela de empresas disponíveis no sistema DFP (amostra de colunas)
CNPJ DENOM_SOCIAL DENOM_COMERC DT_REG DT_CONST
08.773.135/0001-00 2W ECOBANK S.A. - EM RECUPERAÇÃO JUDICIAL 2W ECOBANK S.A. 2020-10-29 2007-03-23
11.396.633/0001-87 3A COMPANHIA SECURITIZADORA TRIPLO A COMPANHIA SECURITIZADORA 2010-03-08 2009-11-03
01.547.749/0001-16 521 PARTICIPAÇOES S.A. - EM LIQUIDAÇÃO EXTRAJUDICIAL 521 PARTICIPAÇÕES S/A 1997-07-11 1996-07-30
01.851.771/0001-55 524 PARTICIPAÇOES SA 524 PARTICIPACOES SA 1997-05-30 1997-04-02
01.919.008/0001-19 525 PARTICIPAÇOES SA 525 PARTICIPACOES SA 1997-07-16 1997-04-02

Passo 03: identificar empresas

  • A identificação das empresas é feita por meio do código CVM, que é um número inteiro único para cada empresa listada na B3.

  • Para procurar o código CVM de uma empresa, pode-se usar a função search_company(), que permite buscar por nome ou parte do nome da empresa.

df_search <- GetDFPData2::search_company(
  "grendene"
  )
  • O código da Grendene é 19615, e o nome oficial é GRENDENE SA

Passo 04: baixar os dados

  • Os dados podem ser baixados para uma ou mais empresas, usando a função get_dfp_data(), que requer o código CVM da empresa e o período de interesse (ano inicial e ano final).
l_dfp <- GetDFPData2::get_dfp_data(
  companies_cvm_codes = 19615,
  first_year = 2020,
  last_year = 2025
)
  • A saída é uma lista l_dfp com os dados organizados por tipo de demonstração financeira (DRE, BP, DFC, etc.) e por forma de apresentação (consolidado ou individual).

Passo 05: checar os dados

dre_con <- l_dfp$`DF Consolidado - Demonstração do Resultado`
DRE Consolidado da Grendene
CD_CVM DENOM_CIA DT_REFER CD_CONTA DS_CONTA VL_CONTA
19615 GRENDENE S.A. 2020-12-31 3.01 Receita de Venda de Bens e/ou Serviços $1,896,785.00
19615 GRENDENE S.A. 2020-12-31 3.02 Custo dos Bens e/ou Serviços Vendidos −$1,022,330.00
19615 GRENDENE S.A. 2020-12-31 3.03 Resultado Bruto $874,455.00
19615 GRENDENE S.A. 2020-12-31 3.04 Despesas/Receitas Operacionais −$573,256.00
19615 GRENDENE S.A. 2020-12-31 3.04.01 Despesas com Vendas −$431,846.00
19615 GRENDENE S.A. 2020-12-31 3.04.02 Despesas Gerais e Administrativas −$77,471.00
19615 GRENDENE S.A. 2020-12-31 3.04.03 Perdas pela Não Recuperabilidade de Ativos $0.00
19615 GRENDENE S.A. 2020-12-31 3.04.04 Outras Receitas Operacionais $7,906.00
19615 GRENDENE S.A. 2020-12-31 3.04.05 Outras Despesas Operacionais −$71,850.00
19615 GRENDENE S.A. 2020-12-31 3.04.05.01 Recorrentes −$23,870.00

Passo 06: analisar margem de lucro

tbl_ml <- dre_con |>
  dplyr::group_by(CD_CVM, DENOM_CIA, DT_REFER) |>
  dplyr::reframe(
    Vendas = VL_CONTA[CD_CONTA == "3.01"], # Receita Líq
    LL = VL_CONTA[CD_CONTA == "3.11"], # Lucro Líquido
    margem_liq =  LL/Vendas
  ) 
Margem de Lucro da Grendene
CD_CVM DENOM_CIA DT_REFER Vendas LL margem_liq
19615 GRENDENE S.A. 2020-12-31 1896785 405206 21.36%
19615 GRENDENE S.A. 2021-12-31 2342546 601005 25.66%
19615 GRENDENE S.A. 2022-12-31 2512656 568027 22.61%
19615 GRENDENE S.A. 2023-12-31 2433607 557671 22.92%
19615 GRENDENE S.A. 2024-12-31 2628580 735236 27.97%
19615 GRENDENE S.A. 2025-12-31 2584341 644808 24.95%

Pacote GetDFPData2 – Exemplo 02 (todas empresas)

  • Passo 01 - baixar dados de todas empresas
ids <- df_info$CD_CVM |> 
  unique()

l_dfp <- GetDFPData2::get_dfp_data(
    companies_cvm_codes = ids,
    first_year = 2020,
    last_year = 2025,
    type_docs = "DRE"
)

dre_con <- l_dfp$`DF Consolidado - Demonstração do Resultado`

Passo 02 - calcular margens de lucro

tbl_ml_all <- dre_con |>
  dplyr::group_by(CD_CVM, DENOM_CIA, DT_REFER) |>
  dplyr::reframe(
    Vendas = VL_CONTA[CD_CONTA == "3.01"], # Receita Líq
    LL = VL_CONTA[CD_CONTA == "3.11"], # Lucro Líquido
    margem_liq =  LL/Vendas
  ) 

Grafico de margens de lucro da Grendene

Margem de lucro de todas as empresas (2020-2025)

Margem de Lucro de todas as empresas
CD_CVM DENOM_CIA DT_REFER Vendas LL margem_liq
94 PANATLANTICA S.A. 2020-12-31 1436306 182494 12.71%
94 PANATLANTICA S.A. 2021-12-31 2668221 293348 10.99%
94 PANATLANTICA S.A. 2022-12-31 2331132 55693 2.39%
94 PANATLANTICA S.A. 2023-12-31 1879266 13418 0.71%
94 PANATLANTICA S.A. 2024-12-31 2109725 84659 4.01%
94 PANATLANTICA S.A. 2025-12-31 1928530 49866 2.59%
701 BAHEMA EDUCAÇÃO S.A. 2020-12-31 196345 -45698 −23.27%
701 BIOMA EDUCAÇÃO S.A. 2021-12-31 266668 -38182 −14.32%
701 BIOMA EDUCAÇÃO S.A. 2022-12-31 357122 -114068 −31.94%
701 BIOMA EDUCAÇÃO S.A. 2023-12-31 377697 -6692 −1.77%

Gráfico de margens de lucro de todas as empresas

Exemplo pacote GetFREData

Passo 01: baixar dados da Grendene

  • Funcão get_fre_data2() baixa e limpa os dados do sistema FRE
# download data
l_fre <- GetFREData::get_fre_data2(
  first_year = 2025,
  last_year = 2025
)

Passo 02 - checar os dados

  • 10 primeiros elementos (são 36 no total)
names(head(l_fre, n = n_tbls))
 [1] "fre_cia_aberta"                                     
 [2] "fre_cia_aberta_acao_entregue"                       
 [3] "fre_cia_aberta_administrador_PCD"                   
 [4] "fre_cia_aberta_administrador_declaracao_genero"     
 [5] "fre_cia_aberta_administrador_declaracao_raca"       
 [6] "fre_cia_aberta_administrador_membro_conselho_fiscal"
 [7] "fre_cia_aberta_auditor"                             
 [8] "fre_cia_aberta_capital_social"                      
 [9] "fre_cia_aberta_capital_social_classe_acao"          
[10] "fre_cia_aberta_capital_social_titulo_conversivel"   

Passo 03- analisar posição acionária

df_stockholders <- l_fre$fre_cia_aberta_posicao_acionaria
last_year <- max(df_stockholders$data_referencia)

current_stockholders <- df_stockholders |>
  dplyr::filter(
    data_referencia == last_year,
    nome_companhia == "GRENDENE S.A."
    ) |>
  dplyr::select(
    id_acionista,
    acionista,
    percentual_acao_ordinaria_circulacao
    ) |>
  dplyr::arrange(
    dplyr::desc(percentual_acao_ordinaria_circulacao)
  )

Posição acionária da Grendene (dados para o ano de referência 2025-12-31)

Acionistas da GRENDENE
Dados para 2025-12-31
id_acionista acionista percentual_acao_ordinaria_circulacao
8011997 UNION SUPER FUNDO DE INVESTIMENTO FINANCEIRO EM AÇÕES 42.850
8012003 Outros 27.015
8011996 PEDRO GRENDENE BARTELLE 14.453
8011994 GIOVANA BARTELLE 4.116
8011992 ANDRÉ DE CAMARGO BARTELLE 3.884
8011993 GABRIELLA DE CAMARGO BARTELLE 3.852
8011995 PEDRO BARTELLE 3.831
8011998 ALEXANDRE GRENDENE BARTELLE 0.000
8011999 Ações Tesouraria 0.000
8012000 Outros 0.000
8012002 Ações Tesouraria 0.000

O que aprendi nesse processo

  • Existe uma variedade imensa de dados públicos que podem ser usados em pesquisa
  • Raspagem de dados de sites é momentânea e não-sustentável!
    • procura uma maneira oficial de coletar dados, preferência por APIs oficiais, ou pacotes de código aberto que já fazem isso
    • evite raspar dados da B3!
  • Cuidado com os dados que são raspados sem consentimento!
  • O código vai evoluir, quanto mais simples, melhor..

Obrigado!