Skip to content

TayoOwolabi/Basel-Style-Credit-Risk-Analytics-Framework-PD-Modeling-Portfolio-Expected-Loss-Risk-Governance

Repository files navigation

(1) Summary

Financial institutions must continuously evaluate borrower risk while maintaining portfolio stability and regulatory compliance.

This project builds a credit risk decision framework that:

• Estimates borrower Probability of Default (PD) • Applies credit policy thresholds for lending decisions • Simulates portfolio expected losses • Evaluates risk exposure under varying economic conditions

The model demonstrates how predictive analytics and financial modeling can support risk-aware lending strategies, portfolio monitoring, and capital planning.

(2) Business Problem

Banks and lending institutions face a core challenge:

How can credit decisions be optimized while controlling portfolio risk and expected losses?

Traditional credit approval methods often rely on static borrower metrics that may not fully capture changing risk conditions.

Key challenges include:

• Identifying high-risk borrowers before loan approval • Estimating expected credit losses across a loan portfolio • Aligning lending policies with institutional risk appetite • Monitoring portfolio risk exposure under economic stress scenarios

This project addresses these challenges by developing a data-driven credit risk modeling framework.

(3) Data & Methodology

The modeling approach follows standard credit risk analytics methodology.

Data Inputs

Borrower features used in the model include:

• income • debt-to-income ratio • credit history indicators • loan amount • repayment history

Modeling Techniques

The framework uses:

• Weight of Evidence (WoE) feature transformation • Logistic regression for PD estimation • Portfolio expected loss simulation • Risk segmentation and borrower classification

These techniques reflect methodologies commonly used in retail credit risk modeling and Basel internal rating systems.

(4) Financial Model

The credit risk model estimates the Probability of Default (PD) for each borrower.

The expected loss framework follows standard financial risk modeling principles.

Expected Loss (EL) = PD X LGD X EAD

Where:

PD = Probability of Default LGD = Loss Given Default EAD = Exposure at Default

The model calculates expected losses across the loan portfolio, enabling financial institutions to evaluate potential risk exposure.

(5) Risk Analysis

Borrowers are segmented based on their predicted risk levels.

Risk categories may include:

Risk Category PD Range
Low Risk PD < 2%
Moderate Risk 2% – 5%
Elevated Risk 5% – 10%
High Risk >10%

Risk segmentation allows lenders to:

  • identify vulnerable borrowers
  • adjust pricing strategies
  • control portfolio concentration risk

(6) Governance Framework

Risk models require structured governance to ensure reliability and regulatory compliance.

Model Purpose

This model supports:

• credit approval decisions • portfolio risk monitoring • capital risk evaluation

Model Validation

Validation techniques include:

• ROC-AUC model performance evaluation • out-of-sample testing • population stability monitoring

Model Monitoring

Ongoing monitoring ensures model reliability through • PD calibration tracking • portfolio default rate monitoring • model drift analysis

These governance practices align with Basel model risk management principles.

(8) Key Insights

The analysis highlights several portfolio risk insights.

High borrower leverage and weak repayment history significantly increase default risk.

Portfolio simulations indicate that small increases in macroeconomic stress factors can substantially increase expected losses, emphasizing the importance of proactive risk monitoring.

Risk segmentation enables lenders to adjust credit policies and optimize portfolio risk-return balance.


Repo Structure

credit-risk-pd-scorecard-woe/
├── data/
│   └── Bank_Loan_Approval_copy.csv
├── notebooks/
│   └── Credit_Risk_Benchmark_Validated.ipynb
├── src/
│   └── irb_scorecard/
│       ├── __init__.py
│       ├── io.py
│       ├── pd_proxy.py
│       ├── scorecard_woe.py
│       ├── governance.py
│       ├── policy.py
│       ├── portfolio.py
│       └── reason_codes.py
├── scripts/
│   ├── train_pd_proxy.py
│   ├── train_scorecard.py
│   ├── score_dataset.py
│   ├── run_governance.py
│   └── make_report.py
├── artifacts/               # generated
├── outputs/                 # generated
├── requirements.txt
├── pyproject.toml
├── LICENSE
└── .gitignore

Quickstart

1) Install

python -m venv .venv
# Windows: .venv\Scripts\activate
source .venv/bin/activate

pip install -r requirements.txt

2) Train the IRB-style PD proxy model (calibrated)

python scripts/train_pd_proxy.py --infile data/Bank_Loan_Approval_copy.csv --outdir artifacts

3) Train the traditional WoE scorecard + PDO score scaling (300–850)

python scripts/train_scorecard.py --infile data/Bank_Loan_Approval_copy.csv --outdir artifacts

4) Score a dataset (adds prob_def + approvals + score bands + pricing + reason codes)

python scripts/score_dataset.py --infile data/Bank_Loan_Approval_copy.csv --outdir artifacts

5) Run governance checks (PSI, backtesting, challenger, cutoff sensitivity)

python scripts/run_governance.py --infile data/Bank_Loan_Approval_copy.csv --artifacts artifacts --outdir outputs

6) Generate a Markdown report

python scripts/make_report.py --outputs outputs --artifacts artifacts --out outputs/REPORT.md

Key Outputs (generated)

  • artifacts/pd_proxy_model_calibrated.joblib
  • artifacts/scorecard_model_woe.joblib
  • artifacts/scored_pd_proxy.csv
  • artifacts/scored_scorecard.csv
  • artifacts/scorecard_points_table.csv
  • artifacts/portfolio_summary.json
  • outputs/governance_summary.json
  • outputs/backtesting_deciles.csv
  • outputs/cutoff_sensitivity.csv

License

MIT License — see LICENSE.