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.