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:

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.
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 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:
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:
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_CVMno 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
BPAporDRE, obtendo receita, custos e lucro líquido, ou porDFC_MI, obtendo o fluxo de caixa. - Indicadores: cruzando o lucro líquido da
DREcom o patrimônio líquido doBPPpela chaveCD_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.
Leia também: