Financial Calculations & Valuation
Intermediate
Automated Bank Loan NPA Classification & Provisioning Calculator (IRAC Norms) in Python
Classify loan book CSVs into Standard, Sub-Standard, Doubtful (D1/D2/D3), and Loss Assets based on Days Past Due (DPD) and compute provisioning in Python.
#pandas#numpy
Problem Statement
Credit risk teams and banking auditors need to classify thousands of loan accounts by Days Past Due (DPD) and security realization value to compute statutory NPA provisioning.
Formula / Core Logic
DPD <= 90: Standard (0.40%)
Sub-Standard (<12m NPA): 15% Secured
Doubtful D1/D2/D3: 25% / 40% / 100% Secured + 100% Unsecured
Installation
pip install pandas numpy
npa-provisioning-calculator-irac-norms-python.py
import pandas as pd
import numpy as np
def compute_npa_provisions(df):
# Expected cols: Account_ID, Outstanding, Security_Value, DPD_Days
df = df.copy()
secured = np.minimum(df['Outstanding'], df['Security_Value'])
unsecured = np.maximum(0.0, df['Outstanding'] - df['Security_Value'])
conds = [
df['DPD_Days'] <= 90,
df['DPD_Days'] <= 455, # Sub-standard (up to 1 yr from NPA date)
df['DPD_Days'] <= 820, # Doubtful D1
df['DPD_Days'] <= 1550 # Doubtful D2
]
classes = ['Standard', 'Sub-Standard', 'Doubtful-1', 'Doubtful-2']
df['Asset_Class'] = np.select(conds, classes, default='Doubtful-3 / Loss')
prov = np.select(conds, [
df['Outstanding'] * 0.004,
(secured * 0.15) + (unsecured * 0.25),
(secured * 0.25) + (unsecured * 1.00),
(secured * 0.40) + (unsecured * 1.00)
], default=df['Outstanding'] * 1.00)
df['Required_Provision'] = np.round(prov, 2)
return df
Get the Complete 100+ Python Quant & Automation Bundle
Instant lifetime access to all production-ready scripts, valuation models, and trading bots ($19).
Buy Full Bundle on Gumroad ($19) →Frequently Asked Questions
Q: Can SMA-0, SMA-1, and SMA-2 buckets be added before 90 DPD?
Yes! Split the `DPD_Days <= 90` condition into 1–30 days (SMA-0), 31–60 days (SMA-1), and 61–90 days (SMA-2) for early stress alerts.