Microfinance PAR30: portfolio at risk by branch and loan cycle
In this article (8 sections)
Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).
PAR30 (portfolio at risk over 30 days) is the principal outstanding of all loans with any instalment more than 30 days overdue, divided by the gross principal outstanding of the active book. It measures how much of the portfolio is exposed to borrowers already in trouble, not how much money has been missed. In the synthetic book below, PAR30 is about 23% while missed instalments are only 4–6% of the book, and that gap is the reason the metric exists.
Why an operations head and a credit head need different numbers
A microfinance branch manager in western Uttar Pradesh thinks in collections: how many rupees were due at this week's centre meetings and how many came in. The credit head thinks in exposure: if these borrowers stop paying, how much principal is gone? PAR30 answers the second question. A group-loan portfolio can collect 97% of what falls due each week and still have a large share of its principal sitting with borrowers who have been skipping meetings for a month.
So the business question for this analysis is narrow: which branches and which loan cycles are carrying the most principal with borrowers who are more than 30 days behind, and is that concentrated or spread across the book?
The two extracts you need
| Source | Columns | Watch for |
|---|---|---|
| Loan master (as-of snapshot) | loan_id, branch, centre_id, loan_cycle, disbursed_on, principal_outstanding, status | Status values such as active, closed, written_off, restructured |
| Repayment schedule and receipts | loan_id, instalment_no, due_date, amount_due, amount_paid, paid_on | Needed to compute DPD yourself if the core system's figure is unreliable |
DPD (days past due) for a loan is the age, on the snapshot date, of its oldest instalment that has not been fully paid. If the system gives you a dpd column, test it against the schedule for a sample of loans before trusting it; partial payments are where systems differ.
The formula, written precisely
- PAR30 = Σ principal_outstanding of active loans with DPD > 30 ÷ Σ principal_outstanding of all active loans
- Arrears ratio = Σ overdue amount ÷ Σ principal_outstanding of active loans
Decide in writing whether the threshold is "more than 30" or "30 or more" and keep it fixed. The code uses a parameter so the choice is visible.
Worked example: twelve loans, two branches
All figures are synthetic and hypothetical.
import pandas as pd
# Synthetic loan book snapshot as on 31-Aug-2026 (hypothetical figures)
loans = pd.DataFrame({
"loan_id": [f"L{i:02d}" for i in range(1, 13)],
"branch": ["Hapur"] * 6 + ["Bulandshahr"] * 6,
"loan_cycle":[1, 1, 2, 2, 3, 1, 1, 2, 2, 3, 3, 1],
"principal_outstanding": [18000, 22000, 30000, 12000, 40000, 25000,
20000, 28000, 35000, 45000, 15000, 24000],
"overdue_amount": [0, 2400, 0, 3600, 0, 0, 1800, 0, 7000, 0, 4500, 0],
"dpd": [0, 45, 0, 95, 0, 0, 12, 0, 62, 0, 200, 0],
"status": ["active"] * 10 + ["written_off", "active"],
})
PAR_DAYS = 30 # PAR30 counts loans with DPD strictly greater than this
book = loans[loans["status"] == "active"].copy()
book["at_risk"] = book["dpd"] > PAR_DAYS
def summarise(g):
return pd.Series({
"gross_outstanding": g["principal_outstanding"].sum(),
"par30_outstanding": g.loc[g["at_risk"], "principal_outstanding"].sum(),
"overdue_amount": g["overdue_amount"].sum(),
})
cols = ["principal_outstanding", "overdue_amount", "at_risk"]
by_branch = book.groupby("branch")[cols].apply(summarise)
by_branch["par30_pct"] = (100 * by_branch["par30_outstanding"] / by_branch["gross_outstanding"]).round(1)
by_branch["arrears_pct"] = (100 * by_branch["overdue_amount"] / by_branch["gross_outstanding"]).round(1)
print(by_branch.to_string())
by_cycle = book.groupby("loan_cycle")[cols].apply(summarise)
by_cycle["par30_pct"] = (100 * by_cycle["par30_outstanding"] / by_cycle["gross_outstanding"]).round(1)
print(by_cycle[["gross_outstanding", "par30_outstanding", "par30_pct"]].to_string())
# What happens if the written-off loan is wrongly left in the book
wrong = loans.copy()
wrong_par = 100 * wrong.loc[wrong["dpd"] > PAR_DAYS, "principal_outstanding"].sum() / wrong["principal_outstanding"].sum()
print("PAR30 with write-off left in:", round(wrong_par, 1))Output:
gross_outstanding par30_outstanding overdue_amount par30_pct arrears_pct
branch
Bulandshahr 152000 35000 8800 23.0 5.8
Hapur 147000 34000 6000 23.1 4.1
gross_outstanding par30_outstanding par30_pct
loan_cycle
1 109000 22000 20.2
2 105000 47000 44.8
3 85000 0 0.0
PAR30 with write-off left in: 26.8What the three tables say
The branches look identical on PAR30 (23.0% and 23.1%) yet differ on arrears (5.8% versus 4.1%). Bulandshahr's at-risk principal sits in one loan (L09, ₹35,000 at 62 DPD), while Hapur's is spread across two borrowers. One large loan and two small ones are different recovery problems, even at the same percentage.
The loan-cycle view is sharper: second-cycle loans carry 44.8% PAR30, while third-cycle loans show none. In a real book, that pattern would prompt a look at how second-cycle loan sizes were stepped up, which is a policy question, not a field-staff question.
The last line is the most common reporting error. Leaving the written-off loan (L11, ₹15,000 at 200 DPD) in both numerator and denominator lifts PAR30 from 23.1% to 26.8%. The opposite mistake, writing loans off to shrink PAR30 without reporting the write-offs, is worse, because it makes the metric look better precisely when losses are being crystallised.
Traps specific to group lending
- 1Written-off and closed loans. Exclude them from the active book, and report write-offs for the period as a separate line so a falling PAR30 can be checked against them.
- 2Restructured or rescheduled loans. A rescheduled loan's DPD often resets to zero. Tag these and show PAR30 with and without them, or the first month after a rescheduling drive will look like a recovery.
- 3Joint liability groups. When group members pay for a defaulting member, the individual loan looks current. If your data records who paid, count those instalments separately; the risk has moved, not disappeared.
- 4Snapshot timing. Take the snapshot at the same point each month. A snapshot taken the day after centre meetings looks better than one taken the day before.
- 5Small denominators. A new branch with ₹5,00,000 outstanding can swing 10 points on a single loan. Print gross outstanding next to every percentage.
- 6Confusing PAR with NPA. Regulatory NPA classification follows the lender's regulator's rules and period, which is a different question from an internal PAR30 early-warning figure. For the RBI's NBFC overdue norm, see the Scale Based Regulation circular; do not relabel PAR30 as NPA.
Presenting it to the credit committee
Credit committees want trend and concentration, not a single month. A useful one-page layout:
- A line of PAR1, PAR30 and PAR90 for the last twelve monthly snapshots, same day each month.
- A branch table with gross outstanding, PAR30 %, arrears % and write-offs in the month, sorted by at-risk rupees rather than percentage, so the biggest exposure is on top.
- One cut by loan cycle or loan size band, whichever shows the stronger pattern, with a one-sentence hypothesis you are testing next.
Say what PAR30 is not: it is not an expected loss figure, and a borrower at 45 DPD may still repay in full.
Where this fits in learning
Calculating a ratio is easy; knowing which rows belong in the denominator is the skill that credit analytics interviews check. The Data Analyst programme builds that habit with pandas and SQL across 3–4 months. For the bank-side version of the same ageing logic, with RBI's dating rules, see bank NPA ageing and DPD buckets, and for how delinquency moves month to month, credit card roll rates.
Frequently asked questions
What is the formula for PAR30 in microfinance?
PAR30 is the total principal outstanding of every loan that has an instalment more than 30 days past due, divided by the gross principal outstanding of the whole active portfolio. You count the loan's entire remaining principal, not just the missed instalments.
Why is PAR30 higher than the overdue amount ratio?
The overdue ratio only counts the instalments that were missed, while PAR30 counts the full outstanding balance of any loan with a late instalment. A borrower who missed two small instalments puts their whole balance at risk, so PAR30 is usually several times the arrears ratio.
Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.
This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.
Explore Data Analytics with Generative AI