SA-CCR — Counterparty Credit Risk¶
Specifications for the Standardised Approach for Counterparty Credit Risk (SA-CCR), the regulatory method for translating OTC derivatives and long-settlement transactions into a single exposure-at-default (EAD) figure that then feeds the SA / IRB credit-risk exposure ladder.
SFTs use FCCM, not SA-CCR
Securities financing transactions (SFTs) — repos, securities lending,
margin lending — are not priced by SA-CCR. CRR Art. 271(2) routes SFT
EAD through the Financial Collateral Comprehensive Method (FCCM)
(Art. 220–223), a peer subsystem implemented in engine/sft/ and the
sft_fccm pipeline stage. See the
SFT (FCCM EAD) specification.
Primary regulatory source: PRA PS1/26 Part Three Title II Chapter 6 (Art. 271–311) — the UK SA-CCR regime is largely a verbatim re-export of the onshored CRR text with the Basel 3.1 alpha (1.4) and supervisory-factor calibration retained. References on each child page follow the PRA-priority convention: PRA Art. numbers first, BCBS CRE codes as a secondary cross-reference.
Engine entry point: src/rwa_calc/engine/ccr/pipeline_adapter.py::ccr_rows_to_exposures
— shapes SA-CCR netting-set EADs into synthetic exposure rows compatible with
RAW_EXPOSURE_SCHEMA, so the downstream Classifier / CRM / SA Calculator
chain consumes a CCR row identically to an on-balance-sheet loan.
Pipeline shape¶
SA-CCR is a strictly ordered chain. Each stage consumes the prior stage's
LazyFrame and emits a new one — there are no back-edges. The orchestrator at
engine/ccr/pipeline_adapter.py::ccr_rows_to_exposures chains the per-trade
stages over the legally-enforceable trades in a RawCCRBundle, then aggregates
to one synthetic exposure row per netting set:
ccr_rows_to_exposures(raw_ccr, config_ccr, reporting_date)
│
├─ 1. Adjusted notional (Art. 279b)
│ ├─ compute_adjusted_notional_ir (Art. 279b(1)(a))
│ ├─ compute_adjusted_notional_fx (Art. 279b(1)(b)) [if fx_rates supplied]
│ ├─ compute_adjusted_notional_credit (Art. 279b(1)(a)) [placeholder]
│ ├─ compute_adjusted_notional_equity (Art. 279b(1)(c)) [placeholder]
│ └─ compute_adjusted_notional_commodity (Art. 279b(1)(c)) [placeholder]
│
├─ 2. Supervisory delta (Art. 279a)
│ └─ compute_supervisory_delta_option (±1 linear / Black-Scholes Φ(d1) for options)
│
├─ 3. Maturity factor (Art. 279c unmargined, Art. 285 margined)
│ └─ compute_maturity_factor_unmargined (margined branch pending)
│
├─ 4. Hedging-set partition (Art. 277, 277a)
│ └─ assign_hedging_set (IR per currency / maturity bucket,
│ FX per currency pair, credit/equity per ref,
│ commodity per type)
│
├─ 5. Asset-class add-on (Art. 277a(2)–(3))
│ └─ compute_addon_per_asset_class (SF · |D_HS|, per HS then per NS)
│
├─ 6. Replacement cost (RC) (Art. 275)
│ └─ unmargined: RC = max(V − C, 0) (margined RC pending)
│
├─ 7. PFE multiplier + add-on (Art. 278)
│ └─ compute_pfe (mult = min(1, 0.05 + 0.95·exp((V−C)/(2·AddOn))))
│
└─ 8. EAD (Art. 274(2))
└─ EAD = α · (RC + PFE), α = 1.4
The resulting per-netting-set EAD is written to drawn_amount on a synthetic
exposure row with risk_type = "CCR_DERIVATIVE", ccr_method = "sa_ccr" and
source_netting_set_id for downstream reconciliation. From that point on the
row is treated as any other unsecured exposure — Classifier resolves the
counterparty class, the SA calculator looks up the risk weight from
Art. 112–134, and the aggregator rolls the resulting
RWA into the firm-level totals.
Specification index¶
| Page | Topic | Regulatory reference | Status |
|---|---|---|---|
| Adjusted notional | Per-asset-class notional adjustments (d); IR supervisory duration; FX leg conversion at spot |
Art. 279b | Live (IR + FX) |
| FX treatment | Two-leg trade schema, FX hedging set, asset-class add-on, CCR-A2 worked example | Art. 277(3)(a), 279b(1)(b), 277a(2) | Live |
| Supervisory delta | Linear ±1 delta for forwards/swaps; Black-Scholes Φ(d1) for options; CDO tranche attachment-point delta | Art. 279a(1)–(3) | Live (IR + FX) |
| Maturity factor | Unmargined MF = √(min(M, 1)); margined MF with MPOR + remargining frequency | Art. 279c, 285 | Live |
| Hedging sets | Per-asset-class hedging-set partition rules and intra/cross-HS correlation (ρ) | Art. 277, 277a | Live (IR + FX) |
rc-calculation.md |
Unmargined RC = max(V − C, 0); margined RC = max(V − C, TH + MTA − NICA, 0) |
Art. 275 | Pending |
pfe-multiplier.md |
PFE add-on aggregation and the multiplier min(1, 0.05 + 0.95·exp((V−C)/(2·AddOn))) |
Art. 278 | Pending |
ead-composition.md |
EAD = α·(RC + PFE) with α = 1.4; SA-CCR → unified exposure ladder via pipeline_adapter |
Art. 274 | Pending |
| Legal enforceability | Netting-set recognition gate; single-trade synthetic-NS fallback for non-enforceable agreements | Art. 272(4), 295–297 | Live |
| Wrong-way risk | Specific WWR (legal connection ⇒ LGD = 100% override); general WWR α multiplier | Art. 291 | Live (IR + FX) |
| CCP exposures | QCCP 2% trade-leg RW; default-fund contribution treatment; non-QCCP fallback | Art. 306–311 | Live |
| Failed trades | Unsettled DvP transactions and free deliveries; multiplier ladder by business-day delay | Art. 378–380 | Live |
The "Pending" pages will land as the SA-CCR engine batches P8.35–P8.38
(credit / equity / commodity add-ons, margined RC, WWR, CCP, failed-trade
ladder) ship — see the project root IMPLEMENTATION_PLAN.md for the
ordering. Each page, when written, mirrors the structure of the existing
adjusted-notional and fx-treatment
pages: regulatory citation, formula, engine entry point, pipeline ordering
note, and a worked acceptance scenario.
Asset-class coverage¶
SA-CCR partitions every trade into one of five asset classes (Art. 277(1));
each has its own supervisory factor, hedging-set rule and add-on aggregator.
The engine ships the IR + FX branches; the remaining three classes carry
placeholder no-op functions in engine/ccr/adjusted_notional.py and emit
null adjusted_notional until the engine batches P8.35–P8.38 land.
| Asset class | Hedging-set rule | Supervisory factor (Art. 280 Table 1) | Status |
|---|---|---|---|
| Interest rate | Per currency, with maturity sub-buckets (< 1y / 1–5y / > 5y) per Art. 277(2) | 0.5% (IRS / FRA) | Documented |
| FX | Per currency pair (order-independent) per Art. 277(3)(a); no maturity sub-buckets | 4.0% | Documented |
| Credit | Per single name / index reference per Art. 277(3)(b); cross-HS ρ = 0.5 | 0.38% (IG single name) – 4.7% (sub-IG / index) | Pending engine batch P8.35–P8.38 |
| Equity | Per single name / index reference per Art. 277(3)(c); cross-HS ρ = 0.5 | 32% (single name) / 20% (index) | Pending engine batch P8.35–P8.38 |
| Commodity | Per commodity type (energy / metals / agriculture / climate / other) per Art. 277(3)(d); cross-HS ρ = 0.4 | 4% (electricity) – 18% (electricity, sub-types) | Pending engine batch P8.35–P8.38 |
Citation note: the supervisory factors above are illustrative orders-of-magnitude. The authoritative per-row values live in the regulatory table at PRA PS1/26 Art. 280 Table 1 and will be reproduced verbatim on
hedging-sets.mdwhen that page lands.
Scenario coverage — CCR-A¶
SA-CCR scenarios use the CCR-A prefix, matching the CRR-* / B31-*
convention documented on the specifications index.
The table below is a placeholder roadmap — to be finalised as scenarios
are implemented in the engine batches P8.35–P8.38 and earlier. Scenario
IDs that are already shipped link to the corresponding acceptance test;
unshipped IDs are reserved.
| Scenario | Description | Primary citation | Status |
|---|---|---|---|
| CCR-A1 | Unmargined single-trade netting set (IR swap) — baseline RC = 0, PFE = α·SF·d·MF | Art. 274–278 | Shipped (tests/acceptance/ccr/test_ccr_a1_unmargined_ir_swap.py) |
| CCR-A2 | Unmargined single-trade netting set (FX forward) — FX hedging-set, spot conversion | Art. 277(3)(a), 279b(1)(b) | Shipped (tests/acceptance/ccr/test_ccr_a2_unmargined_fx_forward.py) |
| CCR-A3 | Margined netting set with IM / VM, MPOR scaling, threshold + MTA in RC | Art. 275(2), 285 | Placeholder |
| CCR-A4 | Multi-trade netting set with IR maturity-bucket aggregation (< 1y, 1–5y, > 5y) |
Art. 277(2), 277a(1) | Placeholder |
| CCR-A5 | Non-enforceable netting fallback — each trade in its own synthetic single-trade NS | Art. 272(4) | Placeholder |
| CCR-A6 | Option supervisory delta — Black-Scholes Φ(d1) for puts and calls | Art. 279a(2) | Placeholder |
| CCR-A7 | CDO tranche supervisory delta — attachment / detachment point adjustment | Art. 279a(3) | Placeholder |
| CCR-A8 | QCCP trade-leg exposure — 2% risk weight | Art. 306 | Placeholder |
| CCR-A9 | Non-QCCP fallback — bilateral treatment of CCP exposure | Art. 306(4) | Placeholder |
| CCR-A10 | Specific WWR override — LGD = 100% on the WWR sub-portfolio (synthetic single-trade NS) | Art. 291(4)–(5) | Placeholder |
| CCR-A11 | Failed-trade ladder — DvP unsettled transactions, business-day delay multipliers | Art. 378–380 | Placeholder |
Placeholder — to be finalised
Scenarios CCR-A3 through CCR-A11 are reserved IDs only. Names, one-line descriptions and citations will be confirmed when the matching acceptance tests are committed; expect minor renumbering if a new scenario is interleaved. Operators should not cite the placeholder rows as evidence of implemented behaviour — the specifications index remains the source of truth for shipped scenarios.
Cross-references¶
- Specifications index — full list of CRR / Basel 3.1 / CCR scenario prefixes and per-spec regulatory references.
- Overview — project overview with the SA-CCR pipeline positioned in the broader RWA calculation.
- SA risk weights (CRR) — risk-weight lookup the
CCR EAD flows through downstream of
pipeline_adapter.py. - Adjusted notional — per-asset-class
dformula and the IR + FX worked-through reference. - FX treatment — end-to-end CCR-A2 worked example showing the full chain from input row to RWA.
References¶
- PRA PS1/26 Part Three Title II Chapter 6 (Art. 271–311) — UK SA-CCR regime; primary regulatory source for every page in this directory.
- BCBS CRE52 — underlying methodology and Basel-level calibration of supervisory factors, correlations and the α = 1.4 scalar.
src/rwa_calc/engine/ccr/pipeline_adapter.py— orchestrator that chains the per-trade SA-CCR stages and emits the netting-set-grain synthetic exposure rows.