Regulatory Tables¶
This page documents the lookup tables used for regulatory risk weight assignment, CCF, supervisory haircuts, LGD, and slotting.
Source of truth: All table implementations are in
src/rwa_calc/data/tables/.
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 data/tables/crr_risk_weights.py
Institution Risk Weights (CRR Art. 120–121)¶
| CQS | UK CRR (ECRA) | Standard CRR |
|---|---|---|
| 1 | 20% | 20% |
| 2 | 30% | 50% |
| 3 | 50% | 50% |
| 4 | 100% | 100% |
| 5 | 100% | 100% |
| 6 | 150% | 150% |
| Unrated | 40% | 40% |
The UK CRR deviates from the standard EU CRR at CQS 2 (30% vs 50%).
Basel 3.1 SCRA (for unrated institutions, CRE20.16-21):
| Grade | Risk Weight |
|---|---|
| A | 40% |
| B | 75% |
| C | 150% |
Source: INSTITUTION_RISK_WEIGHTS_UK, B31_SCRA_RISK_WEIGHTS in data/tables/
Corporate Risk Weights (CRR Art. 122)¶
| CQS | CRR | Basel 3.1 |
|---|---|---|
| 1 | 20% | 20% |
| 2 | 50% | 50% |
| 3 | 100% | 75% |
| 4 | 100% | 100% |
| 5 | 150% | 100% |
| 6 | 150% | 150% |
| Unrated | 100% | 100% |
Basel 3.1 corporate additions:
| Category | Risk Weight | Reference |
|---|---|---|
| Investment grade | 65% | CRE20.47 |
| SME corporate | 85% | CRE20.49 |
| Subordinated debt | 150% | CRE20.50 |
Source: CORPORATE_RISK_WEIGHTS, B31_CORPORATE_RISK_WEIGHTS, B31_CORPORATE_INVESTMENT_GRADE_RW, B31_CORPORATE_SME_RW, B31_SUBORDINATED_DEBT_RW in data/tables/
Retail Risk Weights¶
| Exposure Type | CRR | Basel 3.1 |
|---|---|---|
| Retail Mortgage (LTV ≤ 80%) | 35% | LTV-based (see below) |
| Retail QRRE | 75% | 75% |
| Retail Other | 75% | 75% |
Source: RETAIL_RISK_WEIGHT in data/tables/crr_risk_weights.py
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 data/tables/crr_risk_weights.py
CRR Commercial Real Estate (CRR Art. 126)¶
| Condition | Risk Weight |
|---|---|
| LTV ≤ 50% with income cover | 50% |
| All other | 100% |
Source: COMMERCIAL_RE_PARAMS in data/tables/crr_risk_weights.py
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 data/tables/b31_risk_weights.py
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% |
Source: B31_RESIDENTIAL_INCOME_LTV_BANDS in data/tables/b31_risk_weights.py
Basel 3.1 Commercial Real Estate (CRE20.86)¶
General¶
| LTV | Risk Weight |
|---|---|
| ≤ 60% | min(60%, counterparty RW) |
| > 60% | counterparty RW |
Income-producing¶
| LTV | Risk Weight |
|---|---|
| ≤ 60% | 70% |
| 60–80% | 90% |
| > 80% | 110% |
ADC Exposures¶
| Condition | Risk Weight |
|---|---|
| ADC (standard) | 150% |
| ADC (pre-sold) | 100% |
Source: B31_COMMERCIAL_INCOME_LTV_BANDS, B31_ADC_RISK_WEIGHT, B31_ADC_PRESOLD_RISK_WEIGHT in data/tables/b31_risk_weights.py
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) | 25% | — | — | — | — |
| Equity (other) | 35% | — | — | — | — |
| Gold | 15% | — | — | — | — |
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, FX_HAIRCUT in data/tables/crr_haircuts.py
Slotting Risk Weights¶
CRR Non-HVCRE Specialised Lending (CRR Art. 153(5))¶
CRR differentiates 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 (CRR Art. 153(5) Table 2)¶
HVCRE has higher risk weights than standard specialised lending.
| 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 Operational¶
| Category | Risk Weight |
|---|---|
| Strong | 70% |
| Good | 70% |
| Satisfactory | 115% |
| Weak | 250% |
Basel 3.1 Project Finance Pre-Operational¶
| Category | Risk Weight |
|---|---|
| Strong | 80% |
| Good | 100% |
| Satisfactory | 120% |
| Weak | 350% |
Basel 3.1 HVCRE¶
| Category | Risk Weight |
|---|---|
| Strong | 95% |
| Good | 120% |
| Satisfactory | 140% |
| Weak | 250% |
Source: SLOTTING_RISK_WEIGHTS, SLOTTING_RISK_WEIGHTS_SHORT, SLOTTING_RISK_WEIGHTS_HVCRE, SLOTTING_RISK_WEIGHTS_HVCRE_SHORT in data/tables/crr_slotting.py
F-IRB Supervisory LGD (CRR Art. 161)¶
CRR Values¶
| Exposure Type | LGD |
|---|---|
| Senior unsecured | 45% |
| Subordinated | 75% |
| Secured — Financial collateral | 0% |
| Secured — Receivables | 35% |
| Secured — Residential RE | 35% |
| Secured — Commercial RE | 35% |
| Secured — Other physical | 40% |
Basel 3.1 Values (PRA PS1/26)¶
| Exposure Type | LGD | Change |
|---|---|---|
| Senior unsecured | 40% | ↓ from 45% |
| Subordinated | 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% |
Overcollateralisation Requirements¶
| Collateral Type | Min Ratio | Min Threshold |
|---|---|---|
| Financial | 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: FIRB_SUPERVISORY_LGD, BASEL31_FIRB_SUPERVISORY_LGD, FIRB_OVERCOLLATERALISATION_RATIOS in data/tables/crr_firb_lgd.py
A-IRB LGD Floors (Basel 3.1 only)¶
Under CRR, A-IRB has no LGD floors. Basel 3.1 introduces LGD floors:
| Collateral Type | LGD Floor |
|---|---|
| Unsecured senior | 25% |
| Unsecured subordinated | 50% |
| Financial collateral | 0% |
| Receivables | 10% |
| Commercial real estate | 10% |
| Residential real estate | 5% |
| Other physical | 15% |
PD Floors¶
| Exposure Class | CRR | Basel 3.1 |
|---|---|---|
| Corporate | 0.03% | 0.05% |
| Institution | 0.03% | 0.05% |
| Retail Mortgage | 0.03% | 0.05% |
| Retail QRRE (transactor) | 0.03% | 0.03% |
| Retail QRRE (revolver) | 0.03% | 0.10% |
| Retail Other | 0.03% | 0.05% |
Source: CRR_PD_FLOOR in data/tables/crr_firb_lgd.py, PDFloors in contracts/config.py
Equity Risk Weights¶
SA Equity (CRR Art. 133)¶
| Equity Type | Risk Weight |
|---|---|
| Central bank | 0% |
| Listed | 100% |
| Exchange traded | 100% |
| Government supported | 100% |
| Diversified private equity | 250% |
| Unlisted | 250% |
| Private equity | 250% |
| CIU | 250% |
| Other | 250% |
| Speculative | 400% |
IRB Simple Equity (CRR Art. 155)¶
| Equity Type | Risk Weight |
|---|---|
| Central bank | 0% |
| Government supported | 190% |
| Diversified private equity | 190% |
| Listed | 290% |
| Exchange traded | 290% |
| Unlisted | 370% |
| Private equity | 370% |
| Speculative | 370% |
| CIU | 370% |
| Other | 370% |
Note: Under Basel 3.1, IRB equity approaches are withdrawn. All equity falls to SA.
Source: SA_EQUITY_RISK_WEIGHTS, IRB_SIMPLE_EQUITY_RISK_WEIGHTS in data/tables/crr_equity_rw.py
IRB Parameters¶
Maturity Bounds¶
| Parameter | Value |
|---|---|
| PD floor (CRR) | 0.03% |
| Maturity floor | 1 year |
| Maturity cap | 5 years |
Source: CRR_PD_FLOOR, CRR_MATURITY_FLOOR, CRR_MATURITY_CAP in data/tables/crr_firb_lgd.py
API Functions¶
Risk Weight Lookup¶
from rwa_calc.data.tables.crr_risk_weights import lookup_risk_weight
rw = lookup_risk_weight(
exposure_class="corporate",
cqs=2,
use_uk_deviation=True
)
# Returns: Decimal("0.50") (50%)
Residential Mortgage RW (CRR)¶
from rwa_calc.data.tables.crr_risk_weights 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.data.tables.b31_risk_weights 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.data.tables.crr_haircuts 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¶
from rwa_calc.data.tables.crr_firb_lgd import lookup_firb_lgd
lgd = lookup_firb_lgd(
collateral_type="residential_re",
is_subordinated=False,
is_basel_3_1=False
)
# Returns: Decimal("0.35") (35% CRR) or Decimal("0.20") (20% Basel 3.1)
Slotting Lookup¶
from rwa_calc.data.tables.crr_slotting import lookup_slotting_rw
rw = lookup_slotting_rw(
category="good",
is_hvcre=False,
is_short_maturity=False
)
# Returns: Decimal("0.90") (90%)
Equity RW Lookup¶
from rwa_calc.data.tables.crr_equity_rw import lookup_equity_rw
rw = lookup_equity_rw(equity_type="listed", approach="sa")
# Returns: Decimal("1.00") (100%)
rw = lookup_equity_rw(equity_type="listed", approach="irb_simple")
# Returns: Decimal("2.90") (290%)