La selezione delle imprese a cui riconoscere affidabilità creditizia da parte di una banca è essenzialmente riconducibile – dal punto di vista metodologico – ad un esercizio di classificazione. La classificazione opera secondo uno schema dicotomico di tipo affidabile/non affidabile, e tiene conto di variabili di natura quantitativa e/o qualitativa a loro volta riconducibili ad alcune categorie di provenienza come le informazioni provenienti dai c.d. credit registry pubblici (la Centrale dei Rischi, ad esempio), dai credit bureau privati (Eurisc gestita da CRIF), dai dati a disposizione della banca e rivenienti dalla relazione e dai dati di natura economico-finanziaria a disposizione pubblicamente (si pensi al bilancio d’esercizio depositato presso la Camera di Commercio).
Sulla base dei dati a disposizione alla data di valutazione del merito di credito, la banca distingue le richieste di credito (anche la revisione periodica deve essere considerata come una richiesta di affidamento, almeno implicitamente) in “affidabili” e in “non affidabili” valutando la possibilità che in un arco di tempo relativamente breve (dodici mesi) si verifichi l’evento per il quale la controparte non viene considerata affidabile.
Questo evento è denominato default e può essere definito, ad esempio, ricorrendo alla definizione appositamente scelta nella regolamentazione prudenziale (il regolamento comunitario denominato Capital Requirement Regulation in attuazione dell’accordo sul capitale noto come Basilea 3) come 90-day past due or unlikely to pay (mancato pagamento che si protrae da oltre 90 giorni o inadempimento probabile).
Una delle difficoltà che si trova tradizionalmente a dover affrontare una banca, nella valutazione del merito di credito di un richiedente fido, è relativa al trattamento dei dati di provenienza fiscale per le imprese non soggette al bilancio d’esercizio. Nel lavoro che segue si mostra da un punto di vista metodologico l’approccio valutativo di tipo statistico, tipico dei modelli di scoring o rating utilizzati da molteplici intermediari finanziari, addattandolo ad un contesto che è quello tipico dell’aula di formazione composta da addetti provenienti dall’area commerciale, il cui compito è quello di istruire delle pratiche di affidamento relative ad imprese considerate meritevoli.
Il problema che si pone è quindi quello di selezionare, a monte del processo di erogazione del credito, le imprese la cui probabilità di essere, per così dire, accettate dal soggetto deliberante sia non nulla. Senza fare delle ipotesi scolastiche, è necessario quindi un criterio decisionale, o un algortimo semplificato, che consenta al soggetto proponente – l’area commerciale, per come è stata definita prima – di identificare le imprese che soddisfano i requisiti minimi affinché la banca le possa valutare come “bancabili”.
La soluzione di un problema di classificazione (ossia affidabile o non affidabile, nel contesto della valutazione del merito di credito) viene presentata ricorrendo a dei modelli di rating interni basati su approcci statistici1 – quali altri se no – il cui difetto principale è quello di costringere l’utente – un addetto fidi, ad esempio – a fare affidamento su di una procedura che “giri” su un computer.
Per ottenere una soluzione “comoda” si può ricorrere agli alberi decisionali fast-and-frugal, descritti nel lavoro del prof. N. Phillips et al2, che offrono un’alternativa molto valida ad un criterio di classificazione assistito dall’uso del computer e allo stesso tempo tendono ad essere molto intuitivi e facili da utilizzare.
Nel contesto di un’aula di formazione diventa necessario lavorare con dei casi concreti, spesso con il supporto cartaceo e la possibilità di prendere appunti su di esso, senza il supporto di un computer a cui rimandare i calcoli. L’approccio all’analisi dei dati con il supporto degli alberi decisionali forniti dalla procedura FFT (fast-and-frugal) fornisce qualcosa di concreto che consente di risolvere dei problemi, appunto di classificazione, in un modo pragmatico.
Si tratta di distinguere le imprese malate da quelle sane, assumendosi il rischio di classificare quelle malate come sane e viceversa.
Nella valutazione del rischio di credito la banca si espone a quattro fattori diversi di rischio:
Questi quattro fattori agiscono sulle perdite che la banca finisce per dover sopportare e, in un certo senso, devono essere valutati ex-ante, o preventivamente, ricorrendo a molteplici approcci. I problemi di classificazione o di selezione, a cui ci si riferisce in questo lavoro, sono quelli riferiti alla valutazione della probabilità di inadempimento che comportano la definizione di un punto, per così dire, di accettazione che definisce la soglia di probabilità oltre la quale diventa non più conveniente, nelle valutazioni della banca, assumersi quel particolare tipo di rischio.
La banca nell’attività di intermediazione creditizia “teme” soprattuto, come si vedrà meglio in seguito, di concedere prestiti a imprese non affidabili credendole meritevoli. Essa teme soprattutto quindi di commettere un errore nell’erogare credito a imprese poi inadempienti; considerando che un problema di classificazione applicato al campo medico dal punto di vista diagnostico equivale alla ricerca dei casi “positivi” ossia affetti dalla malattia, si può interpretare sempre dal punto di vista lessicale la valutazione del merito creditizio nella ricerca delle imprese potenzialmente “malate”.
Dal punto di vista sintattico si possono quindi sostituire indifferentemnte le espressioni “non affidabile” con “non meritevole”, oppure con “malata”, ricorrendo infine al termine “default”, maggiormente utilizzato nel campo creditizio. Default è l’evento che ricorre quindi quando il debitore non è meritevole, non affidabile, inadempiente, o “malato”. In altre parole, si tratta di distinguere le imprese “malate” da quelle “sane”, assumendosi il rischio di classificare quelle “malate” come “sane” e viceversa.
Ogni problema di classificazione o di selezione presuppone, riprendendo quanto accennato all’inizio, quattro possibili combinazioni in relazione alla classificazione prevista ex-ante e a quella effettiva rilevata ex-post. Per semplicità, la banca si trova a dover classificare, come si è già detto, le imprese richiedenti credito tra affidabili e non affidabili, anticipando in condizioni di incertezza le difficoltà di rimborso del prestito e trovandosi quindi di fronte a quattro casi possibili in relazione alla previsione con cui vengono ritenute essere meritevoli o meno di credito.
Utilizzando l’espressione lessicale di “default” e interpretandola come la manifestazione della “malattia”, almeno dal punto di vista creditizio, la banca si trova quindi di fronte a quattro casi possibili, come accennato, nel classificare le imprese clienti che possono essere riportati di seguito nella tabella a doppia entrata denominata confusion table:
Effettivo “malata” | Effettivo “non malata” | |
---|---|---|
Previsto “malata” | malata/malata (VP) | malata/non malata (FP) |
Previsto “non malata” | non malata/malata (FN) | non malata/non malata (VN) |
Infine sostituendo la classificazione binaria “malata/non malata”" con “si default/no default”" si possono rappresentare le quattro situazioni come segue:
Effettivo “si default” | Effettivo “no default” | Totali | |
---|---|---|---|
Previsto “si default” | si/si (VP) | si/no (FP) | “Si” previsti |
Previsto “no default” | no/si (FN) | no/no (VN) | “No” previsti |
Totali | “Si” effettivi | “No” effettivi | Totale campione |
I falsi positivi (FP, o errori di primo tipo) e i falsi negativi (FN, o errori di secondo tipo) sono quindi gli errori che vengono commessi, nel caso specifico, dalla banca nel classificare rispettivamente come debitore non affidabile un debitore che si rivela essere affidabile e come debitore affidabile un debitore che invece si rivela essere non affidabile. Si tratta di quelle situazioni in cui la banca si trova a rifiutare credito a imprese clienti invece meritevoli e a prestare credito a imprese clienti poi inadempienti. La tabella di confusion può essere riesposta utilizzando l’accorgimento lessicale tipico dei problemi di classificazione studiati nel campo medico, nel modo seguente:
Default effettivo si |
Default effettivo no |
|
---|---|---|
Default previsto si |
Hit | False alarm |
Default previsto no |
Miss | Correct Rejection |
Questi errori – miss e false alarm – sono impliciti in ogni scelta in condizioni di incertezza che si trova a dover effettuare una banca nel selezionare le imprese a cui erogare credito e la cui incidenza definisce la capacità di selezione della politica di credito: idealmente l’incidenza di questi errori sarebbe nulla se la banca fosse in grado di distinguere ex-ante correttamente tutte le situazioni che consentono l’affidamento da quelle da rifiutare invece – nessun miss o falso negativo e nessun false alarm o falso positivo.
Chiaramente l’incidenza degli errori di primo tipo (i falsi positivi o false alarm) tende a dominare rispetto a quelli di secondo tipo (i falsi negativi o miss) dal momento che i secondi hanno un impatto economico tendenzialmente molto maggiore dei primi: fare credito ad un’impresa poi inadempiente costa di più che rifiutare credito ad un’impresa meritevole, per cui è preferibile assumersi il rischio di sopportare i mancati introiti dal rifiuto del prestito rispetto a sopportare le perdite derivanti dal credito.
Si definiscono quindi, sempre dal punto di vista metodologico, alcuni indici sulla cui base valutare la bravura del criterio di selezione adottato nella valutazione delle imprese da affidare:
La banca ricerca quindi un criterio decisionale, o di selezione, che sia sensibile e specifico al tempo stesso nel rilevare la “malattia” dell’impresa: affinché sia accurato il criterio di selezione è necessario che sia specifico e sensibile alle caratteristiche della “malattia”, non deve perciò escludere troppe imprese “sane” trattandole come se fossero “malate”. Il problema della banca è quindi di ridurre per quanto possibile i casi di mancata classificazione corretta delle imprese non meritevoli, o malate (miss), e i casi di rifiuto nell’affidamento di imprese meritevoli temendo che siano malate (false alarm).
Come già accennato la banca – soprattutto nelle fasi di recessione relative al ciclo economico – tende ad assumere un atteggiamento di avversione al rischio tale da minimizzare gli errori di secondo tipo, di fatto annullandoli almeno nelle situazioni che comportano la valutazione di prima erogazione, aumentando però molto gli errori di primo tipo: rifiutanto di prestare credito indistintamente finisce per applicare un criterio molto sensibile ma scarsamente specifico.
Nel lavoro che segue proviamo ad esplorare, sfruttando i dati a nostra disposizione, la definizione di un criterio di classificazione che consenta di distinguere con un ragionevole grado di accuratezza le imprese affidabili da quelle non affidabili, nel caso specifico di imprese la cui documentazione economico/finanziaria a disposizione della banca non sia rappresentata da quella relativa al bilancio di eserczio ma sia contenute nel modello Unico presentato per la dichiarazione dei redditi.
La selezione delle imprese da affidare e il monitoraggio del rischio di credito sono attività che presuppongono due condizioni complementari tra di loro: disponibilità di dati e capacità di trattamento di essi. La prima condizione non implica la seconda.
# Localizzo l'ambiente per assicurarmi
# che i caratteri accentati della classificazione ATECO
# siano correttamente codificati
# Sys.setlocale('LC_ALL', 'it_IT.UTF-8')
library(tidyverse) # carico il pacchetto di utility per l'elaborazione dei dati
dt <- read_csv2("toy_smpl_sp2017.csv", locale = locale(encoding = 'ISO-8859-1'))
# Il file riportato nella riga seguente è quello
# contenente tutti i dati e non solo il campione
# di 200 imprese (si tratta di 728 imprese), può essere
# caricato questo per estendere l'analisi all'intero campione
# il file è disponibile a questo link:
# https://drive.google.com/file/d/1FdeWLNtZK3bUPdmJxgLX93Z-2f1aTXG_/view?usp=sharing
# (dt <- read_csv2("dt_sp2017.csv", locale = locale(encoding = 'ISO-8859-1')))
I dati disponibili e raccolti per questo lavoro – scaricabili da questo link – sono riferiti a quanto disponibile al 31/12/2016 in riferimento allo stato di classificazione interno (Default=si/no
) rilevato al 31/12/2017 e relativi a 200 imprese. I dati sono riferiti ad imprese “monoaffidate” la cui esposizione in Centrale dei Rischi coincide intramente con quella della banca.
ATC_2
);PR
);QDR
, distinto in RF
, RG
e RE
);RCV
) riportati nel modello Unico 2016 nel caso di redditi di imprese in contabilità semplificata o redditi di autonomi nell’esercizio di arti e professioni, per le imprese in contabilità ordinaria il dato sui ricavi proviene dal conto economico;RD
);TP
distinto per SCAD
/APCALQ
rispettivamente a scadenza – finanziamenti o mutui a pagamento rateale – e aperture di credito o crediti autoliquidanti);D
);OF
);SCC
);RT
);VAL
distinto in +
/-
/=
rispettivamente per aumentare, diminuire o non variare);DRCV
);RTRD
);Default
distinto in si/no
), definito come sconfinamento o scaduto da oltre 30 giorni;Durata | Default = si
).In verbatim
sono riportati i nomi delle variabili utilizzati nel lavoro “gemello” a questo contenente anche tutte le elaborazioni, interamente riproducibili, condotte con R
.
I dati reddituali sono estratti dal modello Unico 2016 e sono riferiti ai quadri:
Il quadro RN in particolare contiene i redditi riferiti ai quadri RF, RG ed RE (rispettivamente i righi RF66, RG34 e RE21) ai righi RN1, RN2 e RN3, rispettivamente. La definizione di un criterio di selezione è operata, nel lavoro che segue, distinguendo tra finanziamenti a scadenza – relativi a investimenti in capitale fissso – e finanziamenti autoliquidanti – relativi alla gestione corrente.
Il campione di dati, che fa distinzione tra finanziamenti a scadenza e autoliquidanti, è stato suddiviso in due sottocampioni:
Dal punto di vista metodologico un sistema di rating o di scoring deve essere testato su un insieme di dati diverso da quello su cui è stato allenato. Sempre da un punto di vista metodologico per facilità di utilizzo espositivo, come già accennato, in questo lavoro è stato utilizzato l’algoritmo di classificazione binario di apprendimento supervised FFTrees.
# Modifico il campo default come variabile
# logica definendo una seconda variabile Past_due=TRUE/FALSE
dt_scad <- dt %>% mutate(Past_due = if_else(Default == "No", FALSE, TRUE)) %>%
filter(TP == "SCAD") %>%
select(-ATC_2, -PR, -NPL_p_latent, -NPL, -Default, -Durata, -DRCV)
# (dt_scad <- dt %>% mutate(Past_due = if_else(Default == "No", 0, 1)) %>%
# filter(TP == "SCAD") %>%
# select(-ATC_2, -PR, -NPL_p_latent, -NPL, -Default, -Durata, -DRCV))
# Divido i dati relativi ai campioni di train e di test
dt_scad_train <- dt_scad %>% filter(Set == "Train") %>%
select(-Set)
dt_scad_test <- dt_scad %>% filter(Set == "Test") %>%
select(-Set)
I dati sugli affidamenti a scadenza sono relativi a finanziamenti con ammortamento mensile di tipo francese ed erogati con garanzia ipotecaria. Proviamo a verificare se esistono delle variabili, tra quelle disponibili, che consentano di provedere con un ragionevole grado di accuratezza al 31 dicembre 2016 lo stato di classificazione effettivo al 31 dicembre 2017. L’insieme di apprendimento (train) contiene 50 imprese3 di cui 36 classificate in bonis e 14 in default.
La ricerca del criterio di selezione ottimale presuppone innanzitutto l’individuazione dei previsori utili alla valutazione del merito di credito. Un previsore è un dato, o un indicatore che dir si voglia, capace di fornire degli indizi anticipatori dello stato di malattia dell’impresa. Non necessariamente tutti i dati a disposizione della banca 12 mesi prima contengono informazioni utili e salienti per prevedere lo stato di difficoltà del debitore. Anzi, spesso molte dati di cui dispone la banca finiscono per essere inutili ai fini della valutazione del merito di credito.
Ogni singolo dato a disposizione della banca può servire da previsore anche se molto spesso solo pochi di essi, o solo poche combinazioni di essi, possono essere considerati sufficientemente utili. Considerando i singoli dati a disposizione (codice ATECO, provincia, tipo di reddito, ecc…) è possibile rappresentare le combinazioni di specificità/sensibilità relative ad un criterio di selezione elaborato sul singolo dato attraverso un grafico denominato ROC (receiver operating characteristic, ROC), che rappresenta tutte le combinazioni di sensibilità e specificità (o false allarme) relative ai previsori utilizzati.
Per riprendere quanto già accennato si sottolinea che un criterio di selezione affinché sia accurato deve essere non solo sensibile ma anche specifico: non deve servire solo ad eliminare le imprese malate, ma deve servire anche a tenere quelle sane. Nel grafico che segue sono rappresentate le curve ROC di due indicatori: gli oneri finanziari OF
e i ricavi RCV
. Affinché un previsore sia considerato utile, ai fini previsionali, è necessario che la sua curva ROC spostandosi da destra verso sinistra si scosti verso l’alto rispetto alla diagonale e si avvicini il più possibile nell’angolo in alto a sinistra che corrisponde a livelli di sensibilità e specificità pari entrambi al 100% – tutte le imprese malate e tutte le imprese sane sono state correttamente classificate.
library(pROC)
plot.roc(dt_scad_train$Past_due, dt_scad_train$OF,
main="Curve ROC di OF e RCV",
percent=TRUE, ci=FALSE, of="thresholds",
thresholds="best",
print.thres="best",
add = FALSE, legacy.axes = TRUE)
plot.roc(dt_scad_train$Past_due, dt_scad_train$RCV,
main="Curve ROC di alcuni indicatori",
percent=TRUE, ci=FALSE, of="thresholds",
thresholds="best",
print.thres="best",
add = TRUE, lty = 2,
legacy.axes = TRUE,
grid = TRUE)
legend("bottomright", lty = c(1,2), legend = c("OF", "RCV"))
Come è facile notare OF
non è un utile previsore dal momento che la sua curva ROC non si sposta molto al di sopra della diagonale, almeno rispetto a RCV
che invece raggiunge livelli di specificità e di sensibilità pari a rispettivamente l’83,3% e il 92,9%. Il grafico riportato di seguito contiene le combinazioni di sensibilità (sensitivity) e falso allarme4 (1 - specificity) relative ai singoli previsori che più si avvicinano al livello massimo di accuratezza: l’angolo in alto a sinistra, in corrispondenza di 100% di sensibilità e 0% di false allarme.
# carico il pacchetto FFTrees di Nathaniel Phillips et al.
library(FFTrees)
fft_scad <- FFTrees(Past_due ~ .,
data = dt_scad_train,
data.test = dt_scad_test
)
plot(fft_scad, what = "cues", main = "Indici di accuratezza individuali")
Un previsore è tanto migliore – come si è già visto – quanto il suo grado di accuratezza – rappresentato dalla combinazione di sensibilità/(1 - specificità) – lo colloca nella parte più in alto e a sinistra: idealmente, un previsore che si collochi in corrispondenza dell’angolo in alto a sinistra ha un livello di sensibilità del 100% e un tasso di falso allarme pari a 0 (ossia una specificità del 100%): tutte le imprese che hanno richiesto fido sono state classificate correttamente.
Con i dati del campione di train, gli indici che si collocano nella parte più in alto e a sinistra sono RD
, RTRD
e RCV
, ossia rispettivamente il reddito annuo (riportato nel quadro RN), il rapporto rata annua/reddito e il livello di ricavi (riportati nel quadro rispettivo del modello dell’Agenzia delle Entrate). Per esempio, classificando tutte le imprese con un reddito RD
inferiore a 45,96 (i dati sono in migliaia) abbiamo eliminato tutte le imprese che 12 mesi dopo erano in default (Past_due
da oltre 30 giorni) – l’indice di sensibilità di questo previsore è pari al 100% – e avremmo rifiutato credito solo all’11% delle imprese meritevoli – l’indice di specificità è pari al 89%). Il grado accuratezza della selezione applicando il previsore RD
sarebbe 94% – wacc, weighted accuracy nel grafico.
Questi previsori possono essere combinati tra di loro per creare degli algoritmi di selezione il cui compito è quello di massimizzare l’indice di accuratezza. L’importanza dei tre previsori può essere sintetizzata nel grafico riportato di seguito (è stato ottenuto tramite una simulazione di bootstrap).
scad.fff <- FFForest(Past_due ~.,
data = dt_scad_train,
ntree = 100,
cpus = 4)
plot(scad.fff)
I migliori criteri di selezione delle imprese da affidare per i finanziamenti a scadenza usano principalmente RD
, RTRD
e RCV
. Vale la pena quindi di esplorare meglio le caratteristiche di questi tre previsori distinguendo tra le imprese in bonis (Default = FALSE
) e in default (Default = TRUE
) dunque nei grafici di frequenza riportati di seguito.
dt_scad_train %>% ggplot(aes(RD, color = Past_due)) +
geom_freqpoly(binwidth = 5) +
labs(color = "Default",
y = "Nr. imprese"
)
dt_scad_train %>% ggplot(aes(RTRD, color = Past_due)) +
geom_freqpoly(binwidth = 0.08) +
labs(color = "Default",
y = "Nr. imprese"
)
dt_scad_train %>% ggplot(aes(RCV, color = Past_due)) +
geom_freqpoly(binwidth = 15) +
labs(color = "Default",
y = "Nr. imprese"
)
Si nota che per le imprese in default (Default = TRUE
) i redditi RD
e i ricavi RCV
tendono ad essere inferiori ai 50 mila e ai 100 mila euro rispettivamente; mentre il rapporto rata/reddito RTRD
sembra essere superiore al 40/50% (0,40/0,50 nel grafico al centro, il punto è il separatore decimale anglosassone). Ricorrendo ai grafici “scatola e baffo” è più facile notare le caratteristiche distintive tra imprese classficate come performing (Default = FALSE
) e quelle classificate come non performing (Default = TRUE
).
dt_scad_train %>%
select(RD, RTRD, RCV, Past_due) %>%
gather("Previsore", "Valore", 1:3) %>%
ggplot(aes(Past_due, Valore)) +
geom_boxplot() + facet_wrap(~Previsore, scales = "free") +
labs(x = "Default")
La “scatola” in figura contiene il 50% della distribuzione dei valori riferiti rispettivamente a RCV
, RD
e RTRD
(la parte inferiore e superiore della scatola sono il primo e terzo quartile della distribuzione), i due baffi sopra e sotto rappresentano il massimo e il minimo, la barra al suo centro rappresenta la mediana, infine i punti al di sopra o al di sotto dei baffi sono i c.d. outlier, ossia dati molto distanti dalla media tenendo conto della variabilità del campione. Si nota quindi che le imprese in default tendono ad avere ricavi e redditi significativamente inferiori rispetto a quelle in bonis mentre per i rapporti rata/reddito invece si tratta di valori superiori. Questa osservazione conferma la bontà dell’ipotesi formulata durante l’osservazione degli istogrammi nella figura precedente.
Una breve riflessione sugli indici di sensibilità e specificità è nuovamente importante dal momento che l’algoritmo selezionato deve poter distinguere il peso con cui trattare errori di primo e secondo tipo. Dal momento che sono soprattutto i secondi ad avere un impatto economico nelle scelte di credito potremmo optare per la selezione di un algoritmo che assegni un peso maggiore all’indice di sensibilità, dando quindi più rilevanza al costo derivante dall’erogare credito ad imprese “malate” sperando che siano “sane”. Optando per una maggiore sensibilità nella ricerca del criterio di selezione ottimale procediamo nel modo seguente.
Dopo aver verificato che tra i dati disponibili vi sono alcune variabili con una capacità previsiva almeno apparentemente utile, proviamo ad elaborare un algoritmo tale da condurre la selezione delle imprese. Nella figura che segue è riportato l’output della procedura impiegata nella ricerca della migliore combinazione di previsori che consenta di ottimizzare l’accuratezza della classificazione che si basa su di essa – si noti che i ricavi RCV
non sono stati presi in considerazione dal momento che l’indice di accuratezza massimo (wacc
, in questo caso) con questi dati tiene conto di solo questi due previsori.
fft_scad <- FFTrees(Past_due ~ .,
data = dt_scad_train,
data.test = dt_scad_test,
sens.w = .7,
cost.outcomes = c(0, -1, -2, 1),
goal = "wacc",
goal.chase = "wacc"
)
plot(fft_scad, decision.labels = c("No default", "Si default"),
data = "train",
show.levels = TRUE)
In figura è riportato l’algoritmo di selezione ottimale in termini di accuratezza e rappresentato da un albero decisionale la cui ramificazione verso destra e verso sinistra distingue la classificazione a priori delle imprese rispettivamente in “malate” e “sane”, si default
e no default
in figura. Nella parte superiore della figura è indicata la suddivisione del campione di train tra imprese “sane”, a sinistra no default
, e imprese “malate”, si default
.
Nella parte inferiore, oltre alla tabella di riepilogo contenente il numero di hit, false alarm, miss e core rejection, sono riportate anche alcune statistiche interne circa la velocità di determinazione dell’algoritmo (mcu e pci, non ci interessano) e le statistiche di “bontà” dell’algoritmo: sensibilità (sens
), specificità (spec
) e accuratezza (acc
e wacc
, nel caso in cui siano assegnati dei pesi diversi a sensibilità e specificità le due statistiche differiscono significativamente). Sempre nella parte inferiore, sul lato destro è rappresentato nello spazio ROC il confronto tra l’algoritmo dell’albero decisionale e altri modelli statistici di classificazione (LR
, SVM
, CART
, ecc…).
L’algoritmo prevede la classificazione delle imprese contenute nell’insieme di dati train in base allo schema seguente e rappresentato nella figura di sopra appunto come albero decisionale (FFT #1):
RD
è inferiore a 45,96 classifichiamo l’impresa come “Si default” (S, nel grafico ad albero in corrispondenza del nodo);RTRD
è inferiore o uguale al 39% (0,39 nel grafico) classifichiamo l’impresa come “No default” (N);Seguendo l’algoritmo:
Come già accennato questo algoritmo è derivato da un processo di ottimizzazione che lo ha selezionato scegliendolo sulla base dell’indice di accuratezza (wacc
dal momento che sono stati inseriti dei pesi che assegnano più rilevanza ai cassi missed – i falsi negativi –, pari al 96%, in questo caso) maggiore tra tutti quelli provati sull’insieme di dati train.
È interessante a questo punto testare l’algoritmo appena descritto utilizzando i dati di test che erano stati messi da parte, almeno inizialmente. Questa suddivisione relativa al campione a disposizione è finalizzata a verificare che la bontà del criterio di selezione non dipenda in modo eccessivo dai dati specifici su cui è stato effettuata la fase di apprendimento, train.
plot(fft_scad, decision.labels = c("No default", "Si default"), data = "test")
L’accuratezza del criterio di selezione applicato al campione di dati test peggiora, come era facile attendersi – nonostante alle volte, in modo del tutto casuale può addirittura migliorare. L’indice di accuratezza (sia acc
sia wacc
) scende, soprattutto a causa del numero di miss – 4 in questo caso.
Affinché sia accurato il criterio di selezione è necessario che sia specifico e sensibile alle caratteristiche della “malattia”, non deve perciò escludere troppe imprese “sane” trattandole come se fossero “malate”.
A questo punto il criterio di selezione derivante dall’algoritmo basato sul rapporto rata/reddito e sul reddito dell’impresa assomiglia a quanto riportato nel grafico seguente, dove l’area rossa è quella all’interno della quale il criterio rifiuta l’affidamento dell’impresa mentre nell’area blue l’affidamento viene accettato.
xx <- 45.96
yy <- 0.39
library(modelr)
dt_grid <- data_grid(dt_scad,
RD = seq_range(RD, n = 75),
RTRD = seq_range(RTRD, n = 75)
)
mm <- min(dt_scad$RTRD)
dt_grid <- dt_grid %>%
mutate(Past_due = ifelse(RD < xx, TRUE, ifelse(RTRD > yy, TRUE, FALSE)))
ggplot(dt_scad, aes(RD, RTRD)) +
geom_point(aes(shape = Past_due, color = Past_due)) +
scale_color_manual(values = c("blue", "red")) +
geom_hline(yintercept = yy, linetype = "dashed") +
geom_vline(xintercept = xx, linetype = "dashed") +
facet_wrap(~Set) +
labs(color = "Default", shape = "Default") +
geom_point(data = dt_grid, aes(color = Past_due), alpha = 1/5, size = 0.125) +
coord_cartesian(ylim = c(mm, 1.25))
prob <- predict(fft_scad, data = dt_grid, type = "prob")
dt_grid$prob <- prob[ ,2]
# preparo questo grafico per usarlo dopo
pd_pl <- ggplot(data = dt_grid, aes(RD, RTRD, color = prob)) +
geom_point(size = 1/3) +
scale_colour_gradient2(trans = "reverse") +
geom_hline(yintercept = yy, linetype = "dashed") +
geom_vline(xintercept = xx, linetype = "dashed") +
coord_cartesian(ylim = c(mm, 1.25)) + labs(color = "PD")
lgd <- 0.126
L’idea di rifiutare le imprese nella zona “rossa” e di accettare le richieste di fido provenienti da quelle appartenenti alla zona “blue”, come è già chiaro implicitamente comporta degli errori il cui costo per la banca è relativo a:
cost_cred <- function(fft){
cost <- tibble(
g_cost = fft$cost$test$outcomes[,1],
d = dt_scad_test$D,
of = dt_scad_test$OF,
cost = if_else(g_cost == 0, 0,
if_else(g_cost == 1, 0,
if_else(g_cost == -1, -of, - d * lgd )
)
)
)
cost
}
cost <- cost_cred(fft_scad)
cost_alg <- sum(cost$cost)
Una stima del costo economico e finanziario causata dagli errori di primo e secondo tipo può essere ottenuta tramite il dato relativo all’indebitamento complessivo che risulta alla banca dalla Centrale dei Rischi (D
) e disponibile tra i dati del campione. La stima del costo sopportato dalla banca per gli errori commessi utilizzando il criterio selezionato è pari a -125,3 mila euro.
Può essere altrettanto interessante confrontare il criterio di selezione basato sui dati derivanti dalla documentazione fiscale con il criterio implicito basato sulla valutazione espressa nel giudizio dell’area credito VAL
abbinandola al saldo di conto corrente SCC
considerato “utili” previsori rilevanti dall’analisi andamentale interna – se l’impresa ha disponibilità liquide la probabilità di inadempienza è più bassa, da una lettura dello stereotipo con cui viene utilizzato.
Di seguito l’albero FFT in riferimento al solo insieme di test e relativo al criterio di selezione basato su:
VAL
è negativo (-
, ridurre il fido accordato) allora Default = Si
– ossia impresa non affidabile;VAL
è +
– aumentare il fido accordato – ovvero =
non aumentare il fido accordato):
SCC
(al 31/12/2016) è inferiore a 10 mila euro allora Default = Si
;Default = No
, ossia impresa affidabile.fft_val <- FFTrees(Past_due ~ VAL + SCC,
data = dt_scad_train,
data.test = dt_scad_test,
my.tree = "If VAL = {-}, predict True. If SCC < 10, predict True. Otherwise, predict False",
cost.outcomes = c(0, -1, -2, 1)
)
plot(fft_val, decision.labels = c("No default", "Si default"), data = "test")
La maggior parte delle imprese appartenenti al campione di test è classificata nella parte a destra come imprese “malate”. È interessante osservare che l’indice di sensibilità del criterio di selezione relativo alla valutazione espressa dall’area credito unito alla disponibilità di conto rilevata al momento corrente (12 mesi prima, ossia al 31/12/2016) è pari al 100%: è dunque un criterio altamente selettivo in termini di credito accordato – vengono espressi prevalentemente giudizi negativi, di riduzione del credito utilizzato/accordato, nel grafico a barre che segue – e di conseguenza tende ad essere scarsamente specifico dal momento che l’indice di specificità pari solamente al 6%.
dt_scad_test %>% ggplot(aes(VAL)) + geom_bar()
Le imprese a cui viene accordato credito, in base a questo criterio di selezione, sarebbero molte di meno in altre parole. Applicando le stesse stime di costo relative ai falsi positivi e ai falsi negativi – false alarm e miss, rispettivamente – i costi relativi agli errori commessi rispettivamente dall’algoritmo cost_alg
e dalla valutazione espressa dall’area crediti cost_val
possono essere riportati di seguito nel grafico a barre:
cost_val <- cost_cred(fft_val)
cost_err_val <- sum(cost_val$cost)
cc <- tibble(
N = 1:nrow(dt_scad_test),
cost_alg = cost$cost,
cost_val = cost_val$cost
)
cc %>% gather("Criterio", "Costo", 2:3) %>%
ggplot(aes(N, y = Costo, fill = Criterio)) + geom_bar(stat='identity', position='dodge') +
labs(y = "costo degli errori di I e II tipo")
Il costo complessivo stimato, relativo agli errori di affidamento derivante dall’applicazione del giudizio VAL
dell’area crediti, è pari a -96,2. Il costo dell’errata concessione (miss, o falso negativo per come sono stati definiti) sembra essere molto elevato, al punto tale da fare ritenere di poter erodere completamente i margini relativi alle operazioni di erogazione profittevoli. In particolare il criterio di selezione implicito nelle valutazione dell’area crediti (VAL
, ancora) sembra essere dominante. È stato appena osservato che il costo relativo all’errato affidamento da parte della banca nei confronti di imprese non affidabili tende ad avere un impatto dominante rispetto al costo del rifiuto dell’affidamento nei confronti di imprese meritevoli. Come dire, ci si è concentrati sui costi dell’errata capacità di selezione delle banca senza considerare però i ricavi derivanti dalla corretta classificazione.
Completando il confronto tra l’algoritmo basato sui dati di provenienza fiscale (Alg
) con quello implicito nel giudizio dell’area crediti (Val
) e tenendo conto delle erogazioni di credito profittevoli (Core rejection
) considerando che, così come i falsi allarmi (False alarm
) hanno un costo pari ai mancati oneri finanziari, esse producono ricavi pari agli oneri finanziari (OF
) addebitati dalla banca.
cost_inc <- function(fft){
c_i <- tibble(
g_cost = fft$cost$test$outcomes[,1],
d = dt_scad_test$D,
of = dt_scad_test$OF,
c_i = if_else(g_cost == 0, 0,
if_else(g_cost == 1, of,
if_else(g_cost == -1, -of, - d * lgd )
)
)
)
c_i
}
ci_alg <- cost_inc(fft_scad)
ci_val <- cost_inc(fft_val)
ci <- tibble(
N = 1:nrow(dt_scad_test),
ci_alg = ci_alg$c_i,
ci_val = ci_val$c_i
)
Il grafico di seguito riporta il confronto tra i conti economici (“ricavi/costi”) dell’algoritmo e della valuazione dell’area credito che complessivamente comportano un totale tra ricavi generavi generati dall’attività di credito e costi sopportati dalle perdite o dai mancati guadagni (indicati come ci_alg
e ci_val
nel grafico) pari a rispetivamente -55,98 e -89,94.
ci %>% gather("Criterio", "CostIncome", 2:3) %>%
ggplot(aes(N, y = CostIncome, fill = Criterio)) +
geom_bar(stat='identity', position='dodge') +
labs(y = "ricavi/costi (mgl euro)")
Rivedendo i due criteri a confronto mettendo nella tabella di confusion le classificazioni previste e quelle effettive si nota meglio la differenza di orientamento dei due. Per prima cosa, l’algoritmo basato sui dati di dichiarazione dei redditi.
table(fft_scad$decision$test[ , 1],
dt_scad_test$Past_due)
##
## FALSE TRUE
## FALSE 22 4
## TRUE 10 14
E poi quella riferita alla valutazione dell’area crediti.
table(fft_val$decision$test[ , 1],
dt_scad_test$Past_due)
##
## FALSE TRUE
## FALSE 2 0
## TRUE 30 18
La seconda è presente quasi esclusivamente nel classificare come probabili default le imprese da selezionare.
In questo caso, quello degli affidamenti a scadenza, il fenomeno del credito anomalo (default, per come è stato definito dall’inizio) è piuttosto elevato, distinguendo ancora i due campioni di train e di test il numero di default è riportato nel grafico seguente. È abbastanza facile, ora dopo aver compiuto questa analisi esplorativa, con i dati a nostra disposizione che un atteggiamento estremamente restrittivo nella politica dei crediti sia apparentemente premiante, ossia in grado di contenere le perdite che la banca sopporta, anche se la perdita derivante dai mancati ricavi delle transazioni rifiutate nel timore di sopportare la perdita economica più che compensi il beneficio. Il giudizio dalla banca pur essendo altamente sensibile rischia di essere scarsamente specifico: il costo della rinuncia al credito è molto maggiore della eliminazione tout-court delle perdite su crediti.
dt_scad %>% ggplot(aes(Past_due)) +
facet_wrap(~Set) +
geom_bar() +
labs(x = "Default",
y = "Numero")
Proviamo ora a condurre un’analisi simile a quella portata avanti con gli affidamenti a scadenza, con quelli autoliquidanti e in conto corrente. Si tratta di forme tecniche concettualmente diverse, rivolte a soddisfare fabbisogni finanziari di natura differente. Si tratta infatti di fabbisogni di breve termine, seppur ricorrenti, generati dalla gestione corrente e che tendono a rientrare nell’arco di pochi giorni, tutt’al più mesi.
dt_apcalq <- dt %>% mutate(Past_due = if_else(Default == "No", FALSE, TRUE)) %>%
filter(TP == "APCALQ") %>%
select(-ATC_2, -PR, -NPL_p_latent, -NPL, -Default, -Durata, -RTRD, -RT)
dt_apcalq_train <- dt_apcalq %>% filter(Set == "Train") %>%
select(-Set)
dt_apcalq_test <- dt_apcalq %>% filter(Set == "Test") %>%
select(-Set)
Se nel caso dei finanziamenti a scadenza si tratta di fabbisogni di medio e lungo termine che rientrano con in margini, e di conseguenza vogliamo verificare la capacità di rimborso della rata ricorrente nel tempo, nel caso dei finanziamenti autoliquidanti e in conto la capacità di rimborsi è da ricercarsi negli incassi potenziali. Con questa premessa ripetiamo l’applicazione, sulla base dei dati a disposizione dopo aver distinto due campioni di train e di test, della procedura FFT per individuare gli indicatori previsionali utili. Dal grafico sottostante risulta che i singoli previsori utili nella selezione al credito sono DRCV
, RCV
e RD
.
library(FFTrees)
fft_apcalq <- FFTrees(Past_due ~ .,
data = dt_apcalq_train,
data.test = dt_apcalq_test
)
plot(fft_apcalq, what = "cues", main = "Indici di accuratezza individuali")
Come si è proceduto per gli affidamenti a scadenza verifichiamo l’importanza dei singoli previsori negli algoritmi di selezione FFT che impieghino le loro combinazioni.
apcalq.fff <- FFForest(Past_due ~.,
data = dt_apcalq_train,
ntree = 100,
cpus = 4)
plot(apcalq.fff)
È evidente che i tre indicatori presi individualmente conservano la loro importanza anche negli algortimi di selezione complessi, che ne fanno cioè uso combinato – DRCV
, RCV
e RD
sono presenti rispettivamente nella maggioranza, se non la totalità, dei modelli simulati dalla procedura.
dt_apcalq_train %>% ggplot(aes(DRCV, color = Past_due)) +
geom_freqpoly(binwidth = 0.10) +
labs(color = "Default",
y = "Nr. imprese"
)
dt_apcalq_train %>% ggplot(aes(RCV, color = Past_due)) +
geom_freqpoly(binwidth = 40) +
labs(color = "Default",
y = "Nr. imprese"
)
dt_apcalq_train %>% ggplot(aes(RD, color = Past_due)) +
geom_freqpoly(binwidth = 15) +
labs(color = "Default",
y = "Nr. imprese"
)
dt_apcalq_train %>%
select(DRCV, RCV, RD, Past_due) %>%
gather("Previsore", "Valore", 1:3) %>%
ggplot(aes(Past_due, Valore)) +
geom_boxplot() + facet_wrap(~Previsore, scales = "free") +
labs(x = "Default")
Il processo di ottimizzazione – sempre assegnando un maggior peso alla sensibilità per lo stesso motivo del caso degli affidamenti a scadenza – selezionando il criterio decisionale con indice di accuratezza ponderato migliore produce il grafico riportato di seguito.
fft_apcalq <- FFTrees(Past_due ~ .,
data = dt_apcalq_train,
data.test = dt_apcalq_test,
sens.w = .7,
cost.outcomes = c(0, -1, -2, 1),
goal = "wacc",
goal.chase = "wacc"
)
plot(fft_apcalq, decision.labels = c("No default", "Si default"), data = "train")
È evidente che, sulla base dei dati nel campione di training, il previsore RD
non sia rilevante ai fini della classificazione; il criterio di classificazione è dunque basato sul seguente algoritmo:
DRCV
è inferiore al 69% (0,69 nel grafico) allora impresa affidabile, No default
;No default
);Si default
).Proviamo a questo punto ad applicare, come nel caso degli affidamenti a scadenza, l’algoritmo all’insieme di test e valutiamo la sua performance.
plot(fft_apcalq, decision.labels = c("No default", "Si default"), data = "test")
L’indice di sensibilità rimane al 100% (nessun miss
, o FN) mentre l’indice di specificità scende al 48% (false alarm
sale al 52%, quindi). Proseguiamo con il confronto con il giudizio implicito nella valutazione dell’area crediti con lo stesso criterio di prima e verichiamo la sua performance nel caso degli affidamenti autoliquidanti e in conto.
fft_val_apcalq <- FFTrees(Past_due ~ VAL + SCC,
data = dt_apcalq_train,
data.test = dt_apcalq_test,
my.tree = "If VAL = {-}, predict True. If SCC < 10, predict True. Otherwise, predict False",
cost.outcomes = c(0, -1, -2, 1)
)
plot(fft_val_apcalq, decision.labels = c("No default", "Si default"), data = "test")
È evidente che la bontà del criterio implicito nel giudizio dell’area crediti abbinata all’euristica consistente disponibilità di conto, almento in questo caso, appaia in inferiorità significativa. Proviamo dunque a tenere conto dei costi derivanti dagli errori di classificazione e poi stimiamo anche l’impato dei ricavi derivanti dalle scelte corrette di erogazione come fatto prima nel caso delle esposizioni a scadenza.
cost_cred_ap <- function(fft){
cost <- tibble(
g_cost = fft$cost$test$outcomes[,1],
d = dt_apcalq_test$D,
of = dt_apcalq_test$OF,
cost = if_else(g_cost == 0, 0,
if_else(g_cost == 1, 0,
if_else(g_cost == -1, -of, - d * lgd )
)
)
)
cost
}
cost_apcalq <- cost_cred_ap(fft_apcalq)
cost_alg <- sum(cost_apcalq$cost)
cost_val_apcalq <- cost_cred_ap(fft_val_apcalq)
cost_err_val_apcalq <- sum(cost_val_apcalq$cost)
cc <- tibble(
N = 1:nrow(dt_apcalq_test),
cost_alg = cost_apcalq$cost,
cost_val = cost_val_apcalq$cost
)
cc %>% gather("Criterio", "Costo", 2:3) %>%
ggplot(aes(N, y = Costo, fill = Criterio)) + geom_bar(stat='identity', position='dodge') +
labs(y = "costo degli errori di I e II tipo (mgl. euro)")
cost_inc_aq <- function(fft){
c_i <- tibble(
g_cost = fft$cost$test$outcomes[,1],
d = dt_apcalq_test$D,
of = dt_apcalq_test$OF,
c_i = if_else(g_cost == 0, 0,
if_else(g_cost == 1, of,
if_else(g_cost == -1, -of, - d * lgd )
)
)
)
c_i
}
ci_alg <- cost_inc_aq(fft_apcalq)
ci_val <- cost_inc_aq(fft_val_apcalq)
ci <- tibble(
N = 1:nrow(dt_apcalq_test),
ci_alg = ci_alg$c_i,
ci_val = ci_val$c_i
)
Il grafico di seguito riporta il confronto tra i conti economici (“ricavi/costi”) dell’algoritmo e della valuazione dell’area credito che complessivamente comportano un totale tra ricavi generati dall’attività di credito e costi sopportati dalle perdite o dai mancati guadagni (indicati come ci_alg
e ci_val
nel grafico) pari a rispetivamente -7,25 e -163.
ci %>% gather("Criterio", "CostIncome", 2:3) %>%
ggplot(aes(N, y = CostIncome, fill = Criterio)) +
geom_bar(stat='identity', position='dodge') +
labs(y = "ricavi/costi (mgl. euro)")
Abbiamo visto dunque che sulla base dei dati del modello Unico è possibile classificare le imprese, nell’ambito della selezione al credito, in modo “dignitosamente” accurato (sempre ricorrendo alla definizione, per così dire tecnica, di accuratezza), e lo abbiamo fatto sfruttando gli alberi decisionali fast-and-frugal che ci hanno consentito di fare affidamento su un criterio di selezione facilmente impiegabile nella prassi.
Gli alberi FFT creano una ripartizione molto chiara e categorica che, come si è detto, si presta molto bene in un contesto operativo in cui non si dispone di un sistema informativo in grado di automatizzare la classificazione. Per le banche che dispongono di un sistema di rating, indipendentemente che sia o meno validato ai fini del calcolo dei requisiti patrimoniali, la classificazione è basata sull’attribuzione di una classe di merito di credito a cui è associata una probabilità di insolvenza o inadempimento (probabilità di default, PD).
Nel grafico riportato di seguito la PD, implicita nella classificazione operata sulla base del modello FFT basato su RD
e RTRD
, è rappresentata usando la tripartizione dell’albero decisionale utilizzando le sfumature di rosso per graduarla in una scala che va da 0 a 100% (1 nel grafico). Come si vede l’area in cui l’impresa viene selezionata come “sana” è quella in basso a destra associata ad una PD inferiore al 25% (0,25, nel grafico).
pd_pl +
geom_point(data = dt_scad_test,
aes(RD, RTRD,
color = Past_due,
shape = Past_due))
I sistemi di rating impiegati dalle banche sono basati su metodi diversi rispetto agli alberi fast-and-frugal, di seguito è riportato il grafico derivante dall’impiego del modello di regressione logistica.
lgt.fit <- glm(Past_due ~ RD + RTRD,
data = dt_scad_train,
family = 'binomial')
lgt.probs <- predict(lgt.fit,
newdata = dt_grid,
type = 'response')
dt_grid$PD <- lgt.probs
pdo <- log(0.25)
b_0 <- coef(lgt.fit)[1]
b_1 <- coef(lgt.fit)[2]
b_2 <- coef(lgt.fit)[3]
ggplot(data = dt_grid, aes(RD, RTRD)) +
geom_point(aes(color = PD), size = 1/3) +
scale_colour_gradient2(trans = "reverse") +
coord_cartesian(ylim = c(mm, 1.25)) +
labs(color = "PD") +
geom_point(data = dt_scad_test,
aes(RD, RTRD, color = Past_due,
shape = Past_due)) +
geom_abline(slope = -(b_1/b_2),
intercept = (pdo/b_2 - b_0/b_2),
linetype = "dashed")
La linea tratteggiata rappresenta la soglia oltre la quale, partendo dal basso verso destra e salendo verso sinistra, si supera un rischio di inadempimento o default (misurato dalla probabilità di default) del 25% – scelto in modo tale che sia confrontabile con le PD stimate utilizzando gli alberi FFT.
Il giudizio dalla banca pur essendo altamente sensibile rischia di essere scarsamente specifico: il costo della rinuncia al credito può essere molto maggiore della eliminazione tout-court delle perdite su crediti.
Si tratta dei modelli di regressione logistica, di analisi discriminante lineare e quadratica e del metodo dei k vicini più prossimi (KNN), ad esempio.↩
Gli alberi fast-and-frugal e la procedura di ricerca sono descritti in Nathaniel D. Phillips, Hansjörg Neth, Jan K. Woike e Wolfgang Gaissmaier, FFTrees: A toolbox to create, visualize, and evaluate fast-and-frugal decision trees, Judgment and Decision Making, Vol. 12, No. 4, July 2017, pp. 344–368↩
La dimensione del campione è volutamente tenuta nell’intorno di un livello che consenta la consultazione dei dati ai partecipanti al workshop a cui vengono forniti i tabulati in modo tale da poter mantenere un contesto per così dire “gestibile” su alcuni fogli da poter distribuire in aula.↩
Il tasso di falso allarme è pari al complemento a 100 dell’indice di specificità e corrisponde alla percentuale di imprese meritevoli che è stata esclusa dalla selezione al credito da parte della banca.↩
Hit è riferito alle imprese in default correttamente identificate 12 mesi prima. Correct rejection è riferito allo stato di default, per cui la decisione comporta la corretta esclusione dell’ipotesi di default (per questo appunto correct rejection). Miss è riferito ancora allo stato di default, si tratta di quei casi in cui si manca di identificare correttamente l’impresa in default 12 mesi dopo. False alarm sono quelle imprese per le quali si teme il default ma che 12 mesi dopo sono ancora in bonis.↩
In base a quanto previsto dalla regolamentazione citata (Basilea 3) la LGD per le banche che impiegano l’approccio standard nel calcolo dei requisiti patrimoniali è pari al 35% dell esposizione, quando si tratta di esposizioni interamente garantite da garanzia ipotecaria di primo grado, in questo caso la banca in questione dispone di stime interne circa il tasso di perdita in caso di default (LGD), dove nello specifico per default intende un ritardo pari a o superiore a 30 giorni.↩