Three lenses on the same risk.
Três lentes sobre o mesmo risco.
This is the one subsystem here that is honestly offline: a research pipeline for a portfolio of payroll-deductible ("consignado") receivables, reviewed by a person, not an automated daily job. It's included because the modelling choices are real — two classification approaches plus survival analysis, cross-checked against public fiscal data — and because knowing what to leave out of production is as much a decision as what to automate.
Este é o único subsistema aqui que é honestamente offline: um pipeline de pesquisa para uma carteira de recebíveis consignados, revisado por uma pessoa, não um job automático diário. Está incluído porque as escolhas de modelagem são reais — duas abordagens de classificação mais análise de sobrevivência, cruzadas com dados fiscais públicos — e porque saber o que deixar de fora da produção é uma decisão tão real quanto o que automatizar.
A borrower's risk isn't only the borrower's.
O risco de um sacado não é só dele.
These are payroll-deductible receivables authorized through agreements with public-sector entities — municipalities and states. A purely transaction-level model misses something structural: if the entity behind the payroll itself is under fiscal stress, that can ripple into payment reliability across every contract tied to it, regardless of any individual borrower's own history. So the question isn't just "will this contract default," it's "will it keep performing, and does the counterparty's own fiscal health say anything about that."
São recebíveis consignados autorizados por convênios com entes públicos — municípios e estados. Um modelo puramente transacional deixa passar algo estrutural: se o ente por trás da folha está sob estresse fiscal, isso pode se refletir na confiabilidade de pagamento de todos os contratos ligados a ele, independentemente do histórico individual de cada sacado. A pergunta não é só "esse contrato vai entrar em default", é "ele vai continuar performando, e a saúde fiscal da contraparte diz algo sobre isso".
Three models, one panel of contracts
Três modelos, um painel de contratos
The pipeline
O pipeline
Labels at four lateness thresholds, official ratings as features
Rótulos em quatro limiares de atraso, ratings oficiais como features
Default is labeled at 1, 30, 60, and 120 days past due, with 60 days as the primary target. Two official Brazilian scales feed the model as features rather than being invented by it: CAPAG, the National Treasury's A–D payment-capacity rating for public entities, and the BACEN Resolution 2.682 AA–H scale for the loan's own credit quality.
O default é rotulado em 1, 30, 60 e 120 dias de atraso, com 60 dias como alvo principal. Duas escalas oficiais brasileiras entram como features, não são inventadas pelo modelo: a CAPAG, rating A–D de capacidade de pagamento de entes públicos do Tesouro Nacional, e a escala AA–H da Resolução BACEN 2.682 para a qualidade de crédito do próprio contrato.
Two classifiers, validated two different ways
Dois classificadores, validados de duas formas diferentes
A cross-sectional model — LightGBM vs. XGBoost vs. a logistic-regression baseline, Optuna-tuned, selected by validation PR-AUC — is fit within a single snapshot on a stratified split, deliberately not time-based. A second, walk-forward model takes only contracts performing normally at one snapshot and predicts default roughly ninety days later, tested on the most recent snapshot held out entirely — out-of-time validation, grouped by contract so no contract leaks across the split.
Um modelo cross-sectional — LightGBM vs. XGBoost vs. um baseline de regressão logística, otimizado com Optuna, selecionado por PR-AUC de validação — é ajustado dentro de um único snapshot, com split estratificado, deliberadamente não temporal. Um segundo modelo, walk-forward, pega só contratos performando normalmente num snapshot e prediz default cerca de noventa dias depois, testado num snapshot mais recente inteiramente isolado — validação out-of-time, agrupada por contrato para nenhum contrato vazar entre os splits.
A third lens: how long until it stops paying
Uma terceira lente: até quando continua pagando
Alongside both classifiers, a survival model — Kaplan-Meier curves by state, payment-capacity rating, and cost-of-credit quartile, plus a Cox proportional-hazards model — answers a different question: not "will it default" but "what's the probability it's still current at 30, 60, 90, 120 days." Its own documentation is explicit about the caveats — early payoffs can censor the data in a way that isn't entirely random, and the classification isn't a clean daily observation.
Junto dos dois classificadores, um modelo de sobrevivência — curvas de Kaplan-Meier por UF, rating de capacidade de pagamento e quartil de custo de crédito, mais um modelo de riscos proporcionais de Cox — responde uma pergunta diferente: não "vai entrar em default", mas "qual a probabilidade de ainda estar em dia aos 30, 60, 90, 120 dias". A própria documentação é explícita sobre as ressalvas — liquidações antecipadas podem censurar os dados de um jeito que não é totalmente aleatório, e a classificação não é uma observação diária limpa.
Public fiscal data, matched with a human checkpoint
Dado fiscal público, casado com um checkpoint humano
Each counterparty's free-text name is fuzzy-matched to an official municipality code, exported for manual review before anything is fetched, then joined to two real public filings — the fiscal management report's personnel-expense ratio and the budget-execution report's primary result — to test whether local fiscal stress carries signal about payment reliability.
O nome em texto livre de cada contraparte é casado por fuzzy matching a um código de município oficial, exportado para revisão manual antes de qualquer busca, depois cruzado com duas prestações de contas públicas reais — o índice de despesa com pessoal do relatório de gestão fiscal e o resultado primário do relatório de execução orçamentária — para testar se o estresse fiscal local carrega sinal sobre a confiabilidade de pagamento.
Every prediction, explained
Toda predição, explicada
SHAP attributions are computed for the winning classifier so each score comes with a ranked list of which features pushed it up or down, and by how much — the artifact a credit committee actually reads.
Atribuições SHAP são computadas para o classificador vencedor, de modo que cada score venha com uma lista ranqueada de quais features o empurraram para cima ou para baixo, e por quanto — o artefato que um comitê de crédito de fato lê.
Engineering decision
Decisão de engenharia
Everything else in this platform runs unattended every morning, with retries and alerting behind it. A scoring model that feeds directly into a daily automated report needs more than that: drift monitoring, a retraining policy, and a way to catch the model quietly degrading as the portfolio's composition shifts — none of which exists here yet. Shipping the model into automation before that infrastructure exists would trade a known, documented, human-reviewed estimate for an unmonitored one that looks identical from the outside. The model stays a versioned, reproducible analysis a person runs and reads, which is a smaller but honest claim than "in production."
Tudo mais nesta plataforma roda sem supervisão toda manhã, com retries e alertas por trás. Um modelo de score que alimenta diretamente um relatório automático diário precisa de mais do que isso: monitoramento de drift, uma política de retreino, e um jeito de pegar o modelo degradando silenciosamente conforme a composição da carteira muda — nada disso existe aqui ainda. Colocar o modelo na automação antes dessa infraestrutura existir trocaria uma estimativa conhecida, documentada e revisada por humano por uma sem monitoramento que parece idêntica de fora. O modelo permanece uma análise versionada e reprodutível que uma pessoa roda e lê, o que é uma afirmação menor, porém honesta, do que "em produção".
Matching a free-text counterparty name to an official municipality is easy to get subtly wrong — Brazil has multiple towns sharing the same name across different states, so a fuzzy match can score a real similarity and still point at the wrong one. An automated pipeline would silently attach the wrong city's fiscal filings to a contract, which is worse than fetching nothing at all: it produces a confident, wrong feature. So the match step exports its candidates for manual review and stops there — nothing is fetched until a person approves the mapping.
Casar um nome de contraparte em texto livre a um município oficial é fácil de errar de forma sutil — o Brasil tem várias cidades homônimas em estados diferentes, então um fuzzy match pode acertar uma similaridade real e ainda assim apontar para a cidade errada. Um pipeline automatizado anexaria silenciosamente a prestação de contas fiscal da cidade errada a um contrato, o que é pior do que não buscar nada: produz uma feature confiante e errada. Por isso a etapa de casamento exporta seus candidatos para revisão manual e para ali — nada é buscado até uma pessoa aprovar o mapeamento.
Findings from this research get shared as a report, and the report generator for it takes anonymization further than blurring a heatmap: sensitive text is deleted and replaced in the actual HTML source, not styled invisible, and every chart image is decoded, blurred, and re-encoded so the original pixels don't survive in the file. A self-check scans the finished document for known sensitive terms and fails the build if any survive, rather than trusting the redaction rules to have been complete.
Os achados dessa pesquisa são compartilhados como relatório, e o gerador desse relatório leva a anonimização além de borrar um heatmap: texto sensível é apagado e substituído na própria fonte HTML, não estilizado como invisível, e toda imagem de gráfico é decodificada, borrada e recodificada, de modo que os pixels originais não sobrevivem no arquivo. Uma auto-checagem varre o documento final por termos sensíveis conhecidos e falha o build se algum sobreviver, em vez de confiar que as regras de redação foram completas.