A fictional property-management lender, from a SQL warehouse to a lifetime loss reserve that is defended to an external reviewer.
How much a resident lending book will lose over its life, how each loan is graded, and whether the answer holds up in front of an external validator.
A loss reserve sits on the financial statements, so the models behind it are tested by auditors and examiners, not only by data scientists. A boosted model that ranks well is not enough: it has to behave like credit policy, give exact reasons, stay calibrated on loans it never saw, and be reproducible to the cent.
Ship the boosted model only with monotone constraints and a standing logistic challenger, and fix the out-of-time miss with an overlay fitted on development data, not on the test.
| 1 | Gradient boosting at 0.848 out-of-time AUC against 0.836 for the benchmark, with every monotone constraint holding and TreeSHAP reason codes. |
| 2 | A probability-weighted lifetime reserve with baseline, adverse and severe scenarios and a sensitivity on every input an auditor will ask about. |
| 3 | Calibration failure found out of time (Hosmer–Lemeshow p = 0.016) and remediated without touching the test vintage: p = 0.053, all seven grades green. |
Results come from synthetic data with known answers. They show the method, not a client result.

- Synthetic only: 19,200 loans, monthly performance and a synthetic unemployment series generated with known relationships. Calder Lane is fictional.
- It runs on synthetic data and books no real reserve, so adoption is not measured here.
PythonSQL (SQLite)XGBoostscikit-learnSciPypytestPlotlyStreamlit








