Saltar a contenido

Provisiones sin normativa local

Nikodym trae un motor de provisiones que no conoce ninguna tabla de supervisor. Calcula la pérdida esperada sobre los grupos que tú defines, con tu probabilidad de incumplimiento y tu severidad, y publica el resultado con trazabilidad completa.

Esta guía lo demuestra corriendo, de punta a punta, sin una sola línea de norma de ningún país.

Estabilidad (SemVer 1.x)

La sección provisioning_internal es experimental, igual que el resto de provisiones del paquete: está implementada, testeada y con preset e informe propios, pero queda fuera de la garantía SemVer 1.x —el contrato puede crecer o cambiar antes de un 2.0—. La parte estable del camino es el pipeline de scorecard F1 que produce la PD.

Qué hace y qué no

Lo que hace:

El motor de provisión interna no conoce ninguna tabla de supervisor: tú declaras tus grupos, tu PD y tu severidad, y él calcula PE = PI · PDI · Exposición con aritmética exacta y trazabilidad completa. Lo que no hace es interpretar tu norma por ti: la clasificación, la mora, las garantías y los mínimos los aterriza el modelador encima.

Esa frase es el alcance completo, y conviene leerla en los dos sentidos. El cálculo es neutro de verdad: cero matrices, cero tramos de mora, cero categorías de rating, cero porcentajes normativos. Y lo que la norma de tu país exige alrededor no está dentro del motor: la clasificación de deudores, los tramos de mora, las garantías y sus aforos, los mínimos regulatorios —salvo el piso y el techo de la severidad— y las provisiones adicionales se calculan fuera y entran como columnas ya resueltas.

Lo que se calcula fuera no queda en el rastro de auditoría

Si precalculas la clasificación o el efecto de las garantías en tu propio proceso, esas decisiones no entran en el config_hash ni en el anexo de configuración del informe. El documento será correcto y reproducible respecto de lo que el motor hizo, pero la parte que hiciste antes tendrás que documentarla tú. Tenlo presente si el informe va a un validador.

Qué necesita de tus datos

Cuatro columnas, y ninguna tiene un nombre impuesto:

Columna Qué es
Fecha de corte La fecha a la que está referida la cartera. Un solo valor para toda la corrida.
Cartera El grupo al que pertenece cada operación, en tu taxonomía. El motor agrupa por ella; no la interpreta.
Exposición El monto expuesto de cada operación.
Severidad (LGD) La pérdida dado el incumplimiento, como columna de tus datos.

La probabilidad de incumplimiento no es una columna: la produce el pipeline —el scorecard calibrado— o la traes tú como tabla aparte.

Correrlo

El preset f5-provision-interna-generica trae todo configurado sobre un conjunto de datos de ejemplo cuya cartera se llama nomina, microempresa y consumo_senior: nombres de negocio que ninguna norma define.

from pathlib import Path

import nikodym
from nikodym.core.config import NikodymConfig
from nikodym.ui.datasets import materialize
from nikodym.ui.presets import get_preset

preset = get_preset("f5-provision-interna-generica")
config = dict(preset["config"])

# El preset no trae ruta de datos: apúntala a tu archivo (.csv, .parquet o .xlsx).
# Aquí se materializa el conjunto de ejemplo del propio catálogo.
origen = materialize(preset["dataset_id"], workdir=Path("nikodym-runs"))
config["data"] = {**config["data"], "load": {**config["data"]["load"], "source": str(origen)}}

# `run_dir` es donde queda la evidencia de la corrida: el audit-trail, el entorno y —si
# declaras la sección `governance`— el model card. Sin él la corrida no escribe nada.
study = nikodym.run(
    NikodymConfig.model_validate(config),
    run_dir=Path("nikodym-runs") / "provision-interna",
)

card = study.artifacts.get("provisioning_internal", "card")
print(card.total_internal_provision, card.n_groups)

Con el conjunto de ejemplo eso imprime la provisión total y 30, que son los grupos: tres carteras por diez bandas de puntaje.

Desde la interfaz es el mismo camino: eliges el trabajo PD + LGD en una corrida, cargas tus datos, dices qué columna es cada cosa y ejecutas. Es el trabajo que corre la cadena completa —scorecard y provisión en una sola corrida—, igual que el ejemplo de arriba. Si tu PD ya está calculada y sólo quieres la provisión, el trabajo es Provisión interna / LGD, que en vez de estimarla te pide subir la PD calibrada como una tabla aparte.

Qué obtienes

Un informe con su capítulo de provisiones: la provisión constituida, el desglose por grupo y la configuración efectiva en el anexo. Sobre el conjunto de ejemplo son 30 grupos: tres carteras por diez bandas de puntaje.

El preset genera el informe en html, pdf, md y docx. Las tablas por operación no caben en el documento, así que si las quieres completas hay que pedirlas: añade csv o xlsx a report.formats y quedarán como archivos en el directorio de salida —no entre los botones de descarga de la interfaz—.

El informe no nombra ninguna jurisdicción, y tampoco afirma una moneda que no le hayas declarado. Si quieres que la publique, decláralo en el config antes de nikodym.run(...):

config["report"] = {**config["report"], "currency": "S/"}

Cómo aterrizar tu norma encima

El patrón es siempre el mismo: lo que tu supervisor define, se resuelve antes y entra como columna.

  • Clasificación de deudores. Calcula tu categoría con tus reglas y pásala como la columna de cartera, o como el grupo homogéneo si quieres controlar la agrupación tú mismo.
  • Tramos de mora. Igual: son un insumo de tu clasificación, no algo que el motor derive.
  • Garantías y aforos. Ajusta la exposición o la severidad antes de entregarlas.
  • Mínimos. El piso y el techo de la severidad se declaran en la configuración. Un mínimo sobre la provisión o sobre la PD se aplica fuera.

La comparación contra tu método estándar no se puede declarar

Si tu supervisor exige constituir el máximo entre su método estándar y el método interno, esa comparación hoy no es expresable en la configuración. El comparador de provisiones sólo admite como fuentes los tres motores que trae el paquete (ProvisioningSource, src/nikodym/provisioning/config.py:64) y además exige que las dos sean distintas, así que no hay forma de apuntar una de ellas a un cálculo tuyo. La salida es correr el método interno con Nikodym, calcular tu método estándar por fuera y quedarte con el máximo en tu propio proceso —con la salvedad del recuadro de arriba: ese último paso no queda en el rastro de auditoría del informe—.

Si prefieres no hacer ese trabajo, lo hace Nikodym Advisory como integración. La librería seguirá siendo gratuita y completa: lo que se paga es el aterrizaje, no el motor.

¿Y si mi país necesita un motor propio?

No lo vamos a publicar. Mantener al día las circulares de cada supervisor es insostenible para una librería, y prometerlo sería peor que no ofrecerlo. Hay un caso de referencia implementado y congelado —Chile, CMF Capítulo B-1—, que existe como evidencia de que el aterrizaje se puede hacer bien: puedes verlo en Aterrizar una norma local.