IFRS 9 Expected Credit Loss Engine Architecture: PD, LGD, EAD and Staging
A bank’s loan-loss allowance used to be a number that appeared at quarter end, built from what had already gone wrong. Under the incurred-loss model, a loan that was current and performing carried almost no provision, even if everyone in the credit department knew the borrower’s industry was deteriorating. The 2008 crisis exposed that lag, and the accounting response was a model that books losses before they happen. The result is IFRS 9 expected credit loss (ECL): a probability-weighted, discounted, forward-looking estimate that must be recomputed every reporting date for every exposure.
That sentence hides an engineering problem. A mid-sized bank has millions of exposures, each needing a stage, a term structure of default probabilities under several macroeconomic scenarios, an exposure profile, a loss severity, and a discount curve, with every number reconcilable to the general ledger and defensible to an auditor. This article takes the engineer’s view: what the calculation is, how the data and compute flow, where it breaks, and how to keep it governable.
What this covers: the ECL formula and its components, staging and significant-increase-in-credit-risk (SICR) triggers, point-in-time versus through-the-cycle PDs, scenario weighting, overlays, batch architecture and scale, lineage and GL reconciliation, model risk, IFRS 7 disclosure, a brief CECL contrast, and a runnable Python example.
This is systems analysis for engineers and architects, not accounting, regulatory or investment advice. Consult your auditors and regulators for application to your institution.
Context and Background
IFRS 9 Financial Instruments was completed by the IASB in July 2014 and applies to annual periods beginning on or after 1 January 2018, according to the IFRS Foundation’s standard page. Its impairment chapter replaced the incurred-loss approach of IAS 39 with expected credit losses on amortised-cost assets, debt held at fair value through other comprehensive income, lease receivables, loan commitments and financial guarantee contracts. The standard has had amendments since (classification and measurement changes issued in May 2024, for example), but the core impairment mechanics described here have been stable for years.
The incumbents in this space are of two kinds. Banks have built in-house engines, often extending the infrastructure they already had for Basel internal-ratings-based (IRB) capital models, because PD, LGD and EAD are the same conceptual building blocks. Vendors sell packaged ECL platforms that wrap those components in staging logic, scenario management and reporting. Either way, the architecture questions are the same, and they are mostly data questions rather than mathematics questions.
The relationship to regulatory capital is worth stating precisely, because it causes the most design mistakes. Basel capital models estimate losses over a one-year horizon, usually through-the-cycle, with conservatism margins and downturn LGDs, and they produce risk-weighted assets. IFRS 9 produces an accounting allowance that must be unbiased, point-in-time, and forward-looking, without conservatism. Reusing Basel models therefore means adjusting them, not copying them. If you want the capital side of that picture, our article on the Basel III endgame risk-weighted assets calculation engine covers how RWA engines are structured and where they share inputs with an ECL engine.
The thesis of this article is that an ECL engine is best understood as a versioned, reproducible data pipeline with a small mathematical core, not as a model. The formula fits on one line. What costs money and attracts audit findings is everything around it: whether you can rerun March’s numbers in October and get the same answer, whether the stage counts tie to the ledger, and whether the overlay someone added in a spreadsheet is governed. Teams that treat ECL as a modelling project end up with an excellent PD model and an unreproducible close.
The ECL Formula and Engine Reference Architecture
Direct answer: For one exposure, ECL is the sum over future periods of marginal PD times LGD times EAD times a discount factor, computed under each macroeconomic scenario and then probability-weighted. Stage 1 sums only the next 12 months; Stages 2 and 3 sum over the remaining lifetime. The engine’s job is to supply each term, per exposure, reproducibly.

Figure 1: Reference architecture of an ECL calculation engine. Data quality gates feed stage allocation and the PD, LGD and EAD models; scenario inputs enter at the model layer; aggregation feeds both the ledger and disclosures.
Figure 1 shows the pipeline. Source systems (loan servicing, cards, trade finance, treasury) land into a staging area with data-quality gates. Stage allocation and the parameter models consume the cleaned exposures. The calculation layer combines parameters per exposure and scenario, aggregation rolls results up by product, segment and stage, and two consumers sit at the end: the general ledger posting and the IFRS 7 disclosure tables.
The formula, term by term
For an exposure with periods t = 1 to T, the scenario-s ECL is:
ECL_s = sum over t of [ S(t-1) x PD(t) x LGD(t) x EAD(t) x DF(t) ]
Here PD(t) is the marginal probability of defaulting in period t conditional on surviving to its start, and S(t-1) is the cumulative survival probability, so the product is the unconditional probability that default occurs in that period. Getting this wrong is the most common first-implementation bug: summing conditional PDs overstates loss, and using cumulative PDs directly double-counts early defaults.
EAD(t) is the expected exposure at default in period t. For an amortising loan it follows the repayment schedule, adjusted for expected prepayments. For revolving facilities it includes expected drawdown of the undrawn limit via a credit conversion factor. LGD(t) is the loss given default expressed as a share of EAD, after expected recoveries, collateral realisation, and the time value of recoveries. DF(t) discounts back to the reporting date at the original effective interest rate (or the credit-adjusted rate for purchased or originated credit-impaired assets). Per the EY IFRS 9 impairment guide, the standard requires an unbiased, probability-weighted amount (IFRS 9 paragraph 5.5.17) discounted at the effective interest rate.
Three horizon rules shape the code. Stage 1 truncates the sum at 12 months. Stage 2 and 3 run to the maturity of the contract. And lifetime for revolving products is not the contractual limit: paragraph 5.5.20 provides an exception, so for credit cards and overdrafts the horizon is the period over which the entity is exposed to credit risk and the loss would not be mitigated by risk management actions, which in practice means a behavioural life estimated from data.
Why the engine is a pipeline, not a function
Because the formula is applied per exposure per period per scenario, the compute grain is exposure x period x scenario. A portfolio of five million exposures with a 60-month average residual life and three scenarios implies on the order of 900 million parameter lookups per run (illustrative arithmetic: 5,000,000 x 60 x 3). That is trivial for a vectorised engine and painful for a row-by-row loop with database calls, which is why the architecture decisions below matter more than the formula.
Components you must own
The engine needs six owned components. First, a stage allocator that is deterministic and explainable. Second, PD term-structure services that return marginal PDs by segment, rating, scenario and horizon. Third, an LGD service with collateral and recovery curves. Fourth, an EAD/CCF service producing exposure profiles. Fifth, a scenario manager that stores macro paths and weights as versioned data. Sixth, a results store that retains inputs, parameters and outputs by run identifier, because audit requires the ability to explain any number from a prior period. If any of these is a spreadsheet, it is a control weakness regardless of how accurate it is.
Staging and Significant Increase in Credit Risk
Direct answer: IFRS 9 staging classifies each exposure into one of three buckets. Stage 1 is performing with no significant increase in credit risk since initial recognition (12-month ECL). Stage 2 has had a significant increase in credit risk (lifetime ECL). Stage 3 is credit-impaired or defaulted (lifetime ECL, with interest recognised on the net carrying amount).

Figure 2: Stage transitions. SICR moves an exposure from Stage 1 to 2, default moves it to Stage 3, and cures return it only after a probation period that the engine must track as state.
The staging decision is the single largest source of ECL volatility. Moving a loan from Stage 1 to Stage 2 replaces a 12-month loss with a lifetime loss, and for a five-year loan the allowance typically multiplies. In the toy example later in this article, the same loan goes from roughly 1,012 at Stage 1 to roughly 3,372 at Stage 2, a factor of about 3.3 (illustrative parameters, computed in the code below).
SICR: relative, not absolute
The standard asks whether credit risk has increased significantly since initial recognition, which is a relative test. A loan with a 5 percent lifetime PD at origination and 5 percent now has not deteriorated; a loan that was 0.5 percent and is now 2 percent has, even though the second is the safer asset in absolute terms. That forces the engine to store origination-date credit information for every exposure: the PD or rating at initial recognition, and the lifetime PD curve at that date. This is the first data-lineage trap. Origination attributes live in systems that predate the ECL project, and migrated or refinanced loans routinely lose them.
Practical SICR frameworks combine several triggers. Quantitative triggers compare current lifetime or 12-month PD against the origination equivalent, using a ratio threshold (for example, current PD exceeds some multiple of origination PD) combined with an absolute floor so that tiny movements on very safe assets do not trigger staging. Qualitative triggers include watchlist membership, forbearance or restructuring flags, and adverse covenant breaches. Backstops are mandatory in practice: the standard contains a rebuttable presumption that credit risk has significantly increased when contractual payments are more than 30 days past due, and a rebuttable presumption that default occurs no later than 90 days past due (paragraph B5.5.37), as summarised in the EY guide linked above. The multiples and floors are institution-specific and are not fixed by the standard; any numbers you see in examples are illustrative.
The low credit risk simplification lets an entity assume no SICR for an exposure with low credit risk at the reporting date, commonly aligned with investment-grade equivalents. It is attractive for treasury bond portfolios because it avoids origination-PD tracking, but it creates cliff effects at the investment-grade boundary, which the engine must handle without flip-flopping on small rating changes.
Stage 3, cures and the probation problem
Stage 3 covers credit-impaired exposures: default under the entity’s definition, which should be consistent with the definition used for internal risk management. Interest revenue is computed on amortised cost net of the allowance, rather than gross carrying amount, so a stage move also changes revenue. That cross-effect is why the stage allocator must output stage on the same grain and at the same snapshot as the interest accrual system.
Cures are state. A loan that returns to performing does not go straight back to Stage 1 under most policies; it sits in a probation period before the lower stage is allowed, to prevent oscillation. The engine therefore needs memory: months since cure event, count of prior defaults, and whether forbearance is still active. A stateless nightly recompute from today’s arrears will mis-stage cured loans. Store stage history as an append-only table keyed by exposure and reporting date.
Staging at the portfolio level
Not every exposure is assessed individually. Retail portfolios are staged on delinquency and behavioural score, while corporate exposures use rating migration. A pragmatic design lets the stage allocator be a rules engine over a standard exposure record, with rule sets versioned per segment. The rules should be data, not code, so credit policy can change a threshold through a governed release rather than a software deployment. And every stage decision should write the reason code that fired, because auditors will ask why a given loan is in Stage 2, and “the score was high” is not an answer.
The purchased or originated credit-impaired (POCI) category sits outside the three stages: such assets carry lifetime ECL from day one with a credit-adjusted effective interest rate, and only subsequent changes in lifetime expectations hit the income statement. A separate simplified approach lets entities measure trade receivables and contract assets without a significant financing component at lifetime ECL from origination, typically via a provision matrix (paragraphs 5.5.15 and 5.5.16). These two paths need their own branches in the allocator.
PD, LGD and EAD: Building Term Structures That Are Point-in-Time
Direct answer: IFRS 9 needs a term structure of marginal PDs, not a single 12-month number, and it must be point-in-time (PIT), meaning conditioned on current and forecast economic conditions. Basel-style through-the-cycle (TTC) ratings are smoothed across the cycle and must be converted before use.
Through-the-cycle versus point-in-time
A TTC rating is designed not to move when the economy does; a corporate rated BB stays BB through a mild recession because the agency or internal model is looking through the cycle. IFRS 9 wants the opposite. The allowance should rise when the outlook worsens, before defaults arrive, so the PD feeding it must respond to macroeconomic conditions. The usual conversion works in three steps. Start from a TTC PD per rating grade, calibrated to the long-run average default rate. Estimate a systematic factor (often called a credit cycle index) from observed portfolio default rates and macro variables. Then shift each grade’s PD by the factor to produce a PIT PD for each future period under each scenario. The Vasicek single-factor framework, familiar from Basel, is a common mathematical basis, though the choice is the institution’s to make and justify.
The trade-off is stability against responsiveness. A highly responsive PIT model amplifies the cycle in provisions, which is the procyclicality concern regulators raised after IFRS 9 went live. A heavily smoothed one defeats the standard’s purpose. Practical engines expose a calibration parameter and let model risk governance sign off the setting.
From 12-month PD to a lifetime curve
Lifetime PD requires extrapolating beyond the horizon where you have macro forecasts. Three families dominate. Markov migration matrices model rating transitions per period and absorb into default; the lifetime curve falls out by matrix powers, and macro scenarios shift the matrix. Survival or hazard models fit the default hazard as a function of loan age and covariates and are natural for retail books with long loan-level histories. Vintage or cohort curves apply an empirical seasoning shape (default risk usually peaks in the early-to-middle life of a loan, then declines for survivors) scaled by a macro-conditioned level.
Whichever you choose, the engine consumes marginal PDs per period. Store them as an array per segment, grade, scenario and run, and interpolate to the exposure’s actual cash-flow dates. If periods are annual in the PD tables but the loan pays monthly, the engine converts using the hazard-rate relationship rather than dividing by twelve: a monthly marginal PD is 1 minus (1 minus annual PD) to the power of 1/12, which preserves survival consistency.
LGD that reflects the cycle
LGD under IFRS 9 is also forward-looking: collateral values depend on the scenario. A mortgage LGD is typically modelled as the probability of the property being sold at a loss times the haircut, where the haircut depends on a house-price path under the scenario. This couples LGD and PD through the same macro path, which matters because losses cluster: a downside scenario with rising unemployment and falling prices raises both at once, and the product is superlinear. Modelling them independently and multiplying scenario-averaged values understates the weighted ECL. The engine must therefore compute ECL per scenario and weight afterwards, never weight the parameters first. We return to this below.
Recoveries are discounted over the workout period, so LGD carries its own time dimension, and unsecured retail LGD often comes from a cure-rate-times-loss-if-not-cured decomposition: some defaulters cure, and for the rest you estimate recovery curves by months since default. Unsourced detail here is deliberately generic, because LGD methodology varies widely and the standard does not prescribe it.
EAD profiles and credit conversion factors
For term loans, EAD is the projected outstanding balance plus accrued interest at each future date, adjusted by prepayment assumptions (prepayment shortens the average life and cuts lifetime ECL). For revolving facilities, EAD(t) equals current drawn balance plus a credit conversion factor times the undrawn limit, where the CCF reflects how much of the headroom borrowers tend to draw as they approach default. Because borrowers in distress draw down more, CCFs estimated on the entire book understate the draw at default. The exposure profile for derivatives and securities financing is a different animal altogether, driven by simulated market paths, and is often taken from the counterparty-credit-risk engine rather than recomputed.
Forward-Looking Scenarios, Weighting and Overlays
Direct answer: The standard requires an unbiased, probability-weighted outcome that reflects reasonable and supportable forecasts. In practice engines run at least three macro scenarios (base, upside, downside), compute full ECL under each, and weight the results. Weighting after calculation captures the nonlinearity of losses. Management overlays then adjust for risks the models miss.

Figure 3: Scenario pipeline. Macro paths drive satellite models that shift PD and LGD, ECL is computed per scenario, then weighted and adjusted by governed overlays.
Scenario design and weighting
Scenarios usually originate from the economics function, drawing on published central-bank or international-institution paths, and are then translated to model inputs (GDP growth, unemployment, house-price index, policy rate, commodity prices) over a three-to-five-year explicit forecast, after which paths revert to long-run averages. Weights are a judgment: a common illustrative pattern is 50 percent base, 20 percent upside and 30 percent downside, with the downside weighted higher than the upside when risks are skewed. I use exactly that illustrative split in the code below. Nothing in the standard fixes the weights or the number of scenarios; it asks that the outcome be unbiased and probability-weighted.
The nonlinearity is the point
If ECL were linear in the macro drivers, weighting scenarios would equal running the weighted-average scenario and the whole apparatus would be unnecessary. It is not linear. In the toy example, the weighted lifetime ECL is about 3,372, while the base scenario alone gives about 2,704, so the probability-weighted figure is roughly 25 percent higher. At 12 months the gap is about 31 percent (1,012 versus 770). The downside tail contributes disproportionately because PDs rise sharply and exposures are still outstanding. This is the mechanism by which IFRS 9 produces more provisions than a base case would, and it explains why reported allowances grow when forecast uncertainty widens even if the central forecast does not change. All of these figures use illustrative inputs I chose, not market data.
Post-model adjustments and overlays
No model captures everything. Overlays, also called post-model adjustments (PMAs) or management overlays, patch the gap: a sector shock not in the macro variables, a model known to be miscalibrated, a data defect, a geopolitical event. During the pandemic, many institutions relied heavily on overlays because models trained on normal history misread government support schemes and payment holidays. The lesson was that overlays should be a managed asset, not a back door.
A governable overlay framework has five properties. Each overlay has an owner, a rationale and a quantified method, even if the method is simple. It is applied at a defined grain (segment or stage) so it can flow through disclosures. It has an expiry or review date, so temporary patches do not become permanent. It is stored as versioned data in the same results store as model output and posted with a separate GL reference. And the overlay-to-total ratio is a monitored metric with a threshold that triggers model remediation: if a quarter of your allowance is overlay, the models are no longer the system of record. Regulators and auditors have repeatedly asked banks to show how overlays are governed; the specifics vary by jurisdiction and are not covered here.
A Runnable Python ECL Calculation
The code below is a toy: a five-year, annually amortising loan of 100,000 at an 8 percent effective interest rate, a flat LGD of 40 percent, and illustrative marginal PD curves for three scenarios. It computes 12-month and lifetime ECL per scenario and the probability-weighted result. It uses mid-year default timing for discounting and deliberately ignores prepayment and LGD variation, so each term is easy to inspect. I ran it for this article and the outputs quoted in the text come from this exact script.
EIR = 0.08
BAL0, YEARS = 100_000.0, 5
LGD = 0.40
# illustrative marginal (conditional on survival) annual PDs
PD = {"base": [0.020, 0.025, 0.030, 0.032, 0.033],
"upside": [0.014, 0.018, 0.022, 0.025, 0.027],
"down": [0.045, 0.055, 0.060, 0.058, 0.055]}
W = {"base": 0.50, "upside": 0.20, "down": 0.30}
def schedule():
pmt = BAL0 * EIR / (1 - (1 + EIR) ** -YEARS)
bal, rows = BAL0, []
for t in range(1, YEARS + 1):
rows.append((t, bal)) # EAD at start of year t
bal = bal * (1 + EIR) - pmt
return rows
def ecl(pds, horizon):
surv, total = 1.0, 0.0
for (t, ead), pd in zip(schedule(), pds):
if t > horizon:
break
marginal = surv * pd # unconditional default prob
df = (1 + EIR) ** -(t - 0.5) # mid-year default timing
total += marginal * LGD * ead * df
surv *= (1 - pd)
return total
for name, pds in PD.items():
print(name, round(ecl(pds, 1), 2), round(ecl(pds, YEARS), 2))
for h, lab in ((1, "stage1"), (YEARS, "stage2")):
print(lab, round(sum(W[s] * ecl(PD[s], h) for s in PD), 2))
Output of that script:
| Scenario | 12-month ECL | Lifetime ECL |
|---|---|---|
| Base | 769.80 | 2,703.65 |
| Upside | 538.86 | 2,003.89 |
| Downside | 1,732.05 | 5,398.04 |
| Weighted 50/20/30 | 1,012.29 | 3,372.01 |
The 12-month downside is 2.25 times the base (1,732 versus 770), driven entirely by PD (0.045 versus 0.020); that ratio is exactly the PD ratio because LGD, EAD and discounting are identical across scenarios in this toy. In a real engine LGD and EAD also move by scenario, so the downside multiple would be larger still.
A few things to notice. First, the Stage 1 to Stage 2 jump comes from extending the sum from one term to five while the later terms have lower EAD but higher cumulative default exposure. Second, the weighted number is not the base number plus a small adjustment; it is a different quantity. Third, a production version replaces the loop with vectorised arrays over exposures, and replaces the flat LGD with a scenario-conditioned LGD curve. The structure of the loop, however, is the same one that runs inside commercial engines.
Data Architecture, Batch Runtime and GL Reconciliation
Direct answer: Run ECL as a month-end batch with an immutable input snapshot, a run identifier, deterministic compute and a results store that records inputs and parameters. Reconcile exposure totals to the ledger before calculating, and allowance movements to GL journals after. The control environment matters more than the compute speed.

Figure 4: Month-end control flow. Snapshots carry batch identifiers and hash totals; the engine computes; the reconciliation service ties exposures and allowance movements to the ledger and returns breaks.
Lineage: the pipeline before the pipeline
Most ECL defects are data defects. The sources are loan systems that were never designed for forward-looking modelling, so the engine needs a lineage layer that does five jobs. It captures a point-in-time snapshot of every source extract and stamps it with a batch identifier. It validates completeness with record counts and control totals (sum of gross carrying amount by product) compared with the ledger. It enriches exposures with origination attributes, rating history, collateral values and forbearance flags from their systems of record. It rejects or quarantines records failing quality rules, with a counted and explained exception list rather than silent drops. And it persists the exact snapshot so a rerun reads the same bytes.
A dropped record silently reduces the allowance. If 0.2 percent of exposures fail a join on collateral reference and fall out of the calculation, the output looks plausible and the error hides until a reviewer notices that gross carrying amount in the engine is lower than the ledger. The defence is the pre-calculation reconciliation: engine input exposure by product must equal ledger gross carrying amount within a stated tolerance, or the run halts. This single control prevents more restatements than any model improvement.
Reconciling to the general ledger
Reconciliation runs in two directions. Before the run, exposures tie to the ledger. After the run, the allowance by stage and product becomes journal entries, and the allowance roll-forward must tie: opening allowance, plus new originations, plus stage transfers, plus remeasurement from parameter and scenario changes, less write-offs, plus recoveries, equals closing allowance. The movement analysis is not decoration. IFRS 7 requires a reconciliation of the loss allowance by stage, so the engine should produce the movement categories natively rather than reverse-engineering them in a spreadsheet. That means computing ECL for the opening portfolio under both opening and closing parameters (a standard technique to separate parameter effects from volume effects), and tagging every exposure with its transfer event.
A practical rule is that the engine owns the sub-ledger and finance owns the posting. The engine publishes allowance by account, product, stage and currency; finance maps those to chart-of-accounts entries through a versioned mapping table. Both sides then run the same check on the same data. When a break appears, the reconciliation service reports it at the grain where it arose (product and stage), not only at total, because a netted zero can hide offsetting errors.
Batch architecture and runtime scale
The workload is embarrassingly parallel across exposures and serial only at aggregation. A common design partitions exposures by segment and hash of exposure identifier, runs the calculation as a distributed job (Spark-style dataframes or a columnar in-memory engine), and aggregates results with a final reduce. Parameters, which are small, are broadcast to all workers: PD tables, LGD curves and scenario paths are megabytes while exposures are gigabytes.
Runtime, in my experience of such systems rather than a published benchmark, is dominated not by the arithmetic but by I/O and joins: reading exposure snapshots, joining to parameters, writing detailed results. The detailed results are the bulky part. Persisting ECL per exposure per period per scenario for the 900-million-row example above is large; a typical compromise stores exposure-level results per scenario and stage and keeps period-level detail only for samples and for exposures flagged for review, with the ability to regenerate the rest from stored inputs. Treat that as a design choice to size for your own volumes; I have no verified industry figures for typical run times and will not quote them.
Reruns deserve special attention. Finance will ask for “what if the downside weight were 35 percent” or “what if this segment moved to Stage 2” late in a close. A parameter-driven engine with immutable inputs can answer these quickly as sensitivity runs tagged separately from the official run, with no write access to the official results table. An engine where parameters are embedded in code cannot, and teams then resort to spreadsheet approximations that nobody validated.
Intraday, API and “what-if” use
ECL is also needed outside month-end, for example to price a new loan or test a restructuring. The same calculation core should be callable as a stateless service for a single exposure, using the same parameter version as the batch. Duplicating the formula in a pricing system guarantees divergence. Expose the single-exposure function from a shared library or service and keep batch as a vectorised wrapper around it. Our article on credit scoring and underwriting ML architecture discusses how origination scores feed the PD that later becomes the ECL baseline, which is also why origination PD must be persisted.
Model Risk, Validation and IFRS 7 Disclosure
Direct answer: ECL models are subject to the same model risk discipline as other material models: inventory, independent validation, ongoing monitoring and change control. IFRS 7 then requires disclosure of the inputs, assumptions, staging criteria, allowance movements and credit quality, which the engine should produce as structured outputs.
Model risk and validation
An ECL engine contains many models: PD by segment, LGD, EAD/CCF, the stage allocator’s SICR thresholds, satellite macro models, the scenario translation and the overlays. Each needs an owner, a documented methodology, an independent validation before use and a monitoring plan after. Validation covers conceptual soundness, data quality, performance (discrimination such as AUC or Gini, and calibration comparing predicted with realised default rates), sensitivity to inputs, and benchmarking against alternatives. The supervisory guidance most often cited for the discipline is the US Federal Reserve and OCC’s SR 11-7, whose principles are discussed in our article on model risk management for machine learning credit models; other jurisdictions have their own expectations, and I have not mapped them here.
ECL imposes validation difficulties that capital models do not. Backtesting is hard because the prediction is a lifetime, scenario-weighted value and the realisation is one path; you can test 12-month PD calibration well but lifetime curves only on mature vintages. The forward-looking component cannot be backtested against a unique truth, so validators challenge reasonableness: are the scenarios consistent with external forecasts, are weights stable, does the sensitivity of ECL to macro variables have the right sign and magnitude? And with machine-learning PDs, explainability for stage movements matters, because a SICR trigger driven by an opaque score is hard to defend.
IFRS 7 disclosure as an engine output
IFRS 7 Financial Instruments: Disclosures requires qualitative and quantitative information on credit risk and expected credit losses. As I read the standard (paragraphs 35A to 35N; verify the exact paragraph mapping against the current text), the requirements include how the entity determines SICR and default, the inputs, assumptions and estimation techniques used, how forward-looking information including macroeconomic scenarios was incorporated, a reconciliation of the opening to closing loss allowance with explanations of significant movements, and the gross carrying amount by credit risk grade and stage. These tables are the same data the engine already holds, cut by stage and grade.
Design for it: tag every result row with the dimensions the disclosures need (product, stage, rating grade, currency, geography, movement category), and generate the tables from the results store rather than from separate finance extracts. Two sources produce two answers. Sensitivity disclosures, such as the effect on ECL of 100 percent weight on the downside scenario, are also natural outputs of the parameterised engine and cost almost nothing to produce if the architecture supports tagged sensitivity runs.
CECL: A Brief Contrast
The US equivalent, ASC 326 (Current Expected Credit Loss, or CECL), shares the goal but differs in structure. According to a PwC summary of FASB’s credit loss standard, CECL requires recognition of lifetime expected credit loss on initial recognition of a financial asset, uses reasonable and supportable forecasts followed by a reversion to historical loss information, and has no staging: instruments are pooled by similar risk characteristics rather than classified into stages. The effective dates started for SEC filers in fiscal years beginning after 15 December 2019 and later for others, per the same summary.
For the engineer, the differences translate as follows.
| Aspect | IFRS 9 | CECL (ASC 326) |
|---|---|---|
| Horizon at origination | 12-month ECL (Stage 1) | Lifetime ECL |
| Staging | Three stages plus POCI, SICR test | None; pooling by risk characteristics |
| Day-one cost | 12-month allowance | Full lifetime allowance |
| Forward-looking | Probability-weighted scenarios | Reasonable and supportable forecast, then reversion |
| Scope | Amortised cost, FVOCI debt, commitments, guarantees, leases | Amortised cost, off-balance-sheet exposures, leases; AFS debt separate |
| Engine consequence | Needs origination PD and stage history | Needs pooled loss-rate or PD/LGD methods; no SICR state |
A bank reporting under both frameworks (common for groups with US subsidiaries) can share the parameter services and data layer while keeping a framework-specific aggregation layer. The Stage 2 lifetime calculation in this article is effectively what CECL computes for everything, so the core loop is reusable. What differs is the horizon selector and the scenario treatment: CECL does not mandate probability weighting of discrete scenarios, and institutions often use a single forecast plus reversion, though methods vary.
Trade-offs, Gotchas, and What Goes Wrong
Stage cliff effects. The step from 12-month to lifetime ECL makes the allowance discontinuous at the SICR threshold. A portfolio hovering near the threshold flips en masse when the macro outlook worsens, producing a quarter with a large charge. That is partly the intent, but designing the threshold without simulating the migration distribution leads to surprises. Run stage-sensitivity analysis before go-live: what happens to the allowance if the PD multiple threshold is 10 percent lower?
Procyclicality. Point-in-time PDs and forward-looking scenarios raise provisions when conditions weaken, which can reduce lending capacity at the worst time. This is a policy trade-off rather than a bug, but engines should let model owners see the PIT-versus-TTC calibration explicitly.
Double counting. Overlays that add a sector stress on top of a downside scenario already embedding that stress count the risk twice. Every overlay should state which risk is not in the models, and a reviewer should check scenario content before approving.
Origination data loss. Without origination PD, SICR cannot be tested properly. Proxies (for example, using the earliest available rating) are acceptable only if documented, and they bias staging in ways that are hard to see.
Currency and discounting errors. Discounting at the wrong rate (current market rather than original EIR), or applying a floating rate’s reset incorrectly, produces small per-loan errors that add up to material totals. Test discounting against hand-computed examples for each product type.
Unit confusion in PDs. Conditional versus cumulative, annual versus monthly, 12-month forward versus lifetime: the single largest family of bugs. Defend with unit-bearing types or naming conventions (marginal_pd_annual, cumulative_pd), and property tests: cumulative PD must be monotonic, bounded by 1, and equal to one minus the product of survival terms.
Practical Recommendations
Build the ECL engine as a product with versioned inputs, not as a project that ends at the first sign-off. Begin with the control framework and the data layer, since those determine whether a quarterly close is repeatable, and add model sophistication incrementally. A modest, well-reconciled PD model beats a sophisticated one nobody can rerun.
Make the formula implementation a single, tested library used by batch, pricing and sensitivity runs. Persist origination attributes from day one, even for loans that predate the project, using documented proxies where necessary. Compute per scenario, then weight, and keep scenarios, weights, parameters and overlays as versioned data in a registry referenced by every run manifest. Make stage reasons explicit in the output, so every Stage 2 and Stage 3 decision is explainable. And generate IFRS 7 tables from the same tagged results rather than from finance spreadsheets.
Checklist for go-live:
- Unit tests for the PD, LGD, EAD and discounting functions with hand-computed expected values, including edge cases (zero balance, one-period loan, PD of 1).
- Pre-run reconciliation of input gross carrying amount to the ledger, with a hard stop on breach.
- Post-run allowance roll-forward that ties opening to closing by movement category.
- Run manifest recording snapshot ID, code version, parameter versions, scenario version, overlay version and weights.
- Stage migration simulation showing sensitivity to SICR threshold changes.
- Independent validation sign-off for each model and for the scenario translation.
- An overlay register with owner, rationale, size, expiry and GL reference.
- Rerun test: repeat a prior quarter’s numbers from archived inputs and confirm identical results.
- Disclosure tables generated from tagged results and tied to the notes.
Where I have given numbers (the toy loan, the 50/20/30 weights, the 900-million-lookup arithmetic) they are illustrations, not recommendations for any institution’s calibration.
Frequently Asked Questions
What is IFRS 9 expected credit loss in simple terms?
It is the probability-weighted, discounted estimate of credit losses an entity expects on financial assets, recognised as an allowance from the day the asset is first recorded. For each exposure it multiplies the probability of default, the loss given default and the exposure at default across future periods, discounts at the effective interest rate, and weights across economic scenarios. Performing assets carry a 12-month figure, while deteriorated ones carry a lifetime figure.
What is the difference between Stage 1, Stage 2 and Stage 3?
Stage 1 holds exposures without a significant increase in credit risk since initial recognition and measures ECL over 12 months. Stage 2 holds exposures where credit risk has significantly increased and measures lifetime ECL. Stage 3 holds credit-impaired or defaulted exposures with lifetime ECL, and interest income is calculated on the net carrying amount. Rebuttable presumptions place exposures more than 30 days past due in Stage 2 and more than 90 days past due in default.
How do PD, LGD and EAD fit together?
PD is the likelihood the borrower defaults in a period, LGD is the share of the exposure lost if default occurs after recoveries, and EAD is the amount outstanding at default, including expected drawdown on undrawn limits. ECL multiplies them by period, with survival weighting so default is counted once, then discounts and sums. Each is conditioned on forward-looking macroeconomic scenarios, so they move together in a downturn.
Why does IFRS 9 need multiple economic scenarios?
Credit losses are nonlinear in economic conditions: a severe downturn raises defaults and losses far more than a mild upturn lowers them. A single central forecast therefore understates the expected loss. Running several scenarios, computing ECL for each and weighting by probability captures the skew. In the illustrative example here, the weighted lifetime ECL is about 25 percent above the base-case figure, and the standard requires an unbiased, probability-weighted amount.
How is CECL different from IFRS 9?
CECL, the US standard in ASC 326, recognises lifetime expected losses from origination for all in-scope assets and has no staging. It relies on reasonable and supportable forecasts followed by reversion to historical losses and pools assets by risk characteristics. IFRS 9 recognises only 12-month losses until credit risk significantly increases. Engines can share parameter and data layers, but the horizon logic and aggregation differ.
What is a post-model adjustment or management overlay?
An overlay is an adjustment to model-calculated ECL for risks the models do not capture, such as a new sector shock, a model limitation or a data issue. It should be quantified, approved, owned, time-limited and posted with a separate reference. High or persistent overlays signal model weakness and typically trigger remediation. Auditors and supervisors scrutinise the governance more than the amounts themselves.
Further Reading
- Basel III endgame RWA calculation engine architecture for the capital-side engine that shares inputs with ECL.
- Credit scoring and underwriting ML architecture for how origination PDs are built and explained.
- Model risk management under SR 11-7 for ML credit models for validation practice.
- IFRS Foundation: IFRS 9 Financial Instruments, the primary source.
- EY: Applying IFRS 9 impairment (April 2018) for paragraph-level interpretation.
By Riju — about
