Caso cliente: Finanx – Crédito ágil para pymes y consumo

Implementamos un score de riesgo crediticio con ML.NET, APIs en ASP.NET Core, y tablero de seguimiento para mejorar aprobación, reducir NPL y garantizar explicabilidad.

ML.NET ASP.NET Core Azure App Service SQL Server

1) Contexto del negocio

Finanx opera dos líneas de crédito: consumo (límites bajos–medios, alto volumen) y pymes (límites medios–altos, mayor documentación). Crecimiento acelerado con originaciones 100% digitales.

  • Aprobaciones lentas (24–72h) por revisiones manuales.
  • Morosidad creciente en cohortes recientes.
  • Costos altos por verificaciones humanas y fraudes sutiles.
  • Falta de trazabilidad en decisiones (por qué se aprueba/declina).

2) Problema principal

Mejorar la precisión de riesgo sin frenar el crecimiento.

  • ¿A quién aprobar y en qué monto/condiciones?
  • ¿Cómo detectar a tiempo créditos con alta probabilidad de mora?
  • ¿Cómo explicar la decisión con transparencia y cumplimiento?

3) Objetivo del proyecto (MVP 8–10 semanas)

  • Score de riesgo a 90 días con ML.NET, expuesto vía API .NET.
  • Reducir NPL y acelerar TAT.
  • Explicabilidad por caso y monitoreo por cohortes / drift.

4) Alcance funcional del MVP

Originación y scoring

  • Ingreso de solicitud + buró (si aplica).
  • Scoring binario a 90 días (moroso / no moroso).
  • Motor de decisión con umbrales por segmento.

Observabilidad

  • Dashboard (Blazor): KPIs, distribución de scores, AUC/KS.
  • Explicabilidad local (per-features).
  • Retrain mensual, validación A/B.

5) Datos disponibles y “data gaps”

Históricos de 24–36 meses (solicitudes, transacciones, operación, comportamiento, etiquetas 90d).

Disponibles

  • Solicitud (edad, ingresos, ocupación, etc.).
  • Banco(s): saldo, variabilidad de ingresos.
  • Operación: monto, plazo, producto, canal.
  • Comportamiento: pagos, buckets 30/60/90.

Gaps

  • Buró externo (si aplica).
  • Señales antifraude (device/IP/geo).
  • Normalización de ingresos por estacionalidad.

Para el prototipo: mapeo al dataset German Credit (UCI) y posteriormente conexión a datos reales.

6) Variables candidatas (ejemplos)

Sociodemográficas

Edad, estado civil, dependientes.

Ingresos & estabilidad

Ingreso, variabilidad, antigüedad laboral.

Endeudamiento

Cuota/ingreso, préstamos activos, atrasos.

Producto

Monto, plazo, tasa, tipo (consumo/pyme).

Comportamiento

Pagos a tiempo, mínimos, promesas de pago.

Canal & señales

Canal, dispositivo, hora/día.

7) Métricas de éxito

AUC/ROC

≥ 0.78

KS

> 0.35

PSI

< 0.25

TAT

↓ significativo

Negocio: ↓ NPL90, ↑ tasa de aprobación sin incrementar NPL, ↑ ROI.

8) Requerimientos no funcionales y compliance

  • Explicabilidad por caso (razones top del score).
  • Auditoría: versionado de datasets, features, modelos y decisiones.
  • Seguridad: cifrado en tránsito/reposo, Identity/JWT.
  • Privacidad: PII minimizada (GDPR/ley local).
  • Despliegue: contenedores en Azure App Service; CI/CD.

9) Arquitectura técnica (alto nivel)

Abrir demo

Pipeline de datos, entrenamiento y servicio de scoring operando con observabilidad continua.

Ingesta / ETL .NET + ADF Batch / Streaming SQL Operacional + Almacén histórico Entrenamiento ML.NET AutoML + Tuning Model Registry model.zip + métricas API ASP.NET Core /score < 150ms JWT + Auditoría Dashboard Blazor Métricas, cohortes, explicabilidad Monitoring & Alerts APM, PSI, AUC/KS Motor de decisión Umbrales por segmento / políticas

10) Usuarios y casos de uso

Analista de riesgo

Ajuste de umbrales, estabilidad, calibración.

Originación

Uso del score, solicitud de documentación.

Cumplimiento

Auditoría de decisiones, fairness.

Dirección

KPIs de originación, pérdidas, ROI.

Historias

  • Ver distribución de score diaria y cutoff óptimo.
  • Ver motivos del score por solicitud para pedir docs precisas.
  • Auditar una decisión con versión de modelo y features usados.

11) Riesgos y mitigaciones

Técnicos / Datos

  • Target leakage → validación temporal, exclusión de variables post-aprobación.
  • Drift → PSI, retrain mensual, champion/challenger.
  • Calidad → validadores de esquema, outliers, missing.

Éticos / Cumplimiento

  • Sesgo/fairness → métricas por segmento y ajustes de políticas.
  • Privacidad/seguridad → PII minimizada, cifrado, controles de acceso.

12) Plan por fases (8–10 semanas)

  1. Sem 1–2: Descubrimiento + contrato de esquema + mapeo a dataset público.
  2. Sem 3–4: Feature engineering + baseline AutoML ML.NET + evaluación/explicabilidad.
  3. Sem 5–6: API /score + dashboard Blazor + seguridad.
  4. Sem 7–8: Monitoreo, UAT con casos reales, documentación y handover.

Sem 1–2

Sem 3–4

Sem 5–6

Sem 7–8

Data mapping → German Credit (UCI) – Prototipo

Label objetivo: default_90d = 1 si hay impago, 0 si no.

Dominio Finanx (real) Descripción negocio German Credit Tipo Transformación / Notas
applicant_idIdentificador solicitud(generar)stringGUID en prototipo
ageEdad del solicitanteageintValidar 18–80
employment_yearsAntigüedad laboralemploymentDurationcategórica“>=7years”→7, “1<=”→1…
income_monthlyIngreso mensual(no directa)decimalAproximar c/creditAmount/plazo o simular
dependentsDependientes(no directa)intSimular (0–3)
marital_statusEstado civilpersonalStatusAndSexcategóricaSeparar sexo/estado civil (opcional)
housingViviendahousingcategóricaOne-hot
purposePropósito del créditopurposecategóricaOne-hot / bucket
loan_amountMonto solicitadocreditAmountdecimalEscalado log
loan_term_monthsPlazo (meses)durationintYa viene en meses
checking_statusSaldo cuenta corrientecheckingStatuscategóricaOrdinal encoding
savings_statusAhorrossavingscategóricaOrdinal encoding
other_debtorsCo-deudores/garantesotherDebtorscategóricaOne-hot
installment_rate% cuota/ingresoinstallmentRateintValores 1–4
existing_creditsNº créditos existentesexistingCreditsCountintTal cual
job_typeTipo de empleojobcategóricaOne-hot
phoneTeléfonotelephonebinaria1/0
foreign_workerTrabajador extranjeroforeignWorkerbinaria1/0
default_90dImpago 90 díasclassbinaria“bad”→1, “good”→0