Regulatory Tables¶
This page documents the lookup tables used for regulatory risk weight assignment, CCF, supervisory haircuts, LGD, and slotting.
Source of truth: All regulatory table values live in the rulepack packs
src/rwa_calc/rulebook/packs/{common,crr,b31}.pyas cited entries (ScalarParam / LookupTable / BandedTable / DecisionTable / Feature), read throughrwa_calc.rulebook.resolve.resolve(regime, date). The SA risk-weight and collateral-haircut builder shims (engine/sa/crr_risk_weight_tables.py,engine/sa/b31_risk_weight_tables.py,engine/crm/haircut_tables.py) bind those pack values for the engine.
Risk Weight Tables¶
Sovereign Risk Weights (CRR Art. 114)¶
Sovereign weights are identical under CRR and Basel 3.1.
| CQS | Risk Weight |
|---|---|
| 1 | 0% |
| 2 | 20% |
| 3 | 50% |
| 4 | 100% |
| 5 | 100% |
| 6 | 150% |
| Unrated | 100% |
Source: CENTRAL_GOVT_CENTRAL_BANK_RISK_WEIGHTS in engine/sa/crr_risk_weight_tables.py (values cited in rulebook/packs/crr.py / common.py, read via the rulepack)
Institution Risk Weights (CRR Art. 120–121)¶
| CQS | CRR (Art. 120) | Basel 3.1 ECRA |
|---|---|---|
| 1 | 20% | 20% |
| 2 | 50% | 30% |
| 3 | 50% | 50% |
| 4 | 100% | 100% |
| 5 | 100% | 100% |
| 6 | 150% | 150% |
| Unrated | 100% (Art. 120(2)) | SCRA (see below) |
Basel 3.1 SCRA (for unrated institutions, CRE20.16-21):
| Grade | Risk Weight |
|---|---|
| A | 40% |
| B | 75% |
| C | 150% |
Source: INSTITUTION_RISK_WEIGHTS_CRR in engine/sa/crr_risk_weight_tables.py, INSTITUTION_RISK_WEIGHTS_B31_ECRA / B31_SCRA_RISK_WEIGHTS in engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/{crr,b31,common}.py, read via the rulepack)
Short-Term Institution ECAI (Basel 3.1 Art. 120(2)/(2B))¶
Table 4 — long-term ECAI applied to short-term exposure (≤3m, or ≤6m trade finance):
| CQS | Risk Weight |
|---|---|
| CQS 1-3 | 20% |
| CQS 4-5 | 50% |
| CQS 6 | 150% |
Table 4A — specific short-term ECAI assessment (Art. 120(2B)):
| Short-Term CQS | Risk Weight |
|---|---|
| CQS 1 | 20% |
| CQS 2 | 50% |
| CQS 3 | 100% |
| Others | 150% |
Art. 120(3) governs the interaction: Table 4 applies when no short-term assessment exists; Table 4A applies when a short-term assessment yields a more favourable or equal weight.
Table 4A is routed by a rating-row flag: set is_short_term=True on the
ratings row together with scope_type and scope_id identifying the target
exposure (RATINGS_SCHEMA in src/rwa_calc/data/schemas.py). The
HierarchyResolver overrides the counterparty long-term CQS for that exposure
and the SA engine routes via Table 4A.
Source: B31_ECRA_SHORT_TERM_RISK_WEIGHTS (Table 4) and
B31_ECRA_SHORT_TERM_ECAI_RISK_WEIGHTS (Table 4A) in
engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/b31.py, read via the rulepack).
Corporate Risk Weights (CRR Art. 122)¶
| CQS | CRR | Basel 3.1 | Change |
|---|---|---|---|
| 1 | 20% | 20% | — |
| 2 | 50% | 50% | — |
| 3 | 100% | 75% | Reduced |
| 4 | 100% | 100% | — |
| 5 | 150% | 150% | — |
| 6 | 150% | 150% | — |
| Unrated | 100% | 100% | — |
PRA Deviation — CQS 5 = 150%
BCBS CRE20.42 reduced corporate CQS 5 from 150% to 100%. The PRA retained 150% per
PRA PS1/26 Art. 122(2) Table 6. The code constant B31_CORPORATE_RISK_WEIGHTS correctly
uses Decimal("1.50") for CQS 5.
Basel 3.1 corporate sub-categories (Art. 122(4)–(11)):
| Category | Risk Weight | Reference | Conditions |
|---|---|---|---|
| Investment grade | 65% | Art. 122(6)(a) | PRA permission required; internal IG assessment (Art. 122(9)–(10)) |
| Non-investment grade | 135% | Art. 122(6)(b) | PRA permission required; internal non-IG assessment |
| SME corporate | 85% | Art. 122(11) | Turnover ≤ GBP 44m (PS1/26 Glossary SME definition), unrated |
| General unrated | 100% | Art. 122(5) | Default without PRA IG/non-IG permission |
Subordinated debt
Subordinated debt (150%) is classified under the equity exposure class (Art. 133(1)), not the corporate class. It sits at priority 3 in the Art. 112 Table A2 waterfall, above corporates at priority 16. See the equity section below.
Source: CORPORATE_RISK_WEIGHTS in engine/sa/crr_risk_weight_tables.py, B31_CORPORATE_RISK_WEIGHTS, B31_CORPORATE_INVESTMENT_GRADE_RW,
B31_CORPORATE_NON_INVESTMENT_GRADE_RW, B31_CORPORATE_SME_RW in engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/{crr,b31}.py, read via the rulepack)
Short-Term Corporate ECAI (Basel 3.1 Art. 122(3), Table 6A)¶
New in Basel 3.1 — for corporate exposures with a specific short-term ECAI assessment:
| Short-Term CQS | Risk Weight |
|---|---|
| CQS 1 | 20% |
| CQS 2 | 50% |
| CQS 3 | 100% |
| Others | 150% |
CRR has no short-term corporate ECAI table. Not yet implemented — no lookup table or schema field exists. See B31 SA Risk Weights spec.
Retail Risk Weights¶
| Exposure Type | CRR | Basel 3.1 | Reference |
|---|---|---|---|
| Retail Mortgage (LTV ≤ 80%) | 35% | LTV-based (see below) | Art. 125 / Art. 124F |
| QRRE Transactors | 75% | 45% | — / Art. 123(3)(a) |
| Payroll / Pension Loans | 35% | 35% | Art. 123 (CRR2) / Art. 123(4) |
| Retail QRRE (non-transactor) | 75% | 75% | Art. 123 / Art. 123(3)(b) |
| Retail Other | 75% | 75% | Art. 123 / Art. 123(3)(b) |
| Non-Regulatory Retail | — | 100% | — / Art. 123(3)(c) |
CRR2 Payroll/Pension Treatment
The 35% payroll/pension risk weight was introduced by CRR2 (Regulation (EU) 2019/876) and carried forward unchanged to PRA PS1/26 Art. 123(4). The CRR code path does not implement this treatment — see CRR SA spec.
Source: RETAIL_RISK_WEIGHT in engine/sa/crr_risk_weight_tables.py, B31_RETAIL_PAYROLL_LOAN_RW / B31_RETAIL_TRANSACTOR_RW in engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/{crr,b31}.py, read via the rulepack)
CRR Residential Mortgage (CRR Art. 125)¶
Under CRR, residential mortgages use a split treatment based on 80% LTV threshold:
- LTV ≤ 80%: 35% risk weight
- LTV > 80%: 35% on the secured portion, 75% on the unsecured excess
Source: RESIDENTIAL_MORTGAGE_PARAMS in engine/sa/crr_risk_weight_tables.py (values cited in rulebook/packs/crr.py, read via the rulepack)
CRR Commercial Real Estate (CRR Art. 126)¶
Under CRR, commercial RE uses a proportion-based split analogous to Art. 125 for residential. Art. 126(2)(d): the 50% RW applies only to the part of the loan not exceeding 50% of market value (or 60% of MLV). The remainder falls to the counterparty's standard exposure class weight.
- LTV ≤ 50%: 50% risk weight (entire loan within secured portion)
- LTV > 50%: 50% on portion up to 50% MV, counterparty RW on excess
Art. 126(2)(a)–(c) qualifying conditions must also be met (property value independence from borrower credit quality, repayment not dependent on property cash flows, Art. 208/229 compliance).
Source: COMMERCIAL_RE_PARAMS in engine/sa/crr_risk_weight_tables.py (values cited in rulebook/packs/crr.py, read via the rulepack)
Code Divergence (D3.36)
The calculator implements Art. 126 as a binary whole-loan treatment (50% if LTV ≤ 50% with income cover, 100% otherwise) rather than the regulatory proportion-based split.
Basel 3.1 Residential Real Estate (PRA PS1/26 Art. 124F-124G)¶
General — Loan-Splitting (Art. 124F)¶
The PRA adopted loan-splitting (not the BCBS whole-loan table) for general residential:
- Secured portion (up to 55% of property value) → 20% risk weight
- Residual → counterparty risk weight (75% for individuals per Art. 124L)
Source: B31_RESIDENTIAL_GENERAL_SECURED_RW, B31_RESIDENTIAL_GENERAL_MAX_SECURED_RATIO in engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/b31.py, read via the rulepack)
Income-producing — Whole-Loan (Art. 124G, Table 6B)¶
| LTV | Risk Weight |
|---|---|
| ≤ 50% | 30% |
| 50–60% | 35% |
| 60–70% | 40% |
| 70–80% | 50% |
| 80–90% | 60% |
| 90–100% | 75% |
| > 100% | 105% |
Junior Charge Multiplier (Art. 124G(2)):
| LTV | Multiplier | Effective RW (example) |
|---|---|---|
| ≤ 50% | 1.0× | 30% (no uplift) |
| > 50% | 1.25× | e.g. 50% × 1.25 = 62.5% (at 70–80% LTV) |
The multiplied weight is not capped at the Table 6B ceiling — it may exceed 105% (e.g. 105% × 1.25 = 131.25% at LTV > 100% with a junior charge).
Resolved (P1.111)
Previously the multiplied RW was incorrectly capped at the 105% table maximum.
Art. 124G(2) has no express cap — LTV > 100% with a junior charge now correctly
resolves to 131.25%. Regression guard: test_multiplier_not_capped_at_105.
Source: B31_RESI_INCOME_JUNIOR_MULTIPLIER, B31_RESI_INCOME_JUNIOR_LTV_THRESHOLD in engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/b31.py, read via the rulepack)
Basel 3.1 Commercial Real Estate (PRA Art. 124H–124K)¶
General — Natural Person/SME (Art. 124H(1)–(2) — Loan-Splitting)¶
| LTV | Risk Weight |
|---|---|
| ≤ 55% (secured portion) | 60% |
| > 55% (unsecured portion) | counterparty RW |
Other Counterparties — Art. 124H(3)
For non-natural-person, non-SME borrowers (e.g. large corporates, institutions), no
loan-splitting applies. The entire exposure receives a whole-loan risk weight:
RW = max(60%, min(counterparty_rw, income_producing_rw)) where income_producing_rw
is the Art. 124I rate (100% if LTV ≤ 80%, 110% if LTV > 80%). The calculator routes
automatically when cp_is_natural_person = False and is_sme = False.
Income-Producing (Art. 124I — Whole-Loan)¶
| LTV | Risk Weight |
|---|---|
| ≤ 80% | 100% |
| > 80% | 110% |
PRA vs BCBS deviation
BCBS CRE20.86 uses a 3-band table (≤60%: 70%, 60–80%: 90%, >80%: 110%). The PRA simplified this to a 2-band table in Art. 124I.
Junior Charge Treatment (Art. 124I(3)): Absolute RW override on Art. 124I(1)/(2) base:
| LTV | Absolute RW | Reference |
|---|---|---|
| ≤ 60% | 100% | Art. 124I(3)(a) |
| 60–80% | 125% | Art. 124I(3)(b) |
| > 80% | 137.5% | Art. 124I(3)(c) |
ADC Exposures¶
| Condition | Risk Weight |
|---|---|
| ADC (standard) | 150% |
| ADC (pre-sold) | 100% |
Other Real Estate (Art. 124J)¶
Exposures failing the Art. 124A qualifying criteria:
| Sub-Type | Risk Weight |
|---|---|
| Income-dependent (any property type) | 150% |
| Residential, non-income-dependent | Counterparty RW |
| Commercial, non-income-dependent | max(60%, counterparty RW) |
Source: B31_COMMERCIAL_INCOME_LTV_BANDS, B31_ADC_RISK_WEIGHT, B31_ADC_PRESOLD_RISK_WEIGHT in engine/sa/b31_risk_weight_tables.py (values cited in rulebook/packs/b31.py, read via the rulepack)
Credit Conversion Factors¶
Risk Type Categories (CRR Art. 111)¶
| Code | Full Value | SA CCF | F-IRB CCF | Description |
|---|---|---|---|---|
FR |
full_risk |
100% | 100% | Direct credit substitutes, guarantees, acceptances |
MR |
medium_risk |
50% | 75% | NIFs, RUFs, standby LCs, committed undrawn |
MLR |
medium_low_risk |
20% | 75% | Documentary credits, trade finance |
LR |
low_risk |
0% | 0% | Unconditionally cancellable commitments |
F-IRB 75% Rule (CRR Art. 166(8)): Under F-IRB, both MR and MLR categories use 75% CCF.
F-IRB Exception (CRR Art. 166(9)): Short-term letters of credit arising from the
movement of goods retain 20% CCF under F-IRB. Flag these with is_short_term_trade_lc = True.
Supervisory Haircuts (CRR Art. 224 / CRE22.52-53)¶
CRR Financial Collateral Haircuts (3 maturity bands)¶
| Collateral Type | ≤ 1yr | 1–5yr | > 5yr |
|---|---|---|---|
| Cash | 0% | 0% | 0% |
| Government CQS 1 | 0.5% | 2% | 4% |
| Government CQS 2-3 | 1% | 3% | 6% |
| Corporate CQS 1 | 1% | 4% | 8% |
| Corporate CQS 2-3 | 2% | 6% | 12% |
| Equity (main index) | 15% | — | — |
| Equity (other) | 25% | — | — |
| Gold | 15% | — | — |
Basel 3.1 Financial Collateral Haircuts (5 maturity bands)¶
| Collateral Type | ≤ 1yr | 1–3yr | 3–5yr | 5–10yr | > 10yr |
|---|---|---|---|---|---|
| Cash | 0% | 0% | 0% | 0% | 0% |
| Government CQS 1 | 0.5% | 2% | 2% | 4% | 4% |
| Government CQS 2-3 | 1% | 3% | 4% | 6% | 12% |
| Corporate CQS 1-2 | 1% | 4% | 6% | 10% | 12% |
| Corporate CQS 3 | 2% | 6% | 8% | 15% | 15% |
| Equity (main index) | 20% | — | — | — | — |
| Equity (other) | 30% | — | — | — | — |
| Gold | 20% | — | — | — | — |
Non-Financial Collateral Haircuts¶
| Collateral Type | Haircut |
|---|---|
| Receivables | 20% |
| Other physical | 40% |
Additional Haircuts¶
| Condition | Haircut |
|---|---|
| Currency mismatch | +8% |
Source: COLLATERAL_HAIRCUTS, BASEL31_COLLATERAL_HAIRCUTS in engine/crm/haircut_tables.py (values cited in the collateral_haircuts DecisionTable of rulebook/packs/{crr,b31}.py; fx_haircut scalar in packs/common.py).
Slotting Risk Weights¶
CRR Specialised Lending (CRR Art. 153(5) Table 1)¶
UK CRR Art. 153(5) has a single table covering all SL types, differentiated by remaining maturity (≥ 2.5 years vs < 2.5 years).
| Category | ≥ 2.5yr | < 2.5yr |
|---|---|---|
| Strong | 70% | 50% |
| Good | 90% | 70% |
| Satisfactory | 115% | 115% |
| Weak | 250% | 250% |
| Default | 0% | 0% |
CRR HVCRE — EU CRR Table 2 (No UK Legal Basis)¶
UK CRR Has No HVCRE Table
The values below are from the original EU CRR Table 2. The UK onshored CRR does
not contain this table — "high volatility commercial real estate" does not appear
in the UK CRR text. All SL types under UK CRR use Table 1 above. HVCRE is introduced
by PRA PS1/26 Table A (see Basel 3.1 HVCRE below). The code applies
these weights for CRR is_hvcre=True exposures (code divergence D3.22).
| Category | ≥ 2.5yr | < 2.5yr |
|---|---|---|
| Strong | 95% | 70% |
| Good | 120% | 95% |
| Satisfactory | 140% | 140% |
| Weak | 250% | 250% |
| Default | 0% | 0% |
Basel 3.1 Non-HVCRE (PRA PS1/26 Art. 153(5) Table A)¶
Applies to all non-HVCRE SL types (PF, IPRE, OF, CF) regardless of operational status.
| Category | Risk Weight | EL Component |
|---|---|---|
| Strong | 70% | 0.4% |
| Good | 90% | 0.8% |
| Satisfactory | 115% | 2.8% |
| Weak | 250% | 8.0% |
| Default | 0% | 50.0% |
No Separate Pre-Operational Table
BCBS CRE33.6 Table 6 defines elevated pre-operational PF weights (Strong 80%, Good 100%, Satisfactory 120%, Weak 350%). PRA PS1/26 does not adopt this distinction — all project finance uses the standard non-HVCRE weights above regardless of operational status. The SA calculator handles pre-operational PF separately via Art. 122B(2)(c) (130% unrated pre-op, 100% operational, 80% high-quality). See B31 slotting spec for details (FR-5.2).
Subgrade Columns (Art. 153(5)(c)–(f))
Table A has a 7-column structure with subgrade columns A/B/C/D. The weights above are the default column B (Strong) and D (Good) values per Art. 153(5)(c). Column A (Strong 50%) and C (Good 70%) are available for short-maturity (< 2.5yr) exposures and certain enhanced-criteria IPRE/PF exposures. Column A/C concessions are not yet implemented — see key-differences.
Basel 3.1 HVCRE (PRA PS1/26 Art. 153(5) Table A)¶
Introduced by PRA PS1/26
UK CRR has no HVCRE concept. PRA PS1/26 introduces HVCRE as a new sub-type with elevated risk weights. See CRR HVCRE note above.
| Category | Risk Weight | EL Component |
|---|---|---|
| Strong | 95% | 0.4% |
| Good | 120% | 0.8% |
| Satisfactory | 140% | 2.8% |
| Weak | 250% | 8.0% |
| Default | 0% | 50.0% |
Source (CRR/B31): slotting risk-weight values are cited LookupTable entries in rulebook/packs/crr.py / rulebook/packs/b31.py (keys slotting_rw_base, slotting_rw_short, slotting_rw_hvcre, slotting_rw_hvcre_short, plus B31 slotting_rw_preop), bound for the engine in engine/slotting/transforms.py via _CRR_PACK.lookup(...) / _B31_PACK.lookup(...). There is no standalone lookup_slotting_rw helper or data/tables module — read the resolved rulepack.
F-IRB Supervisory LGD (CRR Art. 161)¶
CRR Art. 161 Values¶
| Category | LGD | Reference |
|---|---|---|
| Senior unsecured | 45% | Art. 161(1)(a) |
| Subordinated unsecured | 75% | Art. 161(1)(b) |
| Covered bonds (Art. 129(4)/(5)) | 11.25% | Art. 161(1)(d) |
| Senior purchased corporate receivables | 45% | Art. 161(1)(e) |
| Subordinated purchased corporate receivables | 100% | Art. 161(1)(f) |
| Dilution risk of purchased corporate receivables | 75% | Art. 161(1)(g) |
CRR Art. 230 Table 5 LGDS Values (Secured Portions)¶
| Collateral Type | LGDS (Senior) | LGDS (Subordinated) |
|---|---|---|
| Financial collateral | 0% | 0% |
| Receivables | 35% | 65% |
| Residential RE | 35% | 65% |
| Commercial RE | 35% | 65% |
| Other physical | 40% | 70% |
Basel 3.1 Values (PRA PS1/26)¶
| Category | LGD | Change |
|---|---|---|
| Senior unsecured (non-FSE) | 40% | ↓ from 45% |
| Senior unsecured (FSE) | 45% | — |
| Subordinated | 75% | — |
| Covered bonds | 11.25% | Art. 161(1)(d) → Art. 161(1B) |
| Senior purchased receivables | 40% | ↓ from 45% |
| Subordinated purchased receivables | 100% | — |
| Dilution risk | 100% | ↑ from 75% |
| Secured — Financial collateral | 0% | — |
| Secured — Receivables | 20% | ↓ from 35% |
| Secured — Residential RE | 20% | ↓ from 35% |
| Secured — Commercial RE | 20% | ↓ from 35% |
| Secured — Other physical | 25% | ↓ from 40% |
B31 Art. 230 — Subordinated LGDS Distinction Removed
Basel 3.1 Art. 230(2) provides a single LGDS per collateral type with no senior/subordinated distinction. The CRR Table 5 subordinated column (65%/70%) is not carried forward.
Overcollateralisation Requirements¶
| Collateral Type | Min Ratio | Min Threshold |
|---|---|---|
| Financial | 1.0x | 0% of EAD |
| Covered bonds | 1.0x | 0% of EAD |
| Receivables | 1.25x | 0% of EAD |
| Real estate | 1.4x | 30% of EAD |
| Other physical | 1.4x | 30% of EAD |
Source: F-IRB supervisory LGD and overcollateralisation values are cited rulepack entries in rulebook/packs/{crr,b31}.py, resolved per run via resolve(regime, date) and bound for the engine by firb_supervisory_lgd_values(pack) in engine/irb/formulas.py (consumed in engine/irb/transforms.py). The former FIRB_SUPERVISORY_LGD / FIRB_OVERCOLLATERALISATION_RATIOS constants and the data/tables/firb_lgd.py module no longer exist.
A-IRB LGD Floors¶
CRR Portfolio-Level Floors (Art. 164(4))¶
CRR Art. 164(4) (as amended by CRR2) imposes portfolio-level minimum LGD requirements for retail property-secured exposures: exposure-weighted average LGD ≥ 10% (residential RE) and ≥ 15% (commercial RE). These are not per-exposure input floors — they operate at the aggregate portfolio level. Exposures benefiting from central government guarantees are excluded.
Code Divergence (D3.38)
The calculator does not implement CRR portfolio-level LGD floors; the CRR rulepack carries zero per-exposure LGD floors. See A-IRB Specification for details.
Basel 3.1 Per-Exposure Input Floors¶
Basel 3.1 replaces the CRR portfolio-level mechanism with per-exposure input floors:
Corporate / Institution (Art. 161(5)):
| Collateral Type | LGD Floor |
|---|---|
| Unsecured | 25% |
| Financial collateral | 0% |
| Receivables | 10% |
| Commercial real estate | 10% |
| Residential real estate | 10% |
| Other physical | 15% |
Art. 161(5)(a) sets a flat 25% for all corporate unsecured — no senior/subordinated distinction.
Retail (Art. 164(4)):
| Exposure Type | Collateral | LGD Floor | Sub-paragraph |
|---|---|---|---|
| Residential RE mortgage (flat) | RE secured | 5% | Art. 164(4)(a) |
| QRRE (transactor and revolver) | Unsecured | 50% | Art. 164(4)(b)(i) |
| Other retail | Unsecured | 30% | Art. 164(4)(b)(ii) |
| Other retail (LGDU in LGD* formula) | Partially unsecured | 30% | Art. 164(4)(c)(iii) |
| Other retail | Financial collateral | 0% | Art. 164(4)(c)(iv)(1) |
| Other retail | Receivables | 10% | Art. 164(4)(c)(iv)(2) |
| Other retail | Immovable property (CRE / RRE as collateral) | 10% | Art. 164(4)(c)(iv)(3) |
| Other retail | Other physical | 15% | Art. 164(4)(c)(iv)(4) |
Art. 164(4)(a) applies the flat 5% floor to retail RRE mortgages irrespective of the level of collateral provided. For all other secured or partially-secured retail exposures, the blended LGD floor is LGD* from the Foundation Collateral Method (Art. 230 / Art. 231) with LGDU substituted at 30% and LGDS values from the table above. Canonical source: B31 A-IRB spec.
PD Floors¶
| Exposure Class | CRR | Basel 3.1 |
|---|---|---|
| Corporate | 0.03% | 0.05% |
| Sovereign | 0.03% | 0.05% |
| Institution | 0.03% | 0.05% |
| Retail Mortgage | 0.03% | 0.10% |
| Retail QRRE (transactor) | 0.03% | 0.05% |
| Retail QRRE (revolver) | 0.03% | 0.10% |
| Retail Other | 0.03% | 0.05% |
Sovereign Row is Regulatory Dead Letter under Basel 3.1 (Art. 147A(1)(a))
Sovereign exposures (Art. 147(2)(a)) are restricted to the Standardised Approach by Basel 3.1 Art. 147A(1)(a) — F-IRB and A-IRB are both unavailable and PS1/26 provides no grandfathering or transitional carve-out. The 0.05% sovereign row in the Basel 3.1 column is retained for completeness and CRR cross-reference only.
Institutions (Art. 147(2)(b)) are capped at F-IRB by Art. 147A(1)(b) (A-IRB unavailable; SA applies only where permission has been granted under Art. 148 or Art. 150). The 0.05% institution PD floor applies normally to F-IRB institution exposures.
See IRB Approach Restrictions for the full Art. 147A(1) class mapping.
Source: PD-floor values are cited entries in the rulepack packs (rulebook/packs/{crr,b31}.py), resolved per run via resolve(regime, date). They are no longer carried on CalculationConfig (the PDFloors sub-config was removed).
Equity Risk Weights¶
SA Equity (Code Constants)¶
Code Values vs Regulation
This table reflects the SA equity risk-weight values bound in
engine/equity/calculator.py (the _CRR_SA_RW / _B31_SA_RW maps, resolved
from the equity_sa_risk_weights LookupTable in the rulepack packs). Under
CRR Art. 133(2), all equity receives a flat
100% — the differentiated weights (250%/400%) apply only under Basel 3.1
Art. 133. The CIU fallback (Art. 132(2)) is 1,250% per regulation, but the
code uses 150% (CRR) / 250% (B31). See Equity Approach
for the regulatory specification.
CRR SA (Art. 133(2) — flat 100%):
| Equity Type | Code Value | Regulatory Value |
|---|---|---|
| Central bank | 0% | 0% |
| All other equity | 100% | 100% (Art. 133(2)) |
| CIU (fallback) | 150% | 1,250% (Art. 132(2)) |
Basel 3.1 SA (Art. 133):
| Equity Type | Code Value | Regulatory Value |
|---|---|---|
| Central bank | 0% | 0% (Art. 133(6)) |
| Legislative programme | 100% | 100% (Art. 133(6)) |
| Subordinated debt | 150% | 150% (Art. 133(1)) |
| Standard (listed) | 250% | 250% (Art. 133(3)) |
| Higher risk (unlisted + business < 5yr) | 400% | 400% (Art. 133(4)) |
| CIU (fallback) | 250% | 1,250% (Art. 132(2)) |
IRB Simple Equity (CRR Art. 155)¶
Art. 155(2) defines exactly three risk weight categories:
| Equity Category | Risk Weight | Reference |
|---|---|---|
| Exchange-traded / listed | 290% | Art. 155(2)(a) |
| Private equity (diversified portfolios) | 190% | Art. 155(2)(b) |
| All other equity | 370% | Art. 155(2)(c) |
Code mapping (equity_irb_simple_risk_weights LookupTable in rulebook/packs/crr.py, bound in engine/equity/calculator.py as the module-level _IRB_RW map):
The code maps the EquityType enum to these three buckets:
| EquityType enum value | Code RW | Art. 155 bucket |
|---|---|---|
CENTRAL_BANK |
0% | (exempt — sovereign treatment) |
PRIVATE_EQUITY_DIVERSIFIED |
190% | Art. 155(2)(b) |
GOVERNMENT_SUPPORTED |
190% | (no Art. 155 basis — see D3.4) |
LISTED, EXCHANGE_TRADED |
290% | Art. 155(2)(a) |
UNLISTED, PRIVATE_EQUITY, SPECULATIVE, CIU, OTHER |
370% | Art. 155(2)(c) |
Code deviation: GOVERNMENT_SUPPORTED
The GOVERNMENT_SUPPORTED type is mapped to 190% in the IRB Simple table, but Art. 155 has no "government-supported" category. This is a code-specific mapping (treating it as PE diversified). See D3.4.
Note: Under Basel 3.1, IRB equity approaches are withdrawn. All equity falls to SA.
Source: equity risk-weight values are cited LookupTable entries in rulebook/packs/{crr,b31}.py (equity_sa_risk_weights, equity_irb_simple_risk_weights), resolved via resolve(regime, date) and bound in engine/equity/calculator.py (module-level _CRR_SA_RW / _B31_SA_RW / _IRB_RW maps built with lookup_float_map). The former SA_EQUITY_RISK_WEIGHTS / IRB_SIMPLE_EQUITY_RISK_WEIGHTS constants and data/tables/crr_equity_rw.py no longer exist.
IRB Parameters¶
Maturity Bounds¶
| Parameter | Value |
|---|---|
| PD floor (CRR) | 0.03% |
| Maturity floor | 1 year |
| Maturity cap | 5 years |
Source: PD floor, maturity floor and maturity cap are cited ScalarParam entries in the rulepack packs (rulebook/packs/{crr,b31}.py), read via the resolved rulepack (resolve(regime, date)).
API Functions¶
Risk Weight Lookup¶
from rwa_calc.engine.sa.crr_risk_weight_tables import lookup_risk_weight
rw = lookup_risk_weight(
exposure_class="corporate",
cqs=2,
is_basel_3_1=False,
)
# Returns: Decimal("0.50") (50%)
Residential Mortgage RW (CRR)¶
from rwa_calc.engine.sa.crr_risk_weight_tables import calculate_residential_mortgage_rw
from decimal import Decimal
rw, description = calculate_residential_mortgage_rw(ltv=Decimal("0.85"))
# Returns: (blended_rw, "split_treatment")
Basel 3.1 Residential RW¶
from rwa_calc.engine.sa.b31_risk_weight_tables import lookup_b31_residential_rw
from decimal import Decimal
rw, band = lookup_b31_residential_rw(ltv=Decimal("0.65"), is_income_producing=False)
# Returns: (Decimal("0.25"), "60-70%")
Haircut Lookup¶
from rwa_calc.engine.crm.haircut_tables import lookup_collateral_haircut
haircut = lookup_collateral_haircut(
collateral_type="bond",
cqs=1,
residual_maturity_years=3.0,
is_main_index=False,
is_basel_3_1=False
)
# Returns: Decimal("0.04") (4% for govt CQS1 1-5yr)
F-IRB LGD Lookup¶
There is no standalone lookup_firb_lgd helper. F-IRB supervisory LGD values are read
from the resolved rulepack via the engine binding:
from datetime import date
from rwa_calc.engine.irb.formulas import firb_supervisory_lgd_values
from rwa_calc.rulebook.resolve import resolve
lgd_values = firb_supervisory_lgd_values(resolve("crr", date(2026, 1, 1)))
# Maps collateral / seniority keys to supervisory LGDs
# e.g. residential RE secured -> 0.35 (CRR) / 0.20 (Basel 3.1)
Slotting Lookup¶
There is no standalone lookup_slotting_rw helper. Slotting risk-weight values are
LookupTable entries read from the resolved rulepack:
from datetime import date
from rwa_calc.rulebook.resolve import resolve
slotting_rw = resolve("crr", date(2026, 1, 1)).lookup("slotting_rw_base")
# Maps slotting category (e.g. "good") to its risk weight, e.g. 0.90 (90%)
# Other keys: slotting_rw_short, slotting_rw_hvcre, slotting_rw_hvcre_short
# (B31 adds slotting_rw_preop)
Equity RW Lookup¶
There is no standalone lookup_equity_rw helper. Equity risk-weight values are
LookupTable entries read from the resolved rulepack (and bound in
engine/equity/calculator.py as the module-level _CRR_SA_RW / _IRB_RW maps):
from datetime import date
from rwa_calc.rulebook.resolve import resolve
pack = resolve("crr", date(2026, 1, 1))
sa_rw = pack.lookup("equity_sa_risk_weights") # e.g. listed -> 1.00 (100%)
irb_rw = pack.lookup("equity_irb_simple_risk_weights") # e.g. listed -> 2.90 (290%)