Skip to main content

Interpretable binning with temporal stability diagnostics for credit risk, PD, and scorecard workflows.

Project description

RiskBands

Binning para risco de credito com foco em robustez temporal, comparacao entre candidatos e racional auditavel.

Documentacao oficial | Benchmark PD vintage | Quickstart | API


O que e o RiskBands

O RiskBands e uma biblioteca para construir, comparar e auditar candidatos de binning quando o problema real nao e apenas maximizar uma metrica estatica, mas tambem defender o resultado ao longo do tempo.

Ele foi pensado especialmente para contextos como:

  • modelos de PD
  • scorecards de credito
  • variaveis com drift temporal
  • leitura relevante por safra ou vintage
  • estruturas com bins raros, baixa cobertura ou reversoes de ranking

A pergunta central do projeto e simples:

Um binning que parece otimo no agregado continua defensavel quando voce abre o comportamento por safra?

Onde o projeto se diferencia

O OptimalBinning ja resolve muito bem o problema de corte estatico. O RiskBands nao tenta negar isso.

No fluxo supervisionado numerico do repositorio atual, o projeto reaproveita optbinning.OptimalBinning no backend do corte estatico. O diferencial esta no que vem depois:

  • diagnostico temporal por variavel, bin e periodo
  • penalizacoes estruturais para fragilidade, baixa cobertura e volatilidade
  • comparacao entre candidatos via BinComparator
  • score objetivo mais alinhado a trade-offs de risco de credito
  • resumos auditaveis para explicar por que um candidato venceu

Em outras palavras:

  • OptimalBinning puro ajuda a encontrar um bom corte estatico
  • RiskBands ajuda a decidir se esse corte continua sendo a melhor resposta para credito quando o tempo entra na analise

Arquitetura de score

O repositório agora expõe dois caminhos explícitos de score:

  • legacy Mantém o objetivo histórico baseado em componentes positivos menos penalidades.
  • stable Introduz a estratégia pública recomendada para robustez temporal, orientada a minimização, com componentes normalizados e foco em equilíbrio entre separação e estabilidade.

O stable combina:

  • variância temporal ponderada do WoE shrinkado
  • drift entre janelas adjacentes
  • penalidade de inversão de ranking entre bins
  • penalidade de separação insuficiente
  • entropy penalty para distribuições degeneradas
  • PSI como proxy de estabilidade em produção

Todos os componentes são normalizados em modo absoluto, então o score funciona mesmo quando apenas um candidato está sendo avaliado.

Os pesos padrão são:

  • temporal_variance_weight=0.22
  • window_drift_weight=0.18
  • rank_inversion_weight=0.20
  • separation_weight=0.20
  • entropy_weight=0.08
  • psi_weight=0.12

O shrink de WoE é tratado como camada de robustez, não como score isolado:

  • WoE raw por bin e período
  • shrink em direção ao WoE global do bin
  • uso do WoE shrinkado nos componentes temporais

Instalacao

Instalacao base:

pip install riskbands

Extra opcional para graficos Plotly e export HTML dos benchmarks:

pip install "riskbands[viz]"

Para desenvolvimento, testes e notebooks:

git clone https://github.com/joaaomaia/RiskBands.git
cd RiskBands
pip install -e .[dev]

Como comecar

Porta tecnica:

Porta metodologica:

Quickstart minimo

import numpy as np
import pandas as pd

from riskbands import Binner

rng = np.random.default_rng(0)
n = 800

df = pd.DataFrame({"score": rng.normal(size=n)})
df["month"] = rng.choice([202301, 202302, 202303, 202304], size=n)

proba = 0.20 + 0.15 * df["score"] + 0.02 * (df["month"] - 202301)
proba = np.clip(proba, 0.01, 0.99)
df["target"] = (rng.random(n) < proba).astype(int)

binner = Binner(
    strategy="supervised",
    max_n_bins=5,
    check_stability=True,
    monotonic="ascending",
    min_event_rate_diff=0.03,
    score_strategy="stable",
    normalization_strategy="absolute",
    woe_shrinkage_strength=40.0,
)

binner.fit(df, y="target", column="score", time_col="month")
score_bins = binner.transform(df["score"])
summary = binner.summary()
score_details = binner.score_details()
diagnostics = binner.diagnostics(kind="bin")

Fluxo mais amigavel, no estilo sklearn/pandas:

  • fit(df, y="target", column="score", time_col="month")
  • transform(df) ou transform(df["score"])
  • fit_transform(df["score"], y=df["target"])
  • binning_table(), summary(), report(), score_details(), diagnostics()
  • get_params() e set_params(...) com aliases como max_n_bins e monotonic_trend

Customização do objective

binner = Binner(
    strategy="supervised",
    check_stability=True,
    use_optuna=True,
    time_col="month",
    score_strategy="stable",
    score_weights={
        "temporal_variance_weight": 0.18,
        "window_drift_weight": 0.16,
        "rank_inversion_weight": 0.22,
        "separation_weight": 0.24,
        "entropy_weight": 0.08,
        "psi_weight": 0.12,
    },
    normalization_strategy="absolute",
    woe_shrinkage_strength=35.0,
    strategy_kwargs={"n_trials": 10},
)

Leitura rápida:

  • no legacy, maiores scores continuam melhores
  • no stable, menores scores são melhores
  • relatórios auditáveis expõem score final, componentes raw, componentes normalizados, pesos, estratégia e parâmetros de shrink

Benchmark principal do repositorio

O benchmark mais importante hoje compara tres lentes:

  1. OptimalBinning puro como baseline externa
  2. RiskBands estatico como baseline interna
  3. RiskBands balanceado/temporal como abordagem orientada a credito

Materiais principais:

O que o projeto nao tenta ser

O foco do RiskBands e binning. Ele nao tenta, sozinho, ser:

  • pipeline completo de modelagem de PD
  • framework de monitoramento de carteira
  • solucao completa de MLOps para credito

A proposta e ser uma camada especializada e forte de decisao sobre binning.

Mensagem principal

O RiskBands nao tenta substituir a forca do OptimalBinning.

Ele tenta responder melhor a pergunta que aparece no mundo real de credito:

Entre os candidatos que parecem bons no agregado, qual continua mais defensavel quando o tempo entra na decisao?

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

riskbands-2.0.0.tar.gz (64.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

riskbands-2.0.0-py3-none-any.whl (57.6 kB view details)

Uploaded Python 3

File details

Details for the file riskbands-2.0.0.tar.gz.

File metadata

  • Download URL: riskbands-2.0.0.tar.gz
  • Upload date:
  • Size: 64.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riskbands-2.0.0.tar.gz
Algorithm Hash digest
SHA256 d7350c183668dc1efa66a25a702f398b189f02b1c1b1292bc313d33bde8a1077
MD5 b1229965120012dcfe7c32329b3f6c72
BLAKE2b-256 0faf448e9ff7f2461b8eff0f46a87bf219e5ad2127285b22a51c6ab883ef4c0a

See more details on using hashes here.

Provenance

The following attestation bundles were made for riskbands-2.0.0.tar.gz:

Publisher: publish-pypi.yml on joaaomaia/RiskBands

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riskbands-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: riskbands-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 57.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riskbands-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 79ab5d6727c43385c5751f209d1114b6b115f655b93471c31a5cc4f923e714e2
MD5 740ad3e90421f52a93936d14205880bf
BLAKE2b-256 2571ba0ed9fd8309bdd4e18f6e09521f7332ed54f70e3526613508d32bc12793

See more details on using hashes here.

Provenance

The following attestation bundles were made for riskbands-2.0.0-py3-none-any.whl:

Publisher: publish-pypi.yml on joaaomaia/RiskBands

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page