Análise Fundamentalista usando o Python

Neste artigo, abordaremos como criar indicadores de análise fundamentalista utilizando a linguagem de programação Python. Demonstraremos como coletar dados financeiros de empresas pertencentes ao setor Farmacêutico e de Higiene e, em seguida, construiremos indicadores de eficiência com base nesses dados.

Para adquirir os demonstrativos financeiros das empresas, é essencial coletar os dados diretamente do site de Dados Abertos da CVM, através do seguinte link. Os arquivos estão compactados em formato zip e devem ser descompactados para obter os arquivos .csv. Além disso, é preciso criar um loop para baixar os dados de todos os anos disponíveis. Para facilitar esse procedimento, utilizamos a seguinte função, que automatiza o processo.

1. Carrega os pacotes


# Carrega as bibliotecas
import wget # biblioteca para realizar o download de sites 
import pandas as pd # biblioteca para manipulação de dados e data frames
from zipfile import ZipFile # biblioteca para extrair arquivo zipados
from plotnine import * # biblioteca para construir o gráfico

2. Cria função para coletar demonstrativos da CVM

def download_extract_concatenate_dfp_files(start_year, end_year, financial_statements):
"""
Função para realizar o download, extração e concatenação de arquivos zipados contendo os dados da Demonstração Financeira
Padronizada (DFP) de companhias abertas disponibilizados pela Comissão de Valores Mobiliários (CVM).

Parâmetros:
start_year (int): Ano inicial da coleta dos dados.
end_year (int): Ano final da coleta dos dados.
financial_statements (list): Lista de nomes dos arquivos de demonstrativos financeiros que deseja-se concatenar. Consolidado: BPA_con (balanço patrimonial ativo);
BPP_con (Balanço patrimonial passivo) DRE_con; DFC_MI_con; DFC_MD_CON; DMPL_con.

Retorna:
Arquivo .csv no diretório principal
"""
url = "https://dados.cvm.gov.br/dados/CIA_ABERTA/DOC/DFP/DADOS/" 
# Cria uma lista vazia para inserir os nomes dos arquivos zipados
arquivo_zipado = []

# Define os nomes dos arquivos zipados de acordo com o range de datas
for ano in range(start_year, end_year + 1):
arquivo_zipado.append(f'dfp_cia_aberta_{ano}.zip')

# Realiza o download dos arquivos zipados de acordo com a url base
for arquivos in arquivo_zipado:
wget.download(url + arquivos)

# Extrai os arquivos zipados 
for arquivos in arquivo_zipado:
ZipFile(arquivos, 'r').extractall('DFP')

# Concatena os dados dos demonstrativos financeiros em um único DataFrame
for demons in financial_statements:
arquivo_demonstrativo = pd.DataFrame()
for ano in range(start_year, end_year + 1):
arquivo_demonstrativo = pd.concat([arquivo_demonstrativo, pd.read_csv(f'DFP/dfp_cia_aberta_{demons}_{ano}.csv', sep = ';', decimal = ',', encoding = 'ISO-8859-1')]) 
arquivo_demonstrativo.to_csv(f'dfp_cia_aberta_{demons}_{start_year}-{end_year}.csv', index = False)

3. Coleta os dados

# Coleta os dados da DRE
download_extract_concatenate_dfp_files(2010, 2023, ['DRE_con'])

# Realiza a leitura do arquivo
dre = pd.read_csv('dfp_cia_aberta_DRE_con_2010-2023.csv')

4. Tratamento de dados

# Realiza o filtro das contas contábeis, do código CVM e da ordem do exercício
dados = dre[dre.CD_CONTA.isin(["3.01", # Receita de Venda de Bens e/ou Serviços
"3.03", # Resultado Bruto
"3.05", # EBIT
"3.11" # Lucro/Prejuízo Consolidado do Período
]) & dre.CD_CVM.isin([12190, 26700, 21431, 19550]) & (dre.ORDEM_EXERC == 'ÚLTIMO')]
# Seleciona as colunas
dados = dados[["DT_REFER", "DENOM_CIA", "CD_CONTA", "DS_CONTA", "VL_CONTA"]]

# Converte a coluna de data para datetime
dados['DT_REFER'] = pd.to_datetime(dados['DT_REFER'])

# Cria a coluna Ano
dados['Ano'] = dados['DT_REFER'].dt.year

dados_pivot = dados.pivot(index = ['Ano', 'DENOM_CIA'], columns = 'CD_CONTA', values = 'VL_CONTA')
dados_pivot.head()
Código
CD_CONTA 3.01 3.03 3.05 3.11
Ano DENOM_CIA
2010 BOMBRIL S.A. 804924.0 365924.0 35356.0 28317.0
HYPERA S.A. 3159728.0 1806425.0 611956.0 261901.0
NATURA COSMETICOS S.A. 5136712.0 3579906.0 1167906.0 744050.0
2011 BOMBRIL S.A. 845814.0 372181.0 56528.0 -19313.0
HYPERA S.A. 3324630.0 2004064.0 421009.0 -54651.0

 

5. Cria os indicadores

# Cria os indicadores
indicadores = (
dados_pivot
.assign(margem_bruta = (dados_pivot["3.03"]) / dados_pivot["3.01"] * 100,
margem_liquida = (dados_pivot["3.11"]) / dados_pivot["3.01"] * 100,
margem_ebit = (dados_pivot["3.05"]) / dados_pivot["3.01"] * 100)
)

# Retira o índice
indicadores.reset_index(inplace = True)


# Arrendonda os valores
indicadores = indicadores.round(decimals = 3)

# Seleciona colunas e arredonda valores
indicadores = indicadores[['Ano', 'DENOM_CIA', 'margem_bruta', 'margem_liquida', 'margem_ebit']].round(decimals = 3)
indicadores_long = indicadores.melt(id_vars = ['Ano', 'DENOM_CIA'], var_name = "Indicadores")

indicadores_long
Código
Ano DENOM_CIA Indicadores value
0 2010 BOMBRIL S.A. margem_bruta 45.461
1 2010 HYPERA S.A. margem_bruta 57.170
2 2010 NATURA COSMETICOS S.A. margem_bruta 69.693
3 2011 BOMBRIL S.A. margem_bruta 44.003
4 2011 HYPERA S.A. margem_bruta 60.279
... ... ... ... ...
121 2021 NATURA COSMETICOS S.A. margem_ebit 10.140
122 2022 BOMBRIL S.A. margem_ebit 10.723
123 2022 EUROFARMA LABORATÓRIOS S.A. margem_ebit 22.031
124 2022 HYPERA S.A. margem_ebit 32.900
125 2022 NATURA COSMETICOS S.A. margem_ebit 7.840

126 rows × 4 columns

6. Visualização de dados

# Criando o gráfico
(
ggplot(indicadores_long, aes(x = "Ano",
y = "value",
color = "Indicadores"))
+ geom_line(size = 1)
+ facet_wrap("DENOM_CIA", scales = "free")
+ scale_color_manual(values = {'margem_liquida' : '#282f6b', 'margem_bruta' : "#b22200", 'margem_ebit' : "#eace3f"},
labels = {'margem_liquida' : 'Margem Líquida', 'margem_bruta' : 'Margem Bruta', 'margem_ebit' : 'Margem EBIT'})
+ labs(title = "Indicadores de Eficiência de empresas do setor Farmacêutico e Higiene",
y = '%',
x = '',
caption = "Elaborado por analisemacro.com.br | Fonte: CVM/B3")
+ theme(figure_size=(10, 8),
subplots_adjust = {'wspace': 0.25,
'hspace': 0.25},
legend_position = 'bottom')
)

Quer aprender mais?

  •  Cadastre-se gratuitamente aqui no Boletim AM e receba toda terça-feira pela manhã nossa newsletter com um compilado dos nossos exercícios com exemplos reais de análise de dados envolvendo as áreas de Data Science, Econometria, Machine Learning, Macroeconomia Aplicada, Finanças Quantitativas e Políticas Públicas;
  •  Quer ter acesso aos códigos, vídeos e scripts de R/Python desse exercício? Vire membro do Clube AM aqui e tenha acesso à nossa Comunidade de Análise de Dados;
  •  Quer aprender a programar em R ou Python com Cursos Aplicados e diretos ao ponto em Data Science, Econometria, Machine Learning, Macroeconomia Aplicada, Finanças Quantitativas e Políticas Públicas? Veja nossos Cursos aqui.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Análise exploratória para modelagem preditiva no Python

Antes de desenvolver bons modelos preditivos é necessário organizar e conhecer muito bem os dados. Neste artigo, damos algumas dicas de recursos, como gráficos, análises e estatísticas, que podem ser usados para melhorar o entendimento sobre os dados usando Python.

Como usar modelos do Sklearn para previsão? Uma introdução ao Skforecast

Prever séries temporais é uma tarefa frequente em diversas áreas, porém exige conhecimento e ferramentas específicas. Os modelos de machine learning do Sklearn são populadores, porém são difíceis de aplicar em estruturas temporais de dados. Neste sentido, introduzimos a biblioteca Skforecast, que integra os modelos do Sklearn e a previsão de séries temporais de forma simples.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.