Alura > Cursos de Data Science > Cursos de Business Intelligence > Conteúdos de Business Intelligence > Primeiras aulas do curso Python e Power BI: analisando dados do mercado financeiro

Python e Power BI: analisando dados do mercado financeiro

Extração dos dados com Python - Apresentação

Será que é possível utilizar a linguagem Python dentro do Power BI para extrair e transformar dados e ainda gerar visualizações com eles?

Meu nome é Afonso Rios. Sou instrutor na Escola de Data Science na Alura.

Audiodescrição: Afonso Rios se identifica como um homem de pele morena, com olhos, cabelos e barba castanho-escuros. Usa headphones e uma camisa preta com alguns detalhes em verde que remetem à escola de dados. Ao fundo, uma parede na cor azul, cinza e branca, com alguns detalhes remetendo à Alura e ao futebol, e iluminação azul.

O que vamos aprender?

Neste curso, vamos atuar como analista de dados de uma consultoria financeira que trabalha com ativos da bolsa brasileira, denominada Bulltrend. Pretendemos construir um relatório para auxiliar o time de consultoria a analisar os ativos das carteiras da nossa clientela.

Para isso, vamos utilizar Python juntamente com o Power BI, de maneira a extrair, transformar e carregar estes dados para gerar um dashboard.

Em nossa jornada, vamos aprender a:

Tudo isso tem como objetivo gerar um dashboard para auxiliar nosso time de consultoria. É bastante conteúdo, não é mesmo?

Pré-requisitos

Para que você tenha a melhor experiência possível, é recomendado que você já possua alguns conhecimentos na linguagem Python e em algumas bibliotecas de manipulação e visualização de dados, como Pandas, NumPy, Matplotlib e Seaborn.

Também é importante que já saiba construir seus primeiros dashboards utilizando o Power BI.

Com as expectativas alinhadas, vamos começar a construir nosso dashboard?

Extração dos dados com Python - Problema do negócio

Observação: A versão da biblioteca Pandas utilizada no curso é a 1.4 (!pip install pandas==1.4)

Você é uma pessoa que trabalha como analista de dados de uma consultoria financeira chamada Bulltrend, que visualiza os diversos ativos de clientes, apresentando bons ativos e também verificando sua evolução.

Entendendo o contexto

Para isso, você precisará extrair dados de cotações e dados fundamentalistas, que fornecem um panorama sobre a saúde financeira de algumas empresas para que a clientela consiga estruturar as suas carteiras e você consiga acompanhar essa evolução.

Nesse ponto, vamos trabalhar com duas vertentes, que seriam as análises fundamentalistas e as análises gráficas

A análise fundamentalista refere-se à saúde financeira da empresa, portanto, iremos lidar bastante com patrimônios, receitas e despesas.

Já a análise gráfica, será baseada em cotações, que é o valor daquela determinada empresa naquele momento específico. Portanto, vamos observar essas flutuações e como esses valores se alteram de acordo com o tempo.

Para isso, precisamos identificar os melhores fundamentos, os melhores indicadores para incluir no nosso projeto e, claro, combiná-los com as ferramentas do Python e do Power BI.

Importando as bibliotecas

Você vai analisar esses dados, desde a parte da extração até a carga e a geração de um dashboard, de um único relatório, apresentando os dados tanto das cotações quanto dos indicadores.

Para isso, será muito importante, primeiramente, construir esse código de extração usando as bibliotecas do Python. No nosso projeto, vamos trabalhar com duas bibliotecas. A biblioteca yfinance da Yahoo Finance, que faz a obtenção dos dados por meio de uma API no site da Yahoo Finance.

Esse site fornece dados não só de cotações, como também de fundamentalistas, mas, para o nosso projeto, vamos trabalhar apenas com dados de cotações nessa biblioteca.

E a biblioteca fundamentus, que oferece esses dados fundamentalistas a partir do site da Fundamentus, utilizando essa API para extrair esses dados para construção das nossas tabelas.

Sendo assim, vamos trabalhar com essas duas bases de dados, uma base separada com as cotações e outra base separada com os indicadores fundamentalistas e com as variáveis que indicam a saúde de uma empresa.

Vamos acessar o ambiente do Colab e realizar a importação dessas duas bibliotecas que serão utilizadas no nosso projeto. Vamos executar a célula com as bibliotecas fundamentus e yfinance que está abaixo do título "instalando as bibliotecas no ambiente do Colab":

!pip install fundamentus yfinance

Ao rodar esse código com "Ctrl + Enter", a instalação das bibliotecas será feita, sendo uma relacionada ao site Fundamentus e outra ao site da Yahoo Finance.

Essas duas bibliotecas são muito importantes para a análise de dados, além de que esses dados são abertos. Portanto, conseguimos acessá-los e fazer bom uso deles em nosso projeto.

Próximos passos

Já instalamos as duas bibliotecas que vamos utilizar. No próximo vídeo, vamos começar a extrair os dados das cotações. Vamos lá?

Extração dos dados com Python - Extraindo as cotações dos ativos

Observação: Durante a aula, no tempo 07:19, o instrutor realizará uma alteração no nome da coluna, substituindo level1 por Ativo. No entanto, a coluna a ser renomeada deve ser Ticker para Ativo. O código correto para essa modificação é : cotacoes = cotacoes.reset_index().rename(columns={"Ticker": "Ativo"}).

Para construir nosso projeto, antes de gerar o dashboard, precisaremos extrair os dados e as cotações de uma carteira. Usaremos uma carteira hipotética, de um único cliente, com dez ativos que estarão dentro de uma lista.

No entanto, antes de importar essa lista, precisamos trazer a biblioteca que vamos utilizar, a yfinance.

Dados de cotações da carteira hipotética

Para fazer isso, vamos importar da biblioteca yfinance, escrevendo import yfinance e o alias as yf.

# Importando a biblioteca
import yfinance as yf

Após importar a biblioteca para o nosso projeto, vamos buscar a carteira de dez ativos. Todos os ativos estão finalizados com .SA, que é a forma como ações brasileiras são lidas pela biblioteca yfinance.

# Definindo a carteira de ações
carteira_yf = ['ABEV3.SA', 'B3SA3.SA', 'ELET3.SA', 'GGBR4.SA', 'ITSA4.SA',
               'PETR4.SA', 'RENT3.SA', 'SUZB3.SA', 'VALE3.SA', 'WEGE3.SA']

Vamos rodar nossa carteira_yf para defini-la e para extrair somente os valores dentro dela.

Agora vamos carregar esses dados para nosso DataFrame chamado df. Mas para isso, precisamos selecionar um período.

Para que a sua reprodução seja a mesma da nossa, vamos fazer um alinhamento:

Vamos trabalhar com o período de 1º de agosto de 2022 até 1º de agosto de 2023. Se você se sentir confortável, pode aumentar ou modificar esse período, apenas levando em conta que o ativo precisa ter negociação na data que você escolher.

Para começar, vamos criar um df que será igual à yf.download(). Dentro de download(), precisaremos trazer três parâmetros diferentes.

O primeiro parâmetro será a carteira ou o ticker que vamos utilizar.

Ticker se refere ao nome do papel. Portanto, como você encontrará essa empresa dentro da bolsa de valores? É a partir desse ticker, que seria este nome com quatro letras e um número ou dois números dentro da bolsa brasileira. Claro que em outras bolsas será um pouco diferente.

Por exemplo, usamos as quatro letras ABEV e o número 3. Será assim para todos os tipos de tickers. Mas no nosso caso, usaremos uma lista, pois queremos trazer todos os dez valores juntos.

Portanto, o primeiro parâmetro será carteira_yf, que serão os tickers dos quais vamos extrair os dados.

Os outros dois parâmetros serão a data de início e fim. Para iniciar, usaremos start e passaremos um texto entre aspas. Este texto estará no formato de ano, mês e dia (YYYY-MM-DD), que é o período que queremos definir. Portanto, será 2022-08-01 entre aspas, referente a 1º de agosto de 2022.

Agora, passamos o período final que será end igual à 2023-08-01 entre aspas. Assim, vamos fazer a carga do DataFrame

# Carregando os dados da carteira
df = yf.download(carteira_yf, start="2022-08-01", end="2023-08-01")

10 of 10 completed

Com isso, carregamos todos os dez ativos que possuem uma série de dados com os quais vamos trabalhar.

Para visualizar o nosso DataFrame, vamos utilizar o df.head(3), exibindo assim somente as três primeiras linhas.

df.head(3)
-Adj Close---------Volume---------
DateABEV3.SAB3SA3.SAELET3.SAGGBR4.SAITSA4.SAPETR4.SARENT3.SASUZB3.SAVALE3.SAWEGE3.SAABEV3.SAB3SA3.SAELET3.SAGGBR4.SAITSA4.SAPETR4.SARENT3.SASUZB3.SAVALE3.SAWEGE3.SA
2022-08-0113.89773210.54543746.19908519.4489827.20430819.30805255.75835045.81341661.27107627.45679934565900262376001223920013879215233024008136510067377007127600388740008202200
2022-08-0213.97372710.47752846.55675520.0488037.27179519.39404556.02173646.18980463.22404527.9492111251580029130100747760013398945142258606914710048478004379000326369007214800
2022-08-0313.89773210.82677746.70578419.2353507.33084719.40550857.76784145.67829960.76708227.6931611957660029172900828150025537890228852806554450049042004451900319346006627100

No DataFrame gerado, temos a coluna de índice chamada Date que vem com as datas diárias.

No cabeçalho, temos duas colunas, ou seja, trabalhamos com multi-colunas, a Adj Close (fechamento ajustado) e Volume. A presença das reticências indica que temos muitas colunas dentro do DataFrame.

Abaixo deles, temos outra sequência de colunas que são todos os ativos com os quais trabalhamos. Note que eles são repetidos de 10 em 10 até concluir todas as 60 colunas.

Porém, o DataFrame ficou muito grande e não conseguimos entender muito bem o que esses dados significam. Mas, como podemos tratar esses dados para poder compreendê-los melhor?

Vamos utilizar uma função do Pandas utilizada pelo Yahoo Finance, chamada stack() que significa pilha em inglês. Essa função transformar essas colunas que estão em formato de linhas em uma única coluna, colocando seus dados empilhados.

Para utilizá-lo, vamos criar outro DataFrame chamado cotacoes que vai receber um df.stack(). O stack() recebe alguns parâmetros, dentre eles, o nível da coluna que queremos empilhar.

A primeira coluna, onde está o Adj Closee Volume é a coluna 0, enquanto a coluna de baixo é a coluna 1. Assim como no índice, começamos a contar a partir do zero. Por isso, nesse caso, vamos passar o parâmetro level igual à 1.

Por fim, vamos ler o resultado do DataFrame cotacoes.

# Passando os ativos para o multindex do df
cotacoes = df.stack(level = 1)
cotacoes
Date-Adj CloseCloseHighLowOpenVolume
2022-08-01ABEV3.SA13.89773214.63000014.89000014.43000014.86000034565900
-B3SA3.SA10.54543710.87000011.12000010.71000011.02000026237600
-ELET3.SA46.19908546.50000046.88999945.66000045.79999912239200
-GGBR4.SA19.44898222.54285623.45714222.38095323.45714213879215
-ITSA4.SA7.2043087.7636367.8909097.6818187.86363623302400
2023-07-31PETR4.SA29.96767431.11000131.15000030.29999930.29999991290800
-RENT3.SA67.22000167.22000167.66000466.44000267.0400015966900
-SUZB3.SA48.07000048.07000048.61000147.34000047.3899994602700
-VALE3.SA67.13463669.16000469.68000067.83999668.00000026065700
-WEGE3.SA39.91999839.91999840.29000139.81000140.2900017141800

Com isso, já conseguimos notar uma grande diferença. Ao invés de várias colunas, o nosso DataFrame tem várias linhas. Por isso, são colocadas as reticências para indicar a omissão de algumas das 2500 linhas.

Foram criados dois índices, o índice que vai ter os dados agrupados da data e outro índice com os valores dos ativos. Para utilizar esses dados no Power BI, precisamos transformar os índices em colunas.

Para que todos os dados sejam colunas, precisamos resetar o índice, trazendo os dados de data e ativos para coluna.

Em uma célula vazia, vamos escrever cotacoes igual à cotacoes.reset_index().

Além disso, vamos renomear a coluna de índice com os ativos que não tem um nome visível. Quando trabalhamos com stack(), esse nome é transformado em level_numero, sendo o número do nível em que estava. Por exemplo, se colocamos level como 1 anteriormente, o nome será level_1.

Para fazer essa troca pelo nome Ativo, devemos usar a função rename(). Dentro de rename(), vamos passar o parâmetro columns igual à, entre chaves, "level_1": "Ativo".

# Resetando os índices e renomenado a coluna dos ativos
cotacoes = cotacoes.reset_index().rename(columns={"level_1": "Ativo"})

Assim, vamos transformar os dois índices em colunas e renomear a coluna level_1 para Ativo.

Finalmente, vamos organizar os dados removendo as colunas que não serão necessárias para o projeto como, por exemplo: Volume e Adj Close. Apenas os valores da data, OHLC (Open, High, Low e Close) e Ativo serão utilizados.

Os valores OHLC são os valores de abertura, máximos, mínimos e de fechamento dos ativos. São essenciais para analisar as cotações de nossos ativos, pois representam as informações mais relevantes negociadas durante o dia.

Eles são importantes para analisar não apenas essa flutuação, mas também prever como uma ação pode se comportar nos próximos dias.

Assim, eles são muito relevantes dentro da análise gráfica, também conhecida como análise técnica, que usa essas variações como maneiras de entender como a ação está performando ao longo do tempo.

# Organizando o df
cotacoes = cotacoes[["Date", "Open", "High", "Low", "Close", "Ativo"]]
cotacoes.head(10)

Agora, vamos rodar o código para verificar os nossos valores.

DateOpenHighLowCloseAtivo
2022-08-0114.86000014.89000014.43000014.630000ABEV3.SA
2022-08-0111.02000011.12000010.71000010.870000B3SA3.SA
2022-08-0145.79999946.88999945.66000046.500000ELET3.SA
2022-08-0123.45714223.45714222.38095322.542856GGBR4.SA
2022-08-017.8636367.8909097.6818187.763636ITSA4.SA
2022-08-0134.00000034.15000233.22000133.680000PETR4.SA
2022-08-0157.40000257.88000156.79999957.160000RENT3.SA
2022-08-0148.36000148.36000146.95000147.470001SUZB3.SA
2022-08-0168.94000269.84999867.93000068.080002VALE3.SA
2022-08-0128.04000128.68000027.77000027.879999WEGE3.SA

Os dados já estão ajustados no formato Date, OHLC e Ativo.

Agora, vamos também rodar cotacoes.info() para verificar como esses dados estão sendo representados.

cotacoes.info()
#ColumnNon-Null CountDtype
0Date2500 non-nulldatetime64[ns]
1Open2500 non-nullfloat64
2High2500 non-nullfloat64
3Low2500 non-nullfloat64
4Close2500 non-nullfloat64
5Ativo2500 non-nullobject

O Date tem o formato de tempo dateTime64, enquanto os valores de Open, High, Low e Close estão no formato de número flutuante (decimal) e o Ativo está no formato de objeto. Logo, está tudo certo.

Conclusão

Todos os processos que fizemos nesse mesmo vídeo estão sendo previstos dentro desse código completo:

# Código completo da obtenção dos dados históricos das cotações da carteira de 01/08/2022 à 01/08/2023
# Importando a biblioteca
import yfinance as yf

# Definindo a carteira de ações
carteira_yf = ['ABEV3.SA', 'B3SA3.SA', 'ELET3.SA', 'GGBR4.SA', 'ITSA4.SA',
               'PETR4.SA', 'RENT3.SA', 'SUZB3.SA', 'VALE3.SA', 'WEGE3.SA']

# Carregando os dados da carteira
df = yf.download(carteira_yf, start="2022-08-01", end="2023-08-01")

# Passando os ativos para o multindex do df
cotacoes = df.stack(level=1)

# Resetando os índices e renomenado a coluna dos ativos
cotacoes = cotacoes.reset_index().rename(columns={'level_1': 'Ativo'})

# Organizando o df
cotacoes = cotacoes[["Date", "Open", "High", "Low", "Close", "Ativo"]]

del carteira_yf, df

Esse será o código que vamos utilizar para copiar e colar dentro do Power BI.

Como boa prática, estamos usando a função del para deletar variáveis que são auxiliares, utilizadas apenas para construir aquele DataFrame. Pois o que nos importa é a tabela cotacoes. Portanto, vamos excluir tanto carteira_yf quanto o df dos nossos valores, mantendo apenas o DataFrame de cotacoes.

Já conseguimos extrair os dados das cotações dos ativos para análise gráfica. Agora, vamos trabalhar em extrair os dados fundamentalistas e os dados gerais de um ativo para também trabalhar com a análise fundamentalista. Porém, isso será abordado nos próximos vídeos.

Sobre o curso Python e Power BI: analisando dados do mercado financeiro

O curso Python e Power BI: analisando dados do mercado financeiro possui 195 minutos de vídeos, em um total de 63 atividades. Gostou? Conheça nossos outros cursos de Business Intelligence em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Business Intelligence acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas