Data infrastructure for a Brazilian asset manager.

Infraestrutura de dados para uma gestora brasileira.

Porto Real AssetPorto Real Asset

What I currently work on at Porto Real Asset, a credit-focused asset manager: the pipeline orchestration, file-based data lake, cash-flow engine, quality gates, and offline risk scoring that move raw data into operational decisions before market open every morning.

O que faço hoje na Porto Real Asset, uma gestora focada em crédito: a orquestração de pipelines, o data lake baseado em arquivos, o motor de fluxo de caixa, os gates de qualidade e o score de risco offline que transformam dados brutos em decisão operacional toda manhã, antes da abertura do mercado.

The fund and what its data layer has to do.

O fundo e o que sua camada de dados precisa fazer.

Porto Real Asset is a credit-focused asset manager based in Rio de Janeiro. Its operation rests on receivables and structured credit (FIDCs), which means the data layer has to handle three very different shapes of input on the same daily clock: machine-readable feeds, a portal with no public API, and human spreadsheets.

A Porto Real Asset é uma gestora focada em crédito sediada no Rio de Janeiro. A operação repousa sobre recebíveis e crédito estruturado (FIDCs), o que significa que a camada de dados precisa lidar com três tipos muito diferentes de entrada no mesmo relógio diário: feeds machine-readable, um portal sem API pública e planilhas humanas.

Outputs serve three audiences. Investment analysts need positions, exposures, and macro context. Risk needs default probabilities with explanations. Operations needs reconciliation and audit trails.

As saídas atendem três públicos. Os analistas de investimento precisam de posições, exposições e contexto macro. Risco precisa de probabilidades de default com explicações. Operações precisa de conciliação e rastreabilidade.

Fund type
Tipo de fundo
FIDC
Receivables & structured credit. Daily NAV calculation.
Recebíveis & crédito estruturado. Cota diária.
Cadence
Cadência
Pre-market
Pré-mercado
Most reports land before market open; the liquidity report follows a separate 10am cutoff.
A maioria dos relatórios chega antes da abertura do mercado; o relatório de liquidez segue um corte próprio às 10h.
Audience
Público
Investment, Risk, Ops
Investimentos, Risco, Ops
Different views for different teams, same data lake.
Visões diferentes para times diferentes, mesmo data lake.
Approach
Abordagem
Open stack
Stack aberta
Python, Airflow, file-based lake. No vendor lock-in.
Python, Airflow, lake baseado em arquivos. Sem vendor lock-in.

Architecture

Arquitetura

end-to-end · daily pipeline end-to-end · pipeline diário sourcesfontes orchestrationorquestração outputssaídas

Sub-systems

Subsistemas

01.

Pipeline orchestration & ingestion

Orquestração & ingestão

Apache Airflow · Selenium · REST/GraphQL · Python

~35 Airflow DAGs, tagged by role — download, consolidation, report, audit — with a sensor-style DAG polling state every five minutes and triggering what's ready. Three kinds of source: an RPA pipeline built on Page Object Model patterns for the administrator's portal, REST/GraphQL clients for custodian APIs, and a standalone loader package for public macro data.

~35 DAGs do Airflow, tagueadas por papel — download, consolidação, relatório, auditoria — com uma DAG estilo sensor consultando o estado a cada cinco minutos e disparando o que estiver pronto. Três tipos de fonte: um pipeline de RPA construído sobre o padrão Page Object Model para o portal da administradora, clientes REST/GraphQL para APIs custodiais, e um pacote de loaders standalone para dados macro públicos.

  • Custodian REST/GraphQL endpoints for positions and cash statements.
  • Endpoints REST/GraphQL custodiais de posições e demonstrativos de caixa.
  • Public macro feeds (BCB, IBGE, CVM, CAGED, Tesouro) for context.
  • Feeds macro públicos (BCB, IBGE, CVM, CAGED, Tesouro) para contexto.
  • Selenium RPA built on Page Object Model patterns where no API exists.
  • RPA com Selenium e Page Object Model onde não existe API.
How it worksComo funciona →
02.

Data layer & idempotency

Camada de dados & idempotência

pandas · JSON manifests · parquet

A three-tier, immutable file lake (raw → reference/manual → consolidated), with idempotency and backfill driven by a JSON manifest per pipeline. Every intermediate state is a file a human can open and diff.

Um lake de arquivos imutável em três camadas (raw → referência/manual → consolidado), com idempotência e backfill conduzidos por um manifest JSON por pipeline. Todo estado intermediário é um arquivo que um humano pode abrir e comparar.

Caught, via a sanity check born from a real incident: an administrator migration where BR/US number-format ambiguity inflated figures roughly 100×.

Pego por uma checagem de sanidade nascida de um incidente real: uma migração de administradora em que a ambiguidade de formato de número BR/US inflou valores em cerca de 100×.

How it worksComo funciona →
03.

Cash flow & liquidity engine

Motor de fluxo de caixa & liquidez

scipy · numpy-financial · pandas

Table-driven amortization: each receivable's settlement rule lives in a spreadsheet, not in code, so a new asset type is an edit an analyst can make. IRR by numerical root-finding over the projected schedule, a senior/subordinated waterfall, and an audit DAG that flags assets with no matching rule before the 10am liquidity report.

Amortização orientada a dados: a regra de liquidação de cada recebível vive numa planilha, não no código, então um tipo de ativo novo é uma edição que um analista consegue fazer. TIR por busca numérica de raiz sobre o cronograma projetado, uma cascata sênior/subordinada, e uma DAG de auditoria que sinaliza ativos sem regra correspondente antes do relatório de liquidez das 10h.

How it worksComo funciona →
04.

Quality gates & compliance

Gates de qualidade & enquadramento

pandas · hand-written parser · Airflow

No unit test suite — correctness is enforced at runtime instead: six named consistency checks on every load, a version-diff audit that catches silent restatements, and a compliance engine with a hand-written recursive-descent rule parser (no eval()) whose history is append-only by design.

Sem suíte de testes unitários — a correção é garantida em tempo de execução: seis checagens de consistência nomeadas em toda carga, uma auditoria de version-diff que pega reapresentações silenciosas, e um motor de enquadramento com um parser de regras recursivo-descendente escrito à mão (sem eval()) cujo histórico é append-only por desenho.

How it worksComo funciona →
05.

Credit-risk scoring

Score de risco de crédito

LightGBM · lifelines · SHAP · Optuna

Two classifiers (cross-sectional and walk-forward, out-of-time), plus a survival model answering "how long until it stops paying," cross-checked against public fiscal filings for the counterparties behind the payroll deductions. Honestly offline and exploratory — reviewed by a person, not wired into a daily DAG.

Dois classificadores (cross-sectional e walk-forward, out-of-time), mais um modelo de sobrevivência respondendo "até quando continua pagando", cruzado com prestações de contas fiscais públicas das contrapartes por trás dos descontos em folha. Honestamente offline e exploratório — revisado por uma pessoa, não conectado a uma DAG diária.

How it worksComo funciona →
06.

Reports & delivery

Relatórios & entrega

Flask · Jinja2 · Microsoft Graph · matplotlib

Six report generators (aging, concentration, liquidity, receivables flow, payment performance, compliance) render as self-contained HTML — pandas tables, matplotlib charts inlined as base64. A four-dependency Flask dashboard serves them on demand; a mailbox-driven watcher pushes the daily ones out automatically, before market open.

Seis geradores de relatório (aging, concentração, liquidez, fluxo de recebíveis, performance de pagamento, enquadramento) renderizam como HTML autocontido — tabelas pandas, gráficos matplotlib embutidos como base64. Um dashboard Flask de quatro dependências serve sob demanda; um watcher de caixa de e-mail dispara os diários automaticamente, antes da abertura do mercado.

How it worksComo funciona →

Principles I work by

Princípios pelos quais trabalho

Reproducible by default

Reproduzível por padrão

Every output should be re-creatable from its inputs. Idempotent tasks, persisted intermediate state, audit trails as a feature.

Toda saída deve poder ser recriada a partir das entradas. Tasks idempotentes, estado intermediário persistido, rastreabilidade como recurso.

Explainable, not just accurate

Explicável, não só acurado

An investment committee does not consume probabilities, it consumes arguments. SHAP, feature attributions, and clear English (or Portuguese) matter as much as AUC.

Um comitê de investimentos não consome probabilidades, consome argumentos. SHAP, atribuições e português claro importam tanto quanto AUC.

Open stack, no vendor lock-in

Stack aberta, sem vendor lock-in

Python, Airflow, a file-based lake. The infrastructure should belong to the firm, not to a SaaS contract.

Python, Airflow, um lake baseado em arquivos. A infraestrutura deve pertencer à firma, não a um contrato SaaS.

Gates over test suites

Gates em vez de suíte de testes

No pytest suite here. What catches bad data is runtime checks against the live pipeline — consistency checks, version-diff audits, sanity checks against known totals.

Sem suíte pytest aqui. O que pega dado ruim são checagens em tempo de execução contra o pipeline ao vivo — checagens de consistência, auditorias de version-diff, checagens de sanidade contra totais conhecidos.

Quiet operations

Operações silenciosas

If the pipeline only wakes me up when something is genuinely wrong, it has been well designed.

Se o pipeline só me acorda quando há algo realmente errado, ele foi bem desenhado.

Documentation as code

Documentação como código

READMEs in every module, ADRs for non-trivial decisions, Mermaid diagrams over Confluence pages.

READMEs em cada módulo, ADRs para decisões não-triviais, diagramas Mermaid em vez de páginas no Confluence.