Data Science Machine Learning Python 7

Ciência de Dados para Mercado de Ações Parte I

Ciência de Dados para Mercado de Ações

Fala galera do mundo dos dados, hoje vamos começar a falar sobre ciência de dados para mercado de ações. Desde sempre, o mercado de ações vem chamando a atenção da humanidade pelos mais variados motivos. Seja pelas possibilidades de enriquecimento acelerado (mas nunca fácil) ou pela possibilidade de participar como “sócio” de alguma empresa pertencente a algum segmento, que seja do interesse do investidor, que de outra forma seria impossível…Ninguém monta uma empresa como a Tesla todos os dias, mas qualquer investidor, pequeno ou grande, pode ser dono, todos os dias, de um pedaço desse sonho, simplesmente comprando uma ação dessa uma empresa na bolsa.

Independente de qual seja o seu motivo, ou se você está no início ou mais avançado na sua jornada de investidor, uma coisa é certa. VOCÊ VAI PRECISAR DE DADOS. Esse será o assunto central desse primeiro artigo.

Mercado de Ações

Você pode não concordar com essa afirmação inicialmente, e continuar se apoiando nos palpites e indicações de pessoas, amigos ou canais de youtube de onde colocar seu precioso capital. Mas talvez venha a mudar de ideia assim que tomar o seu primeiro stop-loss em um dia que estava esperando uma grande alta na bolsa e ficar se perguntando, WTF? Nesse momento, você pode se deparar com a necessidade de estudar mais a fundo antes de fazer sua próxima operação.

Nesse artigo e nos próximos vamos explorar formas de você extrair informações públicas da web usando Python. Vamos também te ajudar a montar seu próprio “painel de controle” para tomar decisões mais conscientes. Esperamos que após a leitura desse material, você possa saber explicar melhor os motivos da queda ou da alta no preço das ações, ou pelo menos, tenha conhecimento para buscar essas informações de forma mais fácil e rápida.

Importante deixar claro que todas as dicas aqui servem para te orientar a buscar mais dados disponíveis na web e usar algoritmos para fazer estes dados trabalharem a seu favor, mas nem de longe estamos aqui fazendo indicações de formas ou estratégias de investimento. Estas serão criadas por você.

A escalada dos dados no mercado de ações com ciência de dados

Primeiramente iremos aprofundar alguns conceitos para se debruçar sobre ciência de dados para mercado de ações.

Dois conceitos importantes: Crawling x Scraping

Web Crawling: em tradução simples, rastreamento da web é a forma que os grandes portais, tipo Google e Yahoo, usam para buscar informações, geralmente de forma indiscriminada e em alta escala, em todo e qualquer link que apareça no seu radar. Existe um robô que acessa cada link de uma página e faz uma cópia de todos esses dados nos seus servidores. Após isso esses dados são então indexados e usados de acordo com a necessidade.

Web Scraping: a “raspagem” de dados, é um processo mais específico onde uma rotina de extração de dados é construída de maneira quase exclusiva para cada página de interesse e os dados são extraídos de forma mais estruturada e normalmente com objetivo já definido, seja para comparar dados atuais com histórico ou até mesmo simplesmente para identificar que houve mudança no dado. 

Você pode ler à respeito nesse artigo .

Além dessas duas técnicas existe uma terceira forma de extrair dados da web que é o uso de APIs disponibilizadas pelo portal (fonte de dados) ou por qualquer desenvolvedor que tenha feito esse trabalho anteriormente e disponibilizado o uso para o público. A vantagem desta técnica é que você tem nesse caso, acesso direto aos dados de seu interesse e isso pode facilitar muito sua vida de investidor programador.

IMPORTANTE: O uso de qualquer uma dessas técnicas não é ilegal, mas vale ressaltar que pode ser imoral… Não é bacana você sair buscando informações de maneira indiscriminada na web para usar em benefício próprio sem nem citar a fonte ou pesquisando minimamente se o portal possui políticas para uso desses dados, e segui-las 😉

Crawling x Scraping

Bibliotecas Python

Existem hoje uma infinidade de bibliotecas (APIs ou não), que facilitam muito o seu trabalho. Antes de você alguém já precisou fazer este trabalho e teve a generosidade de disponibilizar esse código para que outras pessoas utilizassem. 

Algumas bibliotecas fazem funções muito parecidas, porém com vantagens e desvantagens sobre as outras, portanto, antes de sair “codando”, faça uma boa pesquisa sobre quais bibliotecas poderiam te ajudar no seu projeto. Certamente vai existir uma ou várias que lhe ajudarão no todo ou em parte do seu projeto.

Abaixo descrevemos algumas bibliotecas para ilustrar os conceitos descritos anteriormente.

  • Beautiful Soup: Essa é uma biblioteca em Python para fazer todo o trabalho de resgatar dados de páginas e documentos em html e xml. Você pode saber mais sobre a BSoup nesse link.

exemplo simples de utilização da BSoup

# Anchor extraction from HTML document
from bs4 import BeautifulSoup
from urllib.request import urlopen

with urlopen('https://en.wikipedia.org/wiki/Main_Page') as response:
    soup = BeautifulSoup(response, 'html.parser')
    for anchor in soup.find_all('a'):
        print(anchor.get('href', '/'))

(fonte: wikipedia)

  • Scrapy: a scrapy é uma outra biblioteca com funcionalidades parecidas com a Bsoup com algumas vantagens sobretudo em performance, porém a curva de aprendizado um pouco mais íngreme que a anterior.  Para saber mais sobre Scrapy nesse link

*No link abaixo você poderá ver com maiores detalhes as vantagens e desvantagens sobre as duas bibliotecas: 

Scrapy VS Beautiful Soup

  • Yahoo finance: O Yahoo Finance é um portal que concentra dentre várias informações relacionadas ao mercado de ações, também as séries históricas das principais ações do mundo (inclusive da nossa BOVESPA). A boa notícia é que ele disponibiliza uma API, que pode ser incorporada facilmente ao seu código como no exemplo abaixo.
# Instalando o yahoo finance
!pip install yfinance --upgrade --no-cache-dir
#Instalando e importando a API no código
import yfinance as yf 

# escolhendo uma carteira fictícia para exemplificarmos conceitos
codigo = ['OIBR3.SA']
# carregando dados do valor de uma ação qualquer no mês de julho
oibr3 = yf.Ticker(codigo[0])
#carregando os dados de uma ação qualquer
oibr3.history(start='2020-01-01', end='2020-07-31') 
ciência de dados para mercado de ações

Viu como é fácil?

Nos demais artigos vamos abordar os principais algoritmos de machine learning com suas respectivas bibliotecas, assim como para a fase de visualização de dados. Nesse artigo vamos somente coletar dados usando para isso a API do portal yahoo finance e algumas funções da biblioteca urllib.request para buscar as informações de séries históricas de um ou mais papéis.

Onde buscar meus dados?

Como vamos trabalhar com dados de bolsa de valores e de mercado, qual a melhor fonte de dados para estas duas finalidades?

Bom, felizmente essa é a parte mais fácil, pois dados não faltarão para o seu projeto. Existem várias fontes que podem ser exploradas usando as bibliotecas apresentadas aqui.

A seguir listamos aqui as fontes que utilizaremos inicialmente nesse nosso projeto. Digo inicialmente pois podemos acrescentar mais informações a qualquer momento. A cotação de uma ação pode ser influenciada por um post no twitter por exemplo. Para podermos desenvolver um projeto completo precisamos estar preparados para várias situações.

Onde armazenar meus dados?

Essa é uma decisão importante e que tem que ser pensada bem no início do projeto. Não adianta você começar a baixar dados e começar a trabalhar com estes para depois, lá na frente, decidir armazenar seus dados em um local diferente. Essa situação queremos evitar pois só vai te trazer retrabalho e te forçar a testar novamente sua aplicação toda a cada mudança que você vai ter que fazer em rotinas que já estavam funcionando.

O ideal é que você possua um banco de dados mínimo para trabalhar. Existem várias opções free no mercado e que podem ser utilizadas com total confiança. Assim você pode baixar seus dados e criar rotinas específicas de pré-processamento para limpeza e tratamento dos dados antes de carregar no seu banco de dados. 

Por outro lado para manter um banco de dados na nuvem pode gerar custos que você não esteja disposto a pagar. Por isso, você deve tomar essa decisão no início.

Como nosso foco aqui é simplesmente educativo vamos manter nossos dados em arquivos do tipo CSV. Oportunamente vamos mostrar como migrar esses dados para um servidor de banco de dados.

Quais informações devo buscar? Pergunta um tanto complicada…

Cada investidor tem um perfil de investimento diferente do outro. Assim como as decisões de como investir variam de um investidor para outro, também as informações necessárias para tomada de decisão também variam de pessoa para pessoa.

Ok, existem informações que são úteis para a maioria dos perfis de investimento e são essas que vamos demonstrar aqui como coletar, tratar e exibir insights importantes, mas cada investidor tem que se perguntar quais são as informações importantes para sua tomada de decisão e usar as ferramentas descritas aqui neste artigo para conseguir obtê-las.

Basicamente vamos buscar informações histórica do valor de cotação das ações e também informações da empresa em si. Além disso vamos buscar informações de mercado que possam dar suporte às nossas análises e resultados.

Mão na massa com Ciência de Dados para Ações

Gráficos

Depois de tanta teoria sobre ciência de dados e o mercado de ações, vamos ao que interessa…

Vamos desenvolver todos os exemplos aqui no Google Colab, para não perdermos tempo discutindo ambiente de desenvolvimento. Porém, você também pode executar todo código exibido aqui no ambiente Jupyter local na sua máquina, com os devidos ajustes.

Vamos fazer tudo isso em 3 passos:

Buscando dados históricos de uma ação e guardando em um arquivo .CSV

Como informamos anteriormente, vamos usar a API do portal Yahoo Finance para baixar os dados históricos com as cotações de um determinado papel e guardar em nossa base para utilizarmos futuramente.

Antes de mais nada, vamos criar uma estrutura de pastas para que nossos dados fiquem mais organizados. Na figura a seguir faço uma sugestão de estrutura de pastas para o nosso projeto, porém você pode criar e usar uma estrutura que já esteja acostumado.

Estrutura de pastas

Essa estrutura começa com a pasta stocks4all que é o nome do nosso projeto, seguida da pasta code que é onde ficarão todos os códigos do projeto e da pasta data que é onde ficarão nossos arquivos de dados e que descrevo os detalhes abaixo:

Segue uma breve descrição do que cada pasta representa.

Raw: Todos os arquivos originais que ainda não trabalhamos no projeto estão armazenados na pasta raw. Os arquivos contidos nesta pasta não sofrerão alterações, assim temos a garantia da origem de cada dado que vamos utilizar em nossa aplicação.

Clean: A pasta clean possui os arquivos dos dados que já passaram pela etapa de pré-processamento, ou seja, já foram limpos e possivelmente já sofreram algum tipo de transformação. Podem ou não estar na mesma estrutura de armazenamento na qual foram baixados da web.

Output: Essa pasta contém todos os arquivos que iremos gerar como saída da aplicação, seja para exportar dados para outro sistema, seja para compartilhar com algum usuário que solicitou alguma informação.

Gravando no Google Drive via código

Antes de gravar no Google Drive é necessário fazer a conexão do sua aplicação ao Drive. A sequência de comandos a seguir vai permitir que você informe um token que vai habilitar seu código a executar comandos de manipulação de arquivos no Drive da conta google que você informar.

# para que possamos manipular os arquivos no google colab
# precisamos antes preparar o drive para estar disponível 
# durante o processo
# esta parte do código é específica para o ambiente do google colab
# para o ambiente jupyter algumas alterações são necessárias
 
from google.colab import drive
drive.mount('drive')

Habilitando o Drive

 Google Drive
Escolhendo a conta Google
 Google Drive
Token utilizado no código
# agora que já temos nosso drive disponível podemos exportar nosso dataset
# pra a pasta raw que deve conter somente os arquivos originais
 
folder = "drive/My Drive/stocks4all/data/raw/"
filename = codigo[0]+'.csv'
path = folder+filename
 
#Gravando nosso primeiro arquivo
df_bolsa.to_csv(path, index=False, sep=';') 
 Google Drive

Pronto… olha nosso arquivo lá.

Buscando Informações Financeiras da nossa ação

Conforme informado antes, vamos usar o portal Oceans14 que possui informações financeiras bem relevantes acerca das empresas que estão na BOVESPA e em um formato que facilita a extração. 

Os passos seguintes demonstram como podemos coletar todos os dados que são importantes para nossas análises e também como salvar em arquivos no nosso Drive de maneira organizada.

Como escolhemos a ação da empresa Oi Telecomunicações, os dados dessa empresa estão no link abaixo. Acesse para ver como estão dispostos e aproveite para navegar no portal como um todo pois tem muita informação interessante lá.

https://www.oceans14.com.br/acoes/oi/oibr/balanco-dividendos

portal Oceans14 para utilizar ciência de dados para ações
página da Oi no portal Oceans14

A seguir vamos buscar essas informações no nosso código. Pra isso vamos usar a biblioteca urllib do próprio python.

from urllib.request import Request, urlopen

Basicamente, dessa biblioteca, vamos precisar da classe Request e da função urlopen.

  • Classe Request: Essa classe vai fazer as funções de uma consulta a uma URL qualquer, como se você estivesse consultando essa mesma página no seu browser. Através dessa classe vamos criar o objeto que representa a nossa página e que vamos utilizar a seguir.
  • Função urlopen: Esta função carrega o conteúdo da página em forma de uma lista de dataframes, ou seja, como nossos dados estão em formato de tabelas, é tudo o que precisamos.

As figuras seguintes mostram o uso dessas duas funções e posterior exploração dos dados recebidos. Aproveitando que já estamos podendo gravar no Drive, vamos salvar os dados financeiros da nossa ação de maneira organizada conforme abaixo.

#vamos criar uma consulta para cada um desses blocos de informação
#e vamos salvar em pastas separadas no drive
 
Tick_url='https://www.oceans14.com.br/acoes/oi/oibr/balanco-dividendos'
tick_page = Request(tick_url, headers={'User-Agent': 'Mozilla/5.0'})   
tick_page = urlopen(tick_page).read()
#quando executamos o próximo comando, todas as informações da página   
#são carregadas, na sequência temos que separar cada parte que #representa cada bloco de informação.
tick_data=pd.read_html(tick_page, decimal=",", thousands=".", header=0)
# 1) Histórico de resultados
performance_hist = tick_data[3]
path = folder+'performance_hist_OIBR3.csv'
performance_hist.to_csv(path, index=False, sep=';')
 
# 2) Histórico de indicadores
kpis_hist = tick_data[4]
path = folder+'kpis_hist_OIBR3.csv'
kpis_hist.to_csv(path, index=False, sep=';')
 
# 3) Dívida
obligation_hist = tick_data[5]
path = folder+'obligation_hist_OIBR3.csv'
obligation_hist.to_csv(path, index=False, sep=';')
# 4) Fluxo de Caixa
cashflow_hist = tick_data[6]
path = folder+'cashflow_hist_OIBR3.csv'
cashflow_hist.to_csv(path, index=False, sep=';')
 
# 5) Balanço Patrimonial
balancesheet_hist = tick_data[7]
path = folder+'balancesheet_hist_OIBR3.csv'
balancesheet_hist.to_csv(path, index=False, sep=';')
 
# 6) Liquidez
liquidity = tick_data[8]
path = folder+'liquidity_OIBR3.csv'
liquidity.to_csv(path, index=False, sep=';')

Finalmente, podemos conferir no Drive os arquivos resultantes do nosso código. Os dados organizados e gravados na pasta raw criada para os arquivos originais.

Google Drive

Ciência de Dados para Ações ao Cubo

Nesse primeiro artigo sobre ciência de dados para ações mostramos como buscar os dados que precisamos na web para nossas análises de ações na BOVESPA. No próximo artigo Ciência de Dados para Mercado de Ações Parte II vamos começar a manipular esses dados avançando para a fase de pré-processamento, que é uma das fases mais importantes em projeto de dados. Um abraço e Até lá!

Conteúdos ao Cubo

Por fim, deixo algumas sugestões de conteúdos que você pode encontrar no Dados ao Cubo, sempre falando sobre o mundo dos dados.

Finalizo com um convite para você ser Parceiro de Publicação Dados ao Cubo e escrever o próximo artigo, compartilhando conhecimento para toda a comunidade de dados. Não esqueça de assinar a nossa Newsletter para ficar por dentro de todas as novidades. 

Gostou? Compartilhe!

7 Comments

  • Reply
    Maykow
    5 de agosto de 2020

    Excelente artigo Rodrigo!!! Claro nos comentários e muito útil nesse período de grande valorização das ações! Esperando pelos próximos artigos!

  • Reply
    kin
    20 de fevereiro de 2021

    Tentei seguir o tutorial mas não consigo coletar os dados da Oceans14. Aparece “HTTP Error 403: Forbidden”. Tentei pesquisar soluções da internet mas nenhuma funcionou. Sempre trava na hora de acessar o site. Desconfio que o site está impedindo o acesso por se tratar de um bot.

    • Reply
      Tiago Dias
      8 de março de 2021

      Kin, olhei os links do Oceans14 no post, e estão todos funcionando. Quiser compartilhar o código me manda um e-mail tiago@dadosaocubo.com, ou me chama no LinkedIn.

  • Reply
    Bruno
    24 de maio de 2021

    Excelente artigo, Rodrigão!
    Mas tô achando que algumas caixinhas de código estão incompletas. =(
    Na segunda, por exemplo, não estão definidos “codigo” e “df_bolsa”.

    Consegue dar uma verificada, por favor?

    • Reply
      Tiago Dias
      26 de junho de 2021

      Fala Bruno blz? A variável código que você cita está num trecho de código acima, mas o df realmente não localizei. Vou verificar com o Rodrigo se ele ainda possui o notebook com o código completo. Me manda um e-mail (tiago@dadosaocubo.com) que te envio assim que conseguir.

  • Reply
    Yuri
    13 de dezembro de 2022

    muito obrigado pelo conteúdo, Tiago. mas uma dúvida, estou tentando aplicar no mercado de fiis a programação para buscar cotações. porém tem alguns que só mostram algumas cotações ‘mais recentes’. não traz todo um histórico, mesmo o fundo já existindo dentro do período.

    cotacoes = yf.download(“RBHG11.SA”, start=”2022-05-01″, end=”2022-12-12″)
    No data found for this date range

    • Reply
      Tiago Dias
      16 de dezembro de 2022

      Vlw Yuri pelo comentário, vou dar uma olha para ver se consigo te dar uma resposta. Abraço!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *