Skip to main content
Glama
Alessandro-Donnini

credit-risk-intelligence-mcp

README.md
# πŸ’³ Credit Risk Intelligence System

**Un sistema di credit scoring che valuta il rischio di un cliente e spiega la sua decisione in linguaggio naturale β€” un modello statistico interpretabile e verificato fa i calcoli, 4 agenti AI (Claude) li orchestrano e li raccontano.**

[![Repository](https://img.shields.io/badge/GitHub-repository-blue)](https://github.com/Alessandro-Donnini/credit-risk-intelligence-system)

---

## In azione

Un utente compila i dati di un cliente in un form web (nessun terminale richiesto), e il sistema restituisce in pochi secondi: probabilitΓ  di default, spiegazione dei fattori che l'hanno determinata, verifica di quanto ci si puΓ² fidare della previsione, e rapporti finanziari β€” il tutto scritto come un vero credit memo.

```powershell
streamlit run src/agents/app.py
```

> **Esempio di output** (cliente con storico di pagamento regolare ma limite di credito e rimborsi contenuti):
> **PD: 44.72%** β€” rischio medio-alto Β· **AffidabilitΓ : alta** (cliente tipico, 99.91Β° percentile) Β· **Fattore protettivo principale:** pagamento puntuale (PAY_0) Β· **Fattore di rischio principale:** rimborsi storicamente bassi rispetto al limite concesso

## Come funziona, in breve

```
                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                         β”‚   SUPERVISOR AGENT   β”‚
                         β”‚  (sintetizza tutto)  β”‚
                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚                β”‚                     β”‚                β”‚
        β–Ό                β–Ό                     β–Ό                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Risk Modeling β”‚ β”‚Explainabilityβ”‚  β”‚      Critic       β”‚ β”‚  Rapporti    β”‚
β”‚     Agent      β”‚ β”‚    Agent     β”‚  β”‚      Agent        β”‚ β”‚  finanziari  β”‚
β”‚                β”‚ β”‚              β”‚  β”‚                    β”‚ β”‚              β”‚
β”‚ "Quanto rischiaβ”‚ β”‚  "PerchΓ©?"   β”‚  β”‚"Posso fidarmi di   β”‚ β”‚"Come si      β”‚
β”‚  questo        β”‚ β”‚  (SHAP)      β”‚  β”‚ questa previsione?"β”‚ β”‚ comporta il  β”‚
β”‚  cliente?"     β”‚ β”‚              β”‚  β”‚ (Mahalanobis)      β”‚ β”‚ cliente?"    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                 β”‚                     β”‚                   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   MODELLO STATISTICO (Logistic     β”‚
                    β”‚   Regression, AUC-ROC 0.7629)      β”‚
                    β”‚   L'UNICA fonte di ogni numero.    β”‚
                    β”‚   Nessun agente inventa mai una    β”‚
                    β”‚   probabilitΓ  o un contributo.     β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

Ogni agente chiama uno strumento Python deterministico (mai una stima "a mente" della LLM) e traduce il risultato in linguaggio naturale. Lo stesso modello Γ¨ raggiungibile anche via **server MCP** standard, verificato con l'MCP Inspector ufficiale.

## Risultati

| Metrica | Valore |
|---|---|
| AUC-ROC (test set / 5-fold CV) | 0.7629 / 0.7717 Β± 0.0087 |
| Recall @ soglia ottimizzata | 0.8117 |
| Variabile piΓΉ predittiva | `PAY_0` (storico pagamento recente), IV = 0.898 |
| Test automatici | 21, tutti superati |
| Costo medio per credit memo | β‰ˆ $0.03 (misurato) |

![Curva ROC](models/roc_curve.png)

## PerchΓ© Γ¨ piΓΉ di un modello

Molti progetti di data science si fermano al modello. Questo va oltre, con scelte metodologiche esplicite e verificate:

- **Nessun data leakage**: ogni calcolo statistico (WOE, binning, PSI) usa solo il train set, mai il test.
- **Due modelli confrontati onestamente**: Logistic Regression scelta sopra Gradient Boosting nonostante quest'ultimo ottenga metriche leggermente superiori β€” il guadagno non giustificava la perdita di interpretabilitΓ  in un contesto normato come il credito.
- **Explainability verificata matematicamente**: i contributi SHAP di ogni cliente ricostruiscono esattamente, cifra per cifra, la probabilitΓ  del modello.
- **Robustezza**: limite di iterazioni sugli agenti, gestione degli errori di rete e di input malformato, validazione dei dati in ingresso, guardrail espliciti sullo scopo β€” non solo "il caso felice".
- **Limiti dichiarati, non nascosti**: l'Expected Loss usa stime di settore per LGD/EAD (non presenti nel dataset), documentato esplicitamente nel codice.

## Come lanciare il progetto

```powershell
# Ambiente
python -m venv venv && .\venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt

# Pipeline dati -> modello (necessaria prima di usare gli agenti)
python src\data\run_pipeline.py

# Interfaccia web
streamlit run src\agents\app.py

# Oppure un singolo agente da terminale
python src\agents\supervisor_agent.py

# Test automatici
python -m pytest tests\ -v

# Server MCP (richiede Node.js per l'Inspector)
npx @modelcontextprotocol/inspector python src\agents\mcp_server.py
```

Richiede una `ANTHROPIC_API_KEY` in un file `.env` nella root del progetto.

## Il dataset

**"Default of Credit Card Clients"**, UCI Machine Learning Repository (Yeh & Lien, 2009). 30.000 clienti reali di carte di credito a Taiwan, 23 variabili esplicative, licenza CC BY 4.0.

## Approfondimenti tecnici

<details>
<summary><strong>Sistema multi-agente, in dettaglio</strong></summary>

- **Risk Modeling Agent** β€” chiama `score_new_client`, mai genera il numero da solo.
- **Explainability Agent** β€” chiama `explain_client_shap` (SHAP con `LinearExplainer`, esatto per modelli lineari).
- **Critic Agent** β€” chiama `check_client_typicality` (distanza di Mahalanobis), usa Claude Haiku per contenere i costi su un compito semplice.
- **Supervisor Agent** β€” orchestra tutti gli strumenti sopra piΓΉ `calculate_financial_ratios`, dΓ  prioritΓ  esplicita agli avvisi di atipicitΓ  o dati implausibili nella sintesi finale.

Verificato concretamente: lo stesso cliente valutato tramite script diretto, tre agenti diversi, e il server MCP produce sempre lo stesso identico risultato (0.4472).

</details>

<details>
<summary><strong>Metodologia del modello, in dettaglio</strong></summary>

- **Data Quality Assessment**: 345 anomalie corrette in `EDUCATION`, 54 in `MARRIAGE`; un caso analogo in `PAY_0...PAY_6` (valori `-2`/`0` non documentati ma strutturali) identificato e volutamente non "corretto", perchΓ© parte reale del dataset.
- **Selezione delle feature** su Information Value e matrice di correlazione: escluse `MARRIAGE` (IV troppo basso) e le 6 `BILL_AMT` (IV bassissimo e correlate tra loro).
- **Soglia di decisione** ottimizzata su un criterio di business esplicito (Recall β‰₯ 0.80), con il trade-off in Precision quantificato, non ignorato.

</details>

<details>
<summary><strong>Struttura del progetto</strong></summary>

```
β”œβ”€β”€ data/raw/                # dataset grezzo
β”œβ”€β”€ models/                  # modello, trasformazioni, grafici
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ data/                # pipeline: caricamento, pulizia, feature engineering, training
β”‚   └── agents/               # 4 agenti Claude, server MCP, interfaccia Streamlit
└── tests/                   # 21 test automatici
```

</details>

---

*Progetto di [Alessandro Donnini](https://github.com/Alessandro-Donnini) β€” MSc Marketing Management, Bocconi. Costruito come pezzo di portfolio per una transizione verso ruoli di Data Science / Corporate Finance.*