Banking NII / IRRBB Project net interest income and interest-rate risk in the banking book (IRRBB) under parallel rate shocks, reconciled to disclosed NII + the disclosed NII-sensitivity table.
BUILT (1L, Decision 060 Phase 2c) — under_development pending 2L sign-off. Real top-down NII + repricing-gap IRRBB engine (banklib.L3.nii_irrbb in the bankview repo): NII(Δr) over a repricing balance sheet, ΔNII(Δr) = net_gap_fraction·EA·Δr under ±100/±200bps parallel shocks (reusing the parallel-shift rate-scenario framing of finlib's curve/DFAST machinery). Two disclosed anchors: base NII calibrated to disclosed FY2025 NII, and the net repricing-gap calibrated to the disclosed +100bps 12-month NII sensitivity; the −100/±200bps points are non-circular back-tested predictions vs the disclosed earnings-at-risk table. Replaces the M-420 scaffold's one-period analytic NII spread. The repricing-share / deposit-beta-by-bucket split is a modelled prior (MD&A-narrative, not XBRL) — flagged not-sourced; anchors + citations in banklib/disclosed_anchors.yaml. Reconciliation evidence: validation_evidence/M-423/RECONCILIATION.md. Honest limitation surfaced by the back-test: disclosed −200bps figures are materially steeper than the linear gap (deposit-floor convexity) — the lever for a future gap-schedule refinement. Status stays under_development until 2L ratifies.
Inputs, processing, outputs
- engines
-
banklib.L3.nii_irrbb
- dimensions
- D3
Methodology
NII over a repricing balance sheet; ΔNII is driven by the asset/liability repricing gap:
UP (Δr ≥ 0): ΔNII(Δr) = net_gap_fraction · EarningAssets · Δr
DOWN (Δr < 0): ΔNII = a·x + b·x² (x = |Δr| in 100bps units)
evaluated at the standard IRRBB shocks (±100bps, ±200bps). Disclosed anchors:
- Level — base earning-asset yield calibrated so base-case NII reconciles to disclosed FY2025 NII.
- Up-shock sensitivity — the net repricing-gap fraction calibrated to the disclosed +100bps 12-month NII sensitivity. The off-anchor up point (+200bps) stays a non-circular back-tested prediction.
- Down-shock deposit-floor convexity (C-423-02) — the quadratic down leg
a·x + b·x²is calibrated to the disclosed −100/−200bps points:b = (d2 − 2·d1)/2,a = d1 − b. So both disclosed down points reconcile, andb<0reports the deposit-floor optionality a linear gap structurally omits. With only one disclosed down point (USB) the down leg is linear (b=0, flagged); with none, it falls back to the symmetric linear gap (flagged).
Reuses the parallel-shift rate-scenario framing of finlib's curve/DFAST machinery for the rate leg (REUSE, not re-derive).
What is sourced vs flagged
- Sourced: total assets (bankview adapter); disclosed FY2025 NII and the
disclosed ±bps NII-sensitivity table (FY2025 10-Ks, citations in
banklib/disclosed_anchors.yaml). - Modelled & flagged: the earning-asset base (proxy off total assets) and the
repricing-share / deposit-beta-by-bucket split (MD&A narrative, not XBRL).
Where no disclosed sensitivity exists for a firm, the gap is set to an
asset-sensitive prior and flagged
calibrated_sensitivity=False.
Validation Evidence & Honest Limitation
bankview/validation_evidence/M-423/ — per-firm modelled-vs-disclosed
reconciliation. The +100bps up point reconciles exactly (anchor). C-423-02
closed: the −100bps and −200bps down points now reconcile (err ≈ 0) for the
whole disclosed cohort (JPM/BAC/WFC/C/COF) via the per-firm deposit-floor
convexity term — previously a −14% to −71% under-prediction (JPM −200bps −30%).
The fitted deposit_floor_convexity b is the disclosed down-shock steepening
itself. Residual: the off-anchor +200bps up point and USB's single-down-point
linear leg stay surfaced limitations. Unit tests: tests/test_banklib_nii.py
(incl. convexity reconciliation + the single-/no-down-point fallbacks).
Change Log
- 2026-06-28 — Created as a planned backlog stub (Decision 060 / insightalm #3389).
- 2026-06-28 — 1L build (insightalm #3414): real top-down NII + repricing-gap
IRRBB engine (
banklib.L3.nii_irrbb), calibrated to disclosed NII + +100bps sensitivity for JPM/BAC/WFC; back-test, validation evidence + engine_registry binding added. Status → under_development. Ready for 2L re-review. - 2026-06-28 — 2L verdict (RAT-423-v1.0.0): CONDITIONALLY APPROVED. Registry
lifecycle.ratification_refset to RAT-423-v1.0.0 via the reconciler promote channel. Status held atunder_development(not promoted toactive) pending the open condition: the −200bps convexity point back-tested against a disclosed downside-shock sensitivity. - 2026-06-29 — 1L: condition C-423-02 addressed (issue #3432). Extended
banklib.nii_irrbbwith a per-firm deposit-floor convexity down-shock terma·x + b·x²calibrated to the disclosed −100/−200bps NII sensitivities (free public 10-K rate-risk tables, Decision 062). The down-shocks now reconcile (err ≈ 0) for the disclosed cohort — closing the linear-gap under-prediction (JPM −200bps −30% → 0).deposit_floor_convexityb<0reports the disclosed steepening; the UP leg stays the linear +100bps-calibrated gap (non-circular preserved). Residual (+200bps up point, USB single-point) surfaced. New unit tests. Ready for 2L re-review.
Open findings (4)
Independent 2nd-line review (INV-2026-06) — implemented capability vs registered scope. Each carries a recommended fix and is tracked in insightalm-mrm until closed.
The engine banklib.L3.nii_irrbb is BUILT, tested (10/10), and honest — but the insightalm registry entry M-423 is still status: planned with empty component lists (engines/assumptions/contracts = []) and the model card is still the "PLANNED, NOT BUILT" stub. A built, ratified model whose own registry denies it has an engine is an internal inconsistency 2L cannot leave standing; the engine is also invisible to check_registry_integrity (only InsModel binding manifests are scanned, not bankview).
Recommendation: Reconcile the registry (flip status; register the engine id + DS/A bindings or flag them scaffold the way M-431 provenance does) and author the real 13-section M-423 card; set lifecycle.ratification_ref: RAT-423-v1.0.0. (Condition C-423-01.)
Validation evidence + change logs missing across most of the inventory
Only M-001/M-020/M-050 carried full documentation packs before this pass. Most models record validation_evidence: missing and change_log: missing with peer_review: pending. Gold tests freeze behaviour but many assert only structural invariants (e.g. reserve>0), not correctness against external truth. The flagship T0-vs-10-K match is circular (BV-032).
Recommendation: For each Tier-1 model: produce a validation-evidence pack (back-test vs disclosed results once BV-032 re-calibration lands, sensitivity suite, challenger comparison), a change log, and a 2L ratification. Sequence behind BV-032 (firm-data) for anything needing 10-K reconciliation.
The linear repricing-gap structure reconciles the calibrated +100bps up-shock exactly but systematically UNDER-predicts the disclosed down-shock earnings-at-risk. Reproduced on JPM FY2025: +100 recon_err 0.0 (the anchor); −100 −12.5% (modelled −2,100 vs disclosed −2,400); −200 −30% (modelled −4,200 vs disclosed −6,000). The disclosed down-shocks are super-linear (deposit-floor convexity: JPM −200 = 2.5× −100; BAC 2.45×) which a linear gap cannot capture.
Recommendation: Keep the convexity limit DISCLOSED in the card + any surface (it is honestly a decision-support limitation, not a hidden defect — the engine reconciles what it calibrates and predicts the rest). Reading the −200bps modelled figure as the bank's true down-rate earnings-at-risk is out of scope (Condition C-423-02). A convexity term / non-linear repricing curve is the documented upgrade path — NOT a precondition for this Tier-2 decision-support ratification.
Doc-currency / drift coverage gap (banking analogue of INV-032 / LG-420-03): model_doc_currency.py cannot watermark M-423 — the engine is bankview-resident with no insightalm @engine binding.
Recommendation: Apply the sibling-aware drift-gate pattern the M-133 finlib gate now demonstrates when bankview engines are consumed cross-repo.
Per-tier expectations
Per MRM Framework §10.2 + §10.3, this model's regulatory_frameworks tag list activates the following overlays:
| component | tier-2 expectation | status |
|---|---|---|
| Registry entry | required | present |
| Model card (§10.5 doc pack) | required | present |
| Validation evidence | required | present |
| Change log | required | present |
| Independent effective challenge (2L) | required | n/a |
Ratified — RAT-423-v1.0.1
Latest ratification on file: RAT-423-v1.0.1. Authored by 2L (mrm-peer-reviewer) per Decision 028 charter §5 Pattern A.