Skip to content

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}.py as cited entries (ScalarParam / LookupTable / BandedTable / DecisionTable / Feature), read through rwa_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%

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%)

Next Steps