Como Analisar Demonstrativos Financeiros e Dados da CVM

Como obter dados de companhias brasileiras? Isso é possível utilizando os dados ITR e DFP disponibilizados publicamente pela CVM, que reúnem informações financeiras e contábeis das companhias abertas brasileiras. Neste tutorial, mostramos onde encontrar esses dados, como baixar e descompactar os arquivos, como importar o .csv sem problemas de acentuação, entender como as informações estão organizadas e selecionar a empresa e a conta contábil que queremos analisar.
Como obter dados de companhias brasileiras? Isso é possível utilizando os dados ITR e DFP disponibilizados publicamente pela CVM, que reúnem informações financeiras e contábeis das companhias abertas brasileiras.

Neste tutorial, vamos mostrar onde encontrar esses dados, como baixar e descompactar os arquivos, como importar o .csv corretamente sem problemas de acentuação, entender como as informações estão organizadas e selecionar a empresa e a conta contábil que queremos analisar.

Ao final, aplicamos o procedimento em quatro empresas do setor elétrico e comparamos o patrimônio líquido de cada uma:

Gráfico de barras do patrimônio líquido das maiores elétricas brasileiras extraído dos demonstrativos financeiros da CVM com Python: Axia com R$ 118,5 bilhões, contra Cemig, CPFL e Copel
Patrimônio líquido consolidado das quatro maiores elétricas de capital aberto, extraído da DFP de 2025 da CVM.

O gráfico compara as quatro empresas pela mesma conta contábil, extraída do arquivo da CVM. As seções seguintes percorrem o caminho até ele.

💡 Quer obter o código completo deste exercício?

O notebook pronto para rodar (download do arquivo da CVM, leitura do balanço patrimonial, filtro por empresa e a comparação setorial do patrimônio líquido) está disponível na página abaixo.

Obter o notebook completo →

Veja a aula completa em vídeo

A aula abaixo percorre o mesmo caminho deste artigo, da coleta do arquivo da CVM até a comparação entre as empresas.

O balanço patrimonial, a coleta do arquivo da CVM e a análise das contas no Python.

O que é o balanço patrimonial

O balanço patrimonial apresenta a posição patrimonial e financeira de uma empresa em um dado momento. É uma informação estática, referente a uma data específica, quase sempre 31 de dezembro, e descreve a situação da empresa no fechamento do exercício.

Ele possui três componentes, relacionados por uma identidade contábil: o ativo é igual ao passivo somado ao patrimônio líquido. Os recursos que a empresa possui foram financiados por credores ou pelos sócios.

No ativo estão as aplicações de recursos da empresa, os itens que prometem geração de benefícios econômicos futuros. A classificação segue a liquidez: o circulante se converte em caixa em até um ano (caixa, contas a receber, estoques) e o não circulante possui prazo maior (imobilizado, investimentos, intangível).

O passivo reúne as obrigações da empresa perante terceiros, geradas por eventos passados, cuja liquidação futura exigirá desembolso de caixa. A classificação segue a mesma divisão de prazo: circulante para o que vence em até um ano, não circulante para o que vence depois.

O patrimônio líquido corresponde à diferença entre o ativo e o passivo. É o valor contábil pertencente aos sócios, formado pelo capital investido pelos acionistas somado aos lucros retidos ao longo dos exercícios.

Onde encontrar os dados

A CVM publica dois conjuntos de dados com as demonstrações das companhias abertas. A DFP (Demonstrações Financeiras Padronizadas) traz o exercício anual, e a ITR (Informações Trimestrais) traz os trimestres. Ambos seguem a mesma estrutura de colunas, o que permite usar o mesmo código para os dois.

Utilizamos a DFP neste tutorial, por trazer o balanço fechado do ano. Os arquivos estão no Portal de Dados Abertos da CVM, organizados em um .zip por ano:

https://dados.cvm.gov.br/dados/CIA_ABERTA/DOC/DFP/DADOS/dfp_cia_aberta_2025.zip

Apenas o ano no final do endereço muda de um arquivo para o outro, o que permite montar a URL a partir de uma variável e baixar vários exercícios em sequência. O endereço da ITR segue o mesmo padrão, substituindo DFP por ITR.

O arquivo de 2025 possui 12,8 MB e contém 19 arquivos .csv, um para cada demonstração. Os principais:

Arquivo dentro do .zip Conteúdo
dfp_cia_aberta_BPA_con_2025.csv Balanço patrimonial ativo, consolidado
dfp_cia_aberta_BPP_con_2025.csv Balanço patrimonial passivo e patrimônio líquido, consolidado
dfp_cia_aberta_DRE_con_2025.csv Demonstração do resultado do exercício
dfp_cia_aberta_DFC_MI_con_2025.csv Demonstração do fluxo de caixa, método indireto

O sufixo con indica o consolidado, que soma a empresa às suas controladas, e ind indica o individual, apenas a controladora. Para analisar um grupo econômico, utilizamos o consolidado. O ativo e o passivo estão em arquivos separados, e o patrimônio líquido consta no arquivo BPP, por ser a contrapartida do ativo na identidade contábil.

Quanto ao ano a utilizar, as companhias entregam a DFP nos primeiros meses do ano seguinte ao exercício. O arquivo do ano corrente permanece incompleto até essas entregas, e por isso selecionamos o último exercício encerrado.

Como baixar e descompactar os arquivos

A coleta possui duas etapas. A biblioteca wget baixa o arquivo a partir da URL e retorna o nome do arquivo salvo em disco. Em seguida, a classe ZipFile, que já acompanha o Python, abre o .zip, e o método extractall() descompacta os 19 arquivos .csv em uma pasta local.

Recomendamos extrair para uma pasta nomeada por ano, em vez de utilizar o diretório de trabalho. Ao baixar o exercício seguinte, os arquivos permanecem separados.

Como o arquivo está estruturado

Antes de importar o arquivo com o pandas, examinamos seu conteúdo. As primeiras linhas do .csv do ativo, no formato em que a CVM disponibiliza:

CNPJ_CIA;DT_REFER;VERSAO;DENOM_CIA;CD_CVM;GRUPO_DFP;MOEDA;ESCALA_MOEDA;ORDEM_EXERC;DT_FIM_EXERC;CD_CONTA;DS_CONTA;VL_CONTA;ST_CONTA_FIXA
00.000.000/0001-91;2025-12-31;1;BCO BRASIL S.A.;001023;DF Consolidado - Balanço Patrimonial Ativo;REAL;MIL;PENÚLTIMO;2024-12-31;1;Ativo Total;2398719197.0000000000;S
00.000.000/0001-91;2025-12-31;1;BCO BRASIL S.A.;001023;DF Consolidado - Balanço Patrimonial Ativo;REAL;MIL;ÚLTIMO;2025-12-31;1;Ativo Total;2455143253.0000000000;S
00.000.000/0001-91;2025-12-31;1;BCO BRASIL S.A.;001023;DF Consolidado - Balanço Patrimonial Ativo;REAL;MIL;PENÚLTIMO;2024-12-31;1.01;Caixa e Equivalentes de Caixa;83167243.0000000000;S

Essas linhas indicam três características que determinam como importar o arquivo.

O separador de colunas é o ponto e vírgula, e não a vírgula que o pandas utiliza por padrão. Sem o parâmetro sep=';', a importação resulta em uma única coluna, cujo nome é a linha de cabeçalho inteira: CNPJ_CIA;DT_REFER;VERSAO;DENOM_CIA;.... A leitura não retorna erro, e a falha aparece adiante, ao acessar uma coluna inexistente.

A codificação é latin-1, utilizada pelos sistemas do governo brasileiro. A importação como UTF-8 gera a exceção UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7, correspondente ao "ç" de "Balanço". O parâmetro encoding='ISO-8859-1' resolve a acentuação.

Os valores decimais utilizam vírgula, conforme o padrão brasileiro, o que requer o parâmetro decimal=','.

A coluna ESCALA_MOEDA apresenta o valor MIL, indicando que os montantes estão expressos em milhares de reais. O ativo total do Banco do Brasil consta como 2455143253, equivalente a R$ 2,45 trilhões. A conversão para a unidade desejada requer atenção a essa escala.

Conversão da coluna de valores

Nas versões recentes do pandas, a coluna VL_CONTA pode ser importada como texto, mesmo com o parâmetro decimal=',' declarado, em função da mudança na inferência de tipos. O código executa sem erro, porém a ordenação passa a ser alfabética: o valor 118501657 antecede 28581703, pois o caractere "1" precede o "2". A conversão explícita com pd.to_numeric(), logo após a importação, garante o tipo numérico.

Como as informações estão organizadas

Importado, o arquivo do ativo resulta em uma tabela de 59.388 linhas por 14 colunas, referente a 438 companhias. A estrutura é do tipo longo: cada linha corresponde a uma conta contábil de uma empresa em um exercício. Cada companhia ocupa, em mediana, 134 linhas.

As colunas utilizadas na análise:

Coluna Exemplo Conteúdo
CD_CVM 001023 Identificador da empresa na CVM
DENOM_CIA BCO BRASIL S.A. Razão social da companhia
CD_CONTA 1.01 Código hierárquico da conta contábil
DS_CONTA Caixa e Equivalentes de Caixa Descrição da conta
VL_CONTA 83167243 Valor, na escala indicada
ESCALA_MOEDA MIL Unidade ou milhares de reais
ORDEM_EXERC ÚLTIMO Exercício de referência ou o anterior
DT_FIM_EXERC 2025-12-31 Data de encerramento do exercício

Duas dessas colunas requerem tratamento específico, conforme as linhas apresentadas acima.

A coluna ORDEM_EXERC classifica o exercício. Nas linhas do exemplo, a conta 1 — Ativo Total do Banco do Brasil aparece duas vezes: uma com PENÚLTIMO, encerrada em 2024-12-31, e outra com ÚLTIMO, encerrada em 2025-12-31. Cada arquivo contém dois exercícios para permitir comparação, e cada conta consta em duplicidade. Sem o filtro nessa coluna, as somas ficam duplicadas. A Axia Energia, por exemplo, ocupa 164 linhas no arquivo, e o filtro pelo exercício de referência resulta nas 82 linhas do balanço do ano.

A coluna CD_CONTA utiliza codificação hierárquica. O código 1 corresponde ao ativo total, 1.01 ao ativo circulante e 1.01.01 ao caixa dentro do circulante. Cada nível já está somado no nível superior, e a soma da coluna inteira contabiliza os mesmos valores repetidamente. Para obter totais, filtramos um nível por vez: CD_CONTA == '1' retorna o ativo total, e a lista ['1', '1.01', '1.02'] retorna a estrutura de primeiro nível.

Como selecionar a empresa

Com a tabela importada, selecionamos a companhia. A busca pela razão social, com .str.contains(), atende à consulta exploratória, quando ainda não sabemos como a empresa consta no cadastro.

Para a consulta definitiva, utilizamos o CD_CVM. A razão social se altera em casos de rebranding, fusão e reestruturação societária, enquanto o código acompanha a empresa nessas mudanças. A Axia Energia S.A. possui o código 2437, e a busca pelo texto "Eletrobras" no arquivo de 2025 retorna uma tabela vazia, sem mensagem de erro e sem interromper a execução. Em uma rotina automatizada, esse filtro produziria um relatório em branco.

O procedimento recomendado consiste em identificar o código uma vez pela razão social e utilizá-lo nas consultas seguintes. Com os filtros CD_CVM == 2437 e ORDEM_EXERC == 'ÚLTIMO', obtemos o balanço da empresa.

O balanço patrimonial obtido

Selecionando os três primeiros níveis da hierarquia de contas, obtemos a estrutura do ativo:

Conta Descrição R$ bilhões % do ativo
1 Ativo Total 279,7 100,0%
1.01 Ativo Circulante 52,1 18,6%
1.02 Ativo Não Circulante 227,6 81,4%

Os R$ 279,7 bilhões correspondem ao valor 279685593 da coluna VL_CONTA, dividido por um milhão em razão da escala MIL. O ativo não circulante representa 81,4% do total, composição compatível com uma geradora e transmissora de energia, cujos recursos estão aplicados em usinas, linhas de transmissão e concessões. Um banco ou uma companhia varejista apresentariam composição distinta.

Como comparar empresas pela mesma conta

Substituindo o arquivo do ativo pelo do passivo e filtrando a conta Patrimônio Líquido Consolidado, obtemos a comparação setorial. Utilizando uma lista de razões sociais no lugar de um código único, o mesmo filtro atende a quatro empresas, e o método pivot_table() reorganiza o resultado com as companhias nas linhas:

Empresa Patrimônio líquido (R$ bilhões)
Axia Energia 118,5
Cemig 28,6
CPFL Energia 23,5
Copel 23,1

A Axia Energia apresenta R$ 118,5 bilhões de patrimônio líquido, valor superior à soma das outras três companhias, de R$ 75,2 bilhões. A diferença é compatível com a escala de uma empresa que reúne o maior parque gerador e a maior malha de transmissão do país.

Cabe registrar que o patrimônio líquido é uma medida contábil, apurada sobre o valor histórico dos ativos, e não corresponde ao valor de mercado da companhia. Uma empresa pode ser negociada em bolsa acima ou abaixo desse valor, e o índice preço/valor patrimonial mede essa relação.

Como adaptar o código para outras análises

O mesmo procedimento atende a outras consultas, com a alteração de um parâmetro por vez.

  • Outra empresa: alteramos o CD_CVM no filtro.
  • Outro período: alteramos o ano na URL e no nome do arquivo. Um laço de repetição sobre uma lista de anos monta a série histórica de qualquer conta. Para dados trimestrais, utilizamos os arquivos da ITR.
  • Outra demonstração: substituímos BPA por DRE, obtendo receita, custos e lucro líquido, ou por DFC_MI, obtendo o fluxo de caixa.
  • Indicadores: cruzando o lucro líquido da DRE com o patrimônio líquido do BPP pela chave CD_CVM, calculamos o ROE de todas as empresas do arquivo.

Considerações finais

Com algumas dezenas de linhas de Python e dados públicos, obtemos o balanço de qualquer companhia aberta brasileira e comparamos concorrentes pelo mesmo critério contábil. O procedimento fica registrado em um arquivo que pode ser auditado e reexecutado, e a repetição da análise no exercício seguinte requer apenas a alteração do ano na URL.

O Python reúne as etapas em uma única linguagem: baixa o arquivo, trata a tabela, calcula o indicador e gera o gráfico, sem alternar entre navegador, planilha e ferramenta de visualização.

O mesmo caminho — coletar, tratar, filtrar e comparar — se aplica a boa parte dos problemas de análise financeira. O que muda é a aplicação:

  • Analista de investimentos: calcula indicadores fundamentalistas como ROE, margem e endividamento para uma carteira inteira, em vez de empresa por empresa.
  • Analista de crédito: acompanha a estrutura de endividamento e a liquidez de contrapartes ao longo de vários exercícios, com critério idêntico para todas.
  • Contador e auditor: compara as contas de uma empresa com as de seus pares do setor para identificar divergências em relação ao padrão.
  • Economista setorial: agrega o balanço de dezenas de companhias para medir investimento, alavancagem e capacidade instalada de um setor.

Aprender a linguagem é o que abre a porta para todas essas frentes.

Você viu como funciona. Aprenda a construir do zero.

A formação Do Zero à Análise de Dados Econômicos e Financeiros usando Python e IA parte sem nenhum pré-requisito e percorre exatamente este caminho: coleta de dados públicos, tratamento com pandas, cálculo de indicadores e visualização. Quem quer acesso a todas as formações tem o AM Black, a assinatura anual.

Conheça a formação →Ver o AM Black →

Leia também:

 

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print
Análise Macro © 2011 / 2026

comercial@analisemacro.com.br – Rua Visconde de Pirajá, 414, Sala 718
Ipanema, Rio de Janeiro – RJ – CEP: 22410-002

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp