IFRS 9 Expected Credit Loss (ECL): the formula behind the provision
Provision = PD × LGD × EAD. Three numbers, one row in your loan book.
By Solomon Ajayi · Free to read, no signup
Lesson 51 introduced the three IFRS 9 stages and showed the journal entries. This one zooms into the FORMULA underneath the ECL number. Every loan, every reporting day, runs: ECL = PD × LGD × EAD. PD (Probability of Default) is the chance the loan defaults in the relevant horizon. LGD (Loss Given Default) is the % of EAD you'd lose if it did. EAD (Exposure at Default) is the principal at risk. Stage 1 uses 12-month PD; Stage 2/3 use lifetime PD. The hard part is the MODELS, Stage 2 PD depends on macro variables (unemployment, GDP, FX) plus borrower-specific signals (DPD, credit score, sector). This lesson shows the entry that posts the resulting ECL delta but the real value is the formula.
Lesson 51 showed the staging cascade and the entries it produces. This lesson opens up the number those entries post. Every provision is the product of three factors: Probability of Default, the chance the loan goes bad in the relevant horizon; Loss Given Default, the fraction of exposure you would actually lose if it did; and Exposure at Default, the principal at risk. Multiply them and you get the expected credit loss.
The journal entry is the same two lines you already know: Impairment Charge debit, ECL Provision credit, for the delta between today's expected loss and the provision you already carry. What changes is where the number comes from. Stage 1 uses a 12-month PD; Stage 2 and 3 use a lifetime PD. And the inputs are not static: PD bends to macro variables like unemployment and FX, and LGD worsens in downturns because recoveries dry up exactly when defaults spike.
Because the factors move with the macro environment, your provision can swing quarter to quarter even when no individual borrower has deteriorated and no loan has changed DPD bucket. A model recalibration alone can ripple a top-up across your whole book. That volatility is a feature of IFRS 9, and the regulator will probe your PD and LGD models far harder than your journal entries, so store PD, LGD, and EAD as explicit columns on every loan-state snapshot to make back-testing possible.
Worked example, step by step
Loan baseline: ₦500,000 outstanding, Stage 1
₦500,000 EAD. 12-month PD modelled at 1.2% (your scorecard score puts this borrower in band B). LGD at 45% (industry-typical for unsecured consumer lending; secured loans are lower). ECL = 500,000 × 1.2% × 45% = ₦2,700. Existing provision: ₦0 (just disbursed). Post the initial ECL.
| Account | Debit | Credit |
|---|---|---|
| Impairment Charge (P&L) (5400) | ₦2,700.00 | |
| ECL Provision (contra-asset) (1510) | ₦2,700.00 |
Impairment Charge UP ₦2,700 (debit, P&L hit). ECL Provision UP ₦2,700 (credit, contra-asset). Carrying value = ₦500,000 − ₦2,700 = ₦497,300. Every new loan takes this hit at disbursal, the unwinding of the provision over the loan's life is what turns it into net interest income.
Macro shock: model recalibrates upward
Three months later, your macro variables degraded. Unemployment up 2 percentage points. Your model spits out a new 12-month PD of 3.0% for this borrower band. LGD model also creeped up to 50% (recoveries are worse in downturns). New ECL = 500,000 × 3.0% × 50% = ₦7,500. Existing provision ₦2,700. Top up by ₦4,800.
| Account | Debit | Credit |
|---|---|---|
| Impairment Charge (P&L) (5400) | ₦4,800.00 | |
| ECL Provision (contra-asset) (1510) | ₦4,800.00 |
Impairment Charge UP ₦4,800 (debit). ECL Provision UP ₦4,800 (credit). Loan still Stage 1 (no DPD movement, no individual deterioration), the macro overlay alone moved the provision. This is exactly why ECL is so volatile quarter-to-quarter under IFRS 9: model parameter shifts ripple through your entire book.
Takeaway
ECL = PD × LGD × EAD is the heart of every IFRS 9-compliant loan book. The journal entry is trivial; the modelling is the work. PD models need borrower-segment scorecards and macro overlays. LGD models need historical recovery data per collateral type and seniority. EAD for committed-but-undrawn facilities (credit cards, BNPL with available credit) needs a CCF (Credit Conversion Factor). Real fintechs spend more engineering time on the ECL model than on the ledger itself, and the regulator will probe the model, not the journal entries. Build the schema with PD/LGD/EAD as columns on every loan-state snapshot so back-testing is possible.
The code behind it
ECL = PD x LGD x EAD, with the stage picking 12-month vs lifetime PD.
def expected_credit_loss(ead, lgd, pd_12m, pd_lifetime, stage):
"""ECL = PD * LGD * EAD. Stage 1 uses the 12-month PD;
Stage 2/3 use the lifetime PD. Inputs are decimals (1.2% -> 0.012)."""
if stage not in (1, 2, 3):
raise ValueError("stage must be 1, 2, or 3")
pd = pd_12m if stage == 1 else pd_lifetime
return ead * pd * lgd
# Worked example: the lesson's Stage 1 baseline loan.
# 500,000 EAD, 12-month PD 1.2%, LGD 45%.
ead = 500_000
ecl = expected_credit_loss(ead, lgd=0.45, pd_12m=0.012, pd_lifetime=0.18, stage=1)
print(ecl) # -> 2700.0 (= 500,000 * 0.012 * 0.45)
# Provision delta to post: Impairment Charge (5400) Dr, ECL Provision (1510) Cr.
existing_provision = 0.0
delta = ecl - existing_provision
print(f"Dr 5400 / Cr 1510: {delta:.2f}") # -> Dr 5400 / Cr 1510: 2700.00
print(f"Carrying value: {ead - ecl:.2f}") # -> Carrying value: 497300.00Practice this on a real ledger
Reading is half of it. Open this lesson in the lab to post the entries yourself against a real Postgres-backed double-entry ledger, with the validation on. Free, your sandbox is yours.