profile

Wilson Freitas

rb3 + Python: O Combo Perfeito para Análise de Dados Financeiros Brasileiros


Olá, Reader!

Bem-vindo(a) de volta à nossa jornada de exploração quantitativa!

Desde que eu comecei a escrever sobre o rb3 várias pessoas perguntam: “Pô, você não tem uma versão para Python?”

Bem, o rb3 é um projeto que cria um datalake, mas o que é um datalake? Um datalake é um repositório de dados de baixo acoplamento, baseado em arquivos, que armazena dados em seu formato bruto ou semiestruturado (schema-on-read), permitindo ingestão massiva e barata de dados heterogêneos.

Esses dados podem vir de várias fontes, como bancos de dados relacionais, arquivos CSV, APIs, entre outros. No caso do rb3, os dados são obtidos a partir do site da B3.

O datalake do rb3 tem três camadas lógicas:

  • raw: onde os dados são armazenados comprimidos (gzip) em seu formato original, sem qualquer transformação ou limpeza.
  • input: onde os dados são descomprimidos e convertidos para um formato colunar eficiente (parquet), facilitando a leitura e análise.
  • staging: onde os dados são organizados em partições por data e tabela, otimizando consultas e operações analíticas.

Voltando à pergunta inicial: “Você não tem uma versão para Python?”.

Então, considerando que os dados da B3 estão armazenados em um datalake padronizado, a resposta é: “Não, eu não tenho uma versão para Python, mas você pode acessar os dados do rb3 utilizando Python.”

Assim, o rb3 pode ser utilizado para atualizar o datalake com os dados mais recentes da B3 e você pode utilizar Python para acessar esses dados.

Vou mostrar como fazer isso utilizando a biblioteca PyArrow, que é uma biblioteca poderosa para manipulação de dados em formato colunar, como o Parquet.

O rb3 tem a opção rb3.cachedir que permite definir o diretório onde o datalake será armazenado.

Quando essa opção não é definida, o rb3 utiliza um diretório temporário que é apagado ao reiniciar o sistema operacional. Para manter o datalake entre execuções, você deve definir essa opção para um diretório permanente.

Eu costudo definir essa opção no arquivo de configuração do R, .Rprofile, que é carregado automaticamente ao iniciar uma sessão do R.

options(rb3.cachedir = "~/rb3-cache")

Ao executar a função fetch_marketdata() do rb3, o datalake será atualizado com os dados mais recentes da B3, como vimos na Edição #1 da newsletter.

O datalake é organizado nos seguintes diretórios:

~/rb3-cache/
├── raw
├── db
├───── input
└───── staging

Os datasets ficam armazenados nos diretórios input e staging, em formato parquet.

Esses datasets podem ser acessados diretamente utilizando Python e a biblioteca PyArrow.

Vamos ver um exemplo de como fazer isso. Vamos acessar o dataset b3-futures-settlement-prices na camada staging utilizando o módulo pyarrow.dataset que retorna um objeto Dataset, do qual podemos visualizar o schema.

refdate: date32[day]
symbol: string
commodity: string
maturity_code: string
previous_price: double
price: double
price_change: double
settlement_value: double

Vamos ver como fazer uma consulta útil nesse dataset utilizando filtros para obter os preços de liquidação do contrato futuro DI1F40 (um dos contratos mais longos) a partir de 2025.

Utilizamos o dataset com o método filter() para aplicar os filtros desejados, juntamente com objetos pc.field() para referenciar as colunas do dataset. Usamos operadores de comparação simples (==, >=) para definir os critérios de filtragem com objetos nativos do Python (str e datetime).

Ao final, usamos o método to_table() para converter o resultado em uma tabela PyArrow e o método to_pandas() para converter a tabela em um dataframe pandas.


|     | refdate    | symbol | price    |
|-----|------------|--------|----------|
| 0   | 2025-01-02 | DI1F40 | 13025.91 |
| 1   | 2025-01-03 | DI1F40 | 13423.72 |
| 2   | 2025-01-06 | DI1F40 | 13854.13 |
| 3   | 2025-01-07 | DI1F40 | 13648.00 |
| 4   | 2025-01-08 | DI1F40 | 13370.24 |

Tendo os dados em um ambiente Python, podemos utilizar todas as ferramentas disponíveis nesse ecossistema para analisar e visualizar os dados.

Vale muito a pena explorar as funcionalidades da biblioteca PyArrow para manipulação e análise de dados. Recomendo fortemente a leitura da documentação oficial do PyArrow e do PyArrow Cookbook para aprender mais sobre essa poderosa ferramenta.

O combo perfeito, rb3 + Python, representa uma abordagem pragmática e poderosa para análise de dados financeiros brasileiros.

Ao invés de recriar funcionalidades já existentes, aproveitamos o melhor de cada ferramenta: o rb3 para capturar e organizar os dados da B3 em um datalake estruturado e Python com PyArrow para análise e visualização.

Essa arquitetura oferece várias vantagens:

  • Eficiência: Não há duplicação de esforços - o rb3 cuida da ingestão complexa de dados da B3
  • Flexibilidade: O formato Parquet permite acesso rápido e eficiente aos dados de qualquer linguagem
  • Escalabilidade: A estrutura de datalake suporta volumes crescentes de dados históricos
  • Produtividade: Desenvolvedores Python podem focar na análise, não na coleta de dados

Se você trabalha com dados financeiros brasileiros e usa Python, experimente essa abordagem. Configure o rb3 para manter seu datalake atualizado e explore os dados usando PyArrow. É um combo que realmente funciona!

Um abraço, Wilson.

Wilson Freitas

Escrevo semanalmente para lhe ajudar a utilizar linguagem de programação na análise de dados financeiros, estratégias de investimento quantitativas e as melhores práticas para manipulação e visualização de dados. Para que você possa ter conhecimento e ferramentas quantitativas e reproduzir análises quantitativas de forma independente.

Share this page