Staging engine — Stage 1 / 2 / 3 classification

The staging engine is the part of IFRS 9 auditors examine first, because it determines whether ECL is computed over 12 months (Stage 1) or over the full life of the loan (Stage 2 and 3). Get the staging wrong and every downstream number is wrong.

IFRS 9 runs
Quarterly run history with totals.

What staging actually is

Staging is a quarterly classification exercise. For every loan in the book on the quarter-end date, the engine evaluates a set of ordered rules and assigns one of three stages. The stage drives two downstream calculations: the ECL horizon (12-month vs lifetime PD) and the interest recognition (gross vs net carrying amount for Stage 3).

The rules live in ifrs9.staging.rule. Each rule has a sequence (evaluated low-to-high), a Python condition evaluated against the loan record, and a target stage. The first matching rule wins. There is always a default Stage-1 fallback rule with the highest sequence number.

The shipped default rules

Macro scenarios
Base / Optimistic / Downside scenarios with weights.

The system ships with eight default rules calibrated to CBK PG/04 and IFRS 9 paragraph 5.5. You can disable any rule but you cannot delete the shipped Stage-3 DPD-≥90 rule.

SeqRule nameCondition (plain English)Target
10DPD ≥ 90Days past due is 90 or more on any instalmentStage 3
20Credit-impaired flagOfficer ticked 'credit impaired' on the loanStage 3
30Distressed restructureRestructure happened in last 24 months AND borrower was in arrears at restructureStage 3
40Cross-defaultSame member has another loan in Stage 3Stage 3
50DPD ≥ 30Days past due is 30 or moreStage 2
60WatchlistLoan is on the credit committee watchlistStage 2
70PD doubled since originationCurrent 12-month PD is ≥ 2× origination 12-month PDStage 2
80Sector stressMember's sector has a Risk Committee 'stress' flag this quarterStage 2
999Default fallbackAlways matchesStage 1

Significant Increase in Credit Risk (SICR)

IFRS 9 requires loans to move from Stage 1 to Stage 2 when there has been a 'significant increase in credit risk' since initial recognition. This is the most judgement-heavy area of the standard and a frequent audit topic.

We use three SICR triggers and a loan triggers Stage 2 if any of them fires. They are designed to be defensible without being trigger-happy: a loan that drifts to 31 DPD then cures back the same quarter should not bounce between stages.

  • Quantitative — DPD ≥ 30. The IFRS 9 rebuttable presumption. We do not rebut it.
  • Quantitative — PD doubling. Current 12-month PD ≥ 2× origination 12-month PD. Calibrated on local default data.
  • Qualitative — Watchlist / sector stress. Risk Committee can flag individual loans or whole sectors.
Note — We do not use the low credit-risk exemption (IFRS 9.5.5.10) — Kenyan microfinance borrowers are by nature not 'low risk' in the standard's sense. The exemption is mainly used by banks for investment-grade sovereign exposures.

Cure periods — moving back down

Stage transitions are not symmetric. A loan moves up the stages as soon as a trigger fires. A loan moves down only after a defined cure period of demonstrated good behaviour. This prevents the cliff-edge of a loan paying one instalment, going to Stage 1, then re-defaulting.

FromToCure conditionCure period
Stage 3Stage 2Continuous payments per schedule, no arrears12 months (forborne) / 6 months (non-forborne)
Stage 3Stage 1Not permitted — must go via Stage 2 first
Stage 2Stage 1All Stage-2 triggers cleared3 months
Warning — Distressed restructures (Stage 3 by Rule 30) require the forborne 12-month cure. The system tracks is_forborne on the loan record and enforces this automatically. Do not override without Risk Manager sign-off.

Manual stage override

In exceptional cases a Risk Manager can override the engine's stage decision. Override is logged with reason and reviewer, surfaced in the audit pack, and required to be re-justified at the next run.

  1. Open the run line for the loan in question.
  2. Click Override stage (visible only to MFI / IFRS 9 / Risk Manager group).
  3. Select target stage and pick from the reason list (Forced cure, Sectoral noise, Data error, Other).
  4. Add a free-text justification ≥ 50 characters.
  5. Override is now logged in ifrs9.stage.override with the user, timestamp, and run.
Note — Override does not change subsequent runs automatically. If the loan should remain in the overridden stage next quarter, the override must be re-applied or the staging rule itself adjusted.

What auditors check

From the four most recent external audits, these are the questions that consistently come up around staging:

All five questions can be answered from the audit pack without leaving the system. See audit pack.

  • Sample of 25 Stage 1 loans — any that should have been Stage 2 based on DPD or PD doubling?
  • Sample of 10 Stage 2 loans — was the SICR trigger captured correctly?
  • Stage 3 → Stage 2 transitions during the period — did each have a documented cure period?
  • Any manual overrides — what was the justification and who signed off?
  • Year-on-year migration matrix — are Stage 2 and Stage 3 populations stable, growing, or shrinking?

Worked scenarios

Scenario — Drought triggers sector stress — 84 agriculture loans move to Stage 2

Setting: Q3 quarter-end. Met Office has issued a poor-rains forecast for the long-rains season. Risk Committee meets two weeks before quarter-end.

CharacterRole
Kimani MwangiRisk Manager
Mary MutuaHead of Credit
Florence AchiengCFO
Jane WambuiMaize farmer, KES 80,000 loan, current

Timeline

  1. Sep 18: Risk Committee reviews Met Office forecast. Decides to flag 'Agriculture — rain-fed maize' as a stressed sector. (Minute item 4.2)
  2. Sep 19: Kimani opens IFRS 9 → Sector Stress Flags. Adds sector 'AGR-MAIZE-RAINFED' with effective date 30-Sep. (ifrs9.sector.stress row created)
  3. Sep 30, 23:59: Quarter-end snapshot. 4,189 loans frozen. (ifrs9.run state=snapshotted)
  4. Oct 1, 08:30: Kimani runs staging. Rule 80 (Sector stress) fires on 84 agriculture loans — including Jane's KES 80,000 loan which is current and would otherwise be Stage 1. (84 loans moved to Stage 2)
  5. Oct 1, 09:15: Mary spot-checks the list. Two loans are already Stage 3 by Rule 10 (90+ DPD) — those stay Stage 3 (lower-numbered rule wins). (Rule-precedence check passes)
  6. Oct 1, 11:00: ECL recomputes. The 84 newly-staged loans add KES 1.2M to weighted ECL vs Q2. (state=computed)
  7. Oct 3, 10:00: Florence reviews. Asks Kimani to document the sector-stress decision in the audit pack. (Audit pack section 3.4)
  8. Oct 3, 14:00: Run posted to GL. (state=posted)
  9. Jun 30 (next year): Rains have recovered; arrears on the agriculture book back to baseline. Risk Committee removes the sector flag. Staging engine moves 71 of the 84 back to Stage 1 (after the 3-month cure since flag removal). (13 loans remain in Stage 2 by other rules)

Outcome — Forward-looking SICR captured without waiting for actual arrears; ECL ahead of the curve; full audit trail of the qualitative judgement.

Reference

ifrs9.staging.rule fields

FieldTypeNotes
sequenceIntegerEvaluation order; lower wins
nameCharHuman-readable rule name
target_stageSelection (1/2/3)Stage to assign on match
condition_pythonTextPython expression evaluated against loan record. Example: loan.days_past_due >= 90
activeBooleanDisable without deleting; preserves audit history
valid_from / valid_toDateRule applies to runs whose period_end falls in this window
is_shipped_lockedBooleanTrue for the Stage-3 DPD-≥90 rule; cannot be disabled

Permitted stage transitions

FromToAllowedRequires
Stage 1Stage 2YesAny Stage-2 SICR rule fires
Stage 1Stage 3YesAny Stage-3 rule fires
Stage 2Stage 1Yes3-month cure, all Stage-2 triggers cleared
Stage 2Stage 3YesAny Stage-3 rule fires
Stage 3Stage 2Yes6-month cure (non-forborne) or 12-month (forborne)
Stage 3Stage 1NoMust pass via Stage 2

Troubleshooting

SymptomLikely causeFix
A loan I expected in Stage 2 is showing Stage 1.Rule 50 (DPD ≥ 30) checks days_past_due at the snapshot date. If the borrower paid on 29-Sep and DPD reset to zero, the rule does not fire.Check the loan's payment history. If you believe SICR was triggered earlier and not cured properly, raise a manual override with reason 'Forced SICR retention'.
Whole portfolio jumps to Stage 2 unexpectedly.Sector stress flag was added at the parent sector level (e.g. 'Agriculture' rather than 'AGR-MAIZE-RAINFED') and cascades to all child sectors.Edit the sector stress record and narrow the sector. Re-run staging — the cascade will revert.
Stage 3 → Stage 2 transition not happening despite 12 clean months.is_forborne flag on the loan was never cleared after the original restructure; engine is still applying the 12-month forborne cure on top.If 12 months have elapsed, the engine should clear. If last_arrear_date on the loan is more recent than expected, the cure clock restarts from that date.
Override count is high (>5% of book).Either the staging rules are mis-calibrated or there is a data quality issue (e.g. DPD field not refreshed).Run the daily DPD refresh first (MFI → Tools → Refresh DPD). If overrides remain high, take the rule calibration to Risk Committee.
Staging rule changes affect prior quarters' runs.The valid_from date on the rule was set in the past.Rules should always have valid_from set forward of the most recent posted run. Adjust valid_from; previously-posted runs are immutable so the change cannot retroactively contaminate them.

See also

Was this page helpful?