SA-CCR — Central counterparty (CCP) trade exposures (Art. 306–307)¶
The Counterparty Credit Risk (CRR) Part Section 9 sits outside the
SA-CCR EAD chain (Art. 274 et seq.) — it does not change how exposure
value is computed, it changes what risk weight that exposure attracts.
Once SA-CCR has produced a netting-set EAD (α · (RC + PFE), Art.
274(2)), the QCCP route bypasses the standard SA / IRB risk-weight
ladder and applies one of two regulatorily-pinned weights:
- 2% for a clearing member's own (proprietary) trade exposures to a qualifying CCP, and for trades a clearing member intermediates on behalf of a client when the Art. 305(2) conditions are met (the client itself also enjoys the 2% RW on its leg) — PRA PS1/26 Art. 306(1)(a)–(b);
- 4% for trades a clearing member intermediates on behalf of a client when the Art. 305(2) conditions are not met — PRA PS1/26 Art. 306(1)(c).
Non-qualifying CCP (non-QCCP) trade exposures fall back to the standard SA-CCR EAD and the ordinary SA institution risk-weight (Art. 121, or the corresponding Basel 3.1 ECRA / SCRA bucket) per Art. 107(2)(a).
This page documents:
- the Art. 306 trade-exposure risk-weight ladder (2% / 4% / non-QCCP fallback) and the Art. 305(2)(a)–(c) condition list for the client-clearing 2% leg;
- the Art. 307 default-fund-contribution stack and its current engine status (placeholder pending);
- the engine entry point (
apply_ccp_risk_weight) and its position immediately downstream of the SA-CCR EAD producer; - the non-QCCP fallback to standard SA-CCR with SA risk-weighting;
- three worked examples — direct-cleared QCCP, client-cleared QCCP with and without Art. 305(2) compliance, and a non-QCCP fallback.
Regulatory citation¶
Primary source: PRA Rulebook — Counterparty Credit Risk (CRR) Part, Section 9 "Own funds requirements for exposures to a central counterparty" (Articles 301–311). PS1/26 Appendix 1 (effective 1 January 2027) restates Section 9 with only Art. 306(4) / Art. 308(3) / Art. 309(2) explicitly re-stated — paragraphs 1–3 of Art. 306 (and Articles 301–305, 307) carry forward from the pre-revocation CRR text via the standard "[Note: This rule corresponds to Article X of CRR as it applied immediately before revocation by the Treasury]" provenance footer.
| Sub-article | Coverage | BCBS cross-reference |
|---|---|---|
| Art. 272 Def (88) | Definition of qualifying central counterparty (QCCP) | CRE50.6 |
| Art. 305(2)(a)–(c) | Conditions a client must satisfy to attract the 2% RW (rather than 4%) on its client-cleared leg: segregation, portability, no transmission of losses | CRE54.18 |
| Art. 306(1)(a) | 2% RW on a clearing member's own trade exposures to a QCCP | CRE54.14 |
| Art. 306(1)(b) | 2% RW on a clearing member's trade exposure to a client when intermediating on behalf of that client (Art. 305(2) satisfied) | CRE54.14 |
| Art. 306(1)(c) | 4% RW on a clearing member's trade exposure to a client when Art. 305(2) is not satisfied | CRE54.15 |
| Art. 306(4) | RWA = Σ EAD_trade × RW — PS1/26 verbatim restated to point at the Required Level of Own Funds (CRR) Part Art. 92(3) |
CRE54.16 |
| Art. 307 | Own funds requirements for default-fund contributions to a CCP — engine-pending (see below) | CRE54.21 |
| Art. 308(3) | RWA = own-funds requirement × 12.5 for pre-funded default-fund contributions to a QCCP | CRE54.22 |
| Art. 309(2) | RWA = own-funds requirement × 12.5 for default-fund contributions / unfunded contributions to a non-QCCP | CRE54.27 |
| Art. 107(2)(a) | Non-QCCP fallback — exposures classified as institution exposures and weighted per the SA institution ladder | CRE20.14 |
Verbatim text — PRA PS1/26 Art. 306(4)¶
"An institution shall calculate the risk-weighted exposure amounts for its trade exposures with CCPs for the purposes of Article 92(3) [of] Required Level of Own Funds (CRR) Part Article 92 as the sum of the exposure values of its trade exposures with CCPs, calculated in accordance with paragraphs 2 and 3, multiplied by the risk weight determined in accordance with paragraph 1."
— PS1/26 Appendix 1, Counterparty Credit Risk (CRR) Part, Article 306(4), p. 457 (source PDF:
docs/assets/ps126app1.pdf).
Carried-forward paragraphs (Art. 306(1)–(3) and Art. 305(2))¶
PS1/26 elides paragraphs 1–3 of Art. 306 (and Article 305 in its entirety) with the standard "…" continuation marker and the provenance footer ("[Note: This rule corresponds to Article 306 of CRR as it applied immediately before revocation by the Treasury]"). The substantive content carries forward from the pre-revocation CRR text:
- Art. 306(1)(a) — 2% on a clearing member's own trade exposures to a QCCP (the proprietary leg).
- Art. 306(1)(b) — 2% on the clearing member's trade exposure to a client where the clearing member acts as a financial intermediary between the client and the QCCP, provided the conditions in Art. 305(2) are met.
- Art. 306(1)(c) — 4% on the clearing member's trade exposure to a client where the clearing member acts as a financial intermediary between the client and the QCCP and the conditions in Art. 305(2) are not met.
Art. 305(2) — client-clearing condition list¶
A client of a clearing member receives the 2% RW (rather than 4%) on its client-cleared QCCP trade legs only when all of the following conditions are satisfied:
| Condition | Substance |
|---|---|
| Art. 305(2)(a) | Default portability: if the clearing member defaults or becomes insolvent, the trades and any associated collateral are transferable to another clearing member within the margin period of risk — the client does not lose its hedge. |
| Art. 305(2)(b) | Segregation: the client's positions and collateral with the CCP are identified and segregated, both at the clearing member's books and at the CCP, from those of the clearing member and from those of other clients. |
| Art. 305(2)(c) | Operational, legal and bankruptcy-remote arrangements: the arrangements between the client, the clearing member, the CCP and any insolvency administrator are operationally and legally robust, so that the segregation and portability protections in (a) and (b) actually take effect under all foreseeable scenarios (a legal opinion is normally required). |
Failing any one of the three conditions demotes the client-cleared
leg from 2% (Art. 306(1)(b)) to 4% (Art. 306(1)(c)). The engine
expresses this as a single Boolean (is_client_cleared); the
firm-level legal review that produces that Boolean must verify all of
(a)–(c) before flagging the trade with the 2% leg. See the worked
example below for a comparison of the two outcomes on the same
notional.
Engine entry point¶
The trade-exposure RW assignment is implemented as a one-shot annotation step that runs after the SA-CCR EAD producer and before the downstream SA / IRB risk-weight lookup:
_QCCP_PACK = resolve("crr", date(2026, 1, 1))
_QCCP_PROPRIETARY_RW = scalar_value(_QCCP_PACK.scalar_param("qccp_proprietary_rw"))
_QCCP_CLIENT_CLEARED_RW = scalar_value(_QCCP_PACK.scalar_param("qccp_client_cleared_rw"))
@cites("CRR Art. 306")
def apply_ccp_risk_weight(
exposures: pl.LazyFrame,
counterparties: pl.LazyFrame,
trades: pl.LazyFrame,
) -> pl.LazyFrame:
"""Annotate ``risk_weight`` for QCCP trade exposures per CRR Art. 306(1).
The function joins the QCCP flag from ``counterparties`` and the
client-cleared flag from ``trades`` onto ``exposures`` and writes a
new ``risk_weight`` column with the regulatory trade-exposure weight:
is_qccp=True, is_client_cleared=False -> 0.02 (Art. 306(1)(a))
is_qccp=True, is_client_cleared=True -> 0.04 (Art. 306(1)(c))
is_qccp=False -> NULL (pass-through to SA)
The non-QCCP NULL pass-through is intentional: the 20% SA-institution
weight for CQS-1 is applied by the downstream classifier (P8.30),
not here. Signalling pass-through via NULL keeps the routing layer
able to detect which rows have already had a regulatory weight set.
Load-bearing invariant: ``ead_ccr`` is never mutated by this function.
EAD is produced upstream by SA-CCR (Art. 274) and must be identical
across all three CCR-B1 variants (proprietary, client-cleared,
non-QCCP).
Args:
exposures: LazyFrame carrying ``ead_ccr``. Other columns pass
through unchanged.
counterparties: LazyFrame carrying the ``is_qccp`` Boolean flag
(CRR Art. 272 Def (88)).
trades: LazyFrame carrying the ``is_client_cleared`` Boolean
flag (CRR Art. 306(1)(c) client-cleared trade relationship).
Returns:
LazyFrame with the input ``exposures`` columns plus a new
``risk_weight: Float64`` column. ``ead_ccr`` is unchanged.
References:
- CRR Art. 306(1)(a), 306(1)(c), 306(4); CRR Art. 107(2)(a).
- BCBS CRE54.14 (2% proprietary), CRE54.15 (4% client-cleared).
"""
# Reduce counterparties / trades to the single flag column each carries
# for the QCCP branching decision. We broadcast via cross-join because
# the test-level ``exposures`` frame is keyless (a single ``ead_ccr``
# column) and the fixture is single-row per side; in production code
# the caller would key the joins on counterparty/trade identifiers.
cp_flag = counterparties.select(pl.col("is_qccp").fill_null(False).alias("is_qccp"))
trade_flag = trades.select(
pl.col("is_client_cleared").fill_null(False).alias("is_client_cleared")
)
joined = exposures.join(cp_flag, how="cross").join(trade_flag, how="cross")
proprietary_rw = _QCCP_PROPRIETARY_RW
client_cleared_rw = _QCCP_CLIENT_CLEARED_RW
return joined.with_columns(
pl.when(pl.col("is_qccp") & pl.col("is_client_cleared"))
.then(pl.lit(client_cleared_rw))
.when(pl.col("is_qccp") & ~pl.col("is_client_cleared"))
Source: src/rwa_calc/engine/ccr/ccp.py::apply_ccp_risk_weight.
Inputs (netting-set / counterparty / trade grain)¶
| Column | Frame | Dtype | Source | Article |
|---|---|---|---|---|
ead_ccr |
exposures |
Float64 |
compute_ead (Art. 274(2)) |
Art. 274(2) |
is_qccp |
counterparties |
Boolean |
CCR counterparty schema | Art. 272 Def (88) |
is_client_cleared |
trades |
Boolean |
CCR trade schema | Art. 305(2) outcome flag |
Outputs (exposure grain)¶
| Column | Dtype | Formula | Article |
|---|---|---|---|
risk_weight |
Float64 |
0.02 if is_qccp & ¬is_client_cleared; 0.04 if is_qccp & is_client_cleared; NULL otherwise |
Art. 306(1)(a)–(c) |
ead_ccr |
Float64 |
unchanged (load-bearing invariant — RW assignment never mutates EAD) | Art. 274(2) |
Regulatory scalars — rulebook common pack¶
The two pinned QCCP risk weights are cited pack params
(qccp_proprietary_rw, qccp_client_cleared_rw) in
src/rwa_calc/rulebook/packs/common.py, resolved in
engine/ccr/ccp.py via _QCCP_PACK.scalar_param(...) — the engine
never literalises them:
qccp_proprietary_rw = 0.02 # Art. 306(1)(a) / CRE54.14
qccp_client_cleared_rw = 0.04 # Art. 306(1)(c) / CRE54.15
The 2% client-cleared leg under Art. 306(1)(b) re-uses the
qccp_proprietary_rw = 0.02 param — Art. 305(2) compliance does not
discount the regulatory weight, it just routes the trade to the same
weight as the proprietary leg.
Non-QCCP signalling — why NULL, not 0.20¶
apply_ccp_risk_weight emits risk_weight = NULL for the non-QCCP
branch rather than literalising the SA institution weight. This is a
deliberate routing signal: the downstream Classifier (P8.30) recognises
a NULL risk_weight on a risk_type = "CCR_DERIVATIVE" row as
"no regulatory pin — apply standard SA / IRB lookup" and re-routes the
row through the ordinary SA institution ladder (Art. 121 — see
../sa-risk-weights.md) or the IRB chain when
the firm is IRB-permissioned for the counterparty.
Pipeline ordering — where the CCP gate sits¶
RawCCRBundle
→ apply_legal_enforceability_gate (Art. 272(4); see legal-enforceability.md)
→ ccr_rows_to_exposures (chains the SA-CCR pipeline)
├─ compute_adjusted_notional (Art. 279b)
├─ compute_supervisory_delta (Art. 279a)
├─ compute_maturity_factor (Art. 279c)
├─ assign_hedging_set (Art. 277, 277a)
├─ compute_addon_per_asset_class (Art. 277a(2)–(3))
├─ compute_pfe (Art. 278)
└─ compute_ead (Art. 274(2)) → ead_ccr
→ synthetic exposure row (RAW_EXPOSURE_SCHEMA shape, drawn_amount = ead_ccr)
→ apply_ccp_risk_weight (Art. 306(1)(a)–(c)) ← this page's entry point
├─ is_qccp=True, is_client_cleared=False → risk_weight = 0.02
├─ is_qccp=True, is_client_cleared=True → risk_weight = 0.04
└─ is_qccp=False → risk_weight = NULL → SA fallback
→ Classifier (resolves counterparty class on the NULL branch)
→ SA / IRB Calculators (risk-weight lookup; QCCP rows skip the lookup)
→ OutputAggregator (firm-level totals + output floor)
The QCCP path skips the standard SA / IRB risk-weight lookup — the 2% or 4% is the final, terminal regulatory weight. The output floor (Basel 3.1 Art. 92(5)) still applies: both the U-TREA and S-TREA legs treat the QCCP row identically because there is no IRB risk-weight to differ from the SA pin (the QCCP risk weight is the same on both legs, by construction).
Pending engine wiring — apply_ccp_risk_weight not yet orchestrated¶
Engine gap — orchestrator hook missing
apply_ccp_risk_weight is implemented and unit-tested
(tests/unit/ccr/test_ccp.py) but is not yet called from
engine/ccr/pipeline_adapter.py::ccr_rows_to_exposures. The
is_qccp and is_client_cleared flags exist on the CCR
counterparty and trade schemas (data/schemas.py), and the
regulatory scalars are cited pack params in the rulebook common
pack, but the synthetic
exposure row currently flows from SA-CCR EAD straight to the
Classifier without the QCCP gate. Wiring this through is the
follow-up batch P8.30; until then, every QCCP trade is
risk-weighted by the standard SA institution ladder instead of
the regulatory 2% / 4% pin. This is a conservative
mis-pricing — the SA institution weight (20% CQS-1, 50% CQS-2,
etc., per ../sa-risk-weights.md) is
higher than the QCCP 2% / 4%, so firms are over-stating
capital, not under-stating it.
Art. 307 — default-fund contributions¶
Default-fund contributions are a separate capital charge from the trade-exposure RW documented above. A clearing member that maintains a pre-funded contribution to a QCCP's default fund (the mutualised loss- absorption pool that the CCP draws on after exhausting the defaulting member's own margin and the CCP's "skin in the game") incurs an own- funds requirement under Art. 307 (computation), scaled into RWA at 12.5× under Art. 308(3) (RWA conversion). Non-QCCP default-fund contributions are weighted under Art. 309.
PS1/26 Art. 308(3) — verbatim¶
"An institution shall calculate the risk-weighted exposure amounts for exposures arising from that institution's pre-funded contribution to the default fund of a QCCP for the purposes of Article 92(3) [of] Required Level of Own Funds (CRR) Part Article 92 as the own funds requirement, calculated in accordance with paragraph 2 of this Article, multiplied by 12.5."
— PS1/26 Appendix 1, Counterparty Credit Risk (CRR) Part, Article 308(3), p. 457 (source PDF:
docs/assets/ps126app1.pdf).
PS1/26 Art. 309(2) — verbatim (non-QCCP default fund)¶
"An institution shall calculate the risk-weighted exposure amounts for exposures arising from that institution's contribution to the default fund of a non-qualifying CCP for the purposes of Article 92(3) [of] Required Level of Own Funds (CRR) Part Article 92 as the own funds requirement, calculated in accordance with paragraph 1 of this Article, multiplied by 12.5."
— PS1/26 Appendix 1, Counterparty Credit Risk (CRR) Part, Article 309(2), p. 457 (source PDF:
docs/assets/ps126app1.pdf).
Engine status — default fund contributions not yet implemented¶
Engine gap — Art. 307 not implemented
The Art. 307 own-funds-requirement formula (the "K_CM" stack
that allocates a portion of the CCP's hypothetical capital
requirement K_CCP to each clearing member by pre-funded
contribution share) is not implemented in
src/rwa_calc/engine/ccr/ccp.py. The module covers only the
Art. 306 trade-exposure RW. Articles 307 / 308(3) / 309(2) are
deferred to a follow-up batch; until then, a clearing member
must compute its default-fund-contribution RWA off-system and
fold the result into the aggregator's manual_addon channel
(or report-only adjustment).
The default-fund-contribution stack is not on the SA-CCR EAD chain — it
sits on a separate input (the firm's pre-funded contribution amount and
the CCP-published K_CCP / DF_CM figures) and produces an own-funds
requirement directly. The 12.5× RWA conversion in Art. 308(3) is the
standard inverse of the 8% capital ratio — no SA-CCR EAD is involved.
Non-QCCP fallback to standard SA-CCR¶
When the counterparty's is_qccp flag is False, the SA-CCR EAD
(α · (RC + PFE), Art. 274(2)) is preserved unchanged, the
apply_ccp_risk_weight annotator returns risk_weight = NULL, and
the synthetic exposure row falls back to the standard SA / IRB
risk-weight ladder via the Classifier:
| Framework | Counterparty class | Risk weight ladder | Reference |
|---|---|---|---|
| CRR | Institutions (Art. 107(2)(a)) | CQS-1 → 20%, CQS-2 → 50%, CQS-3 → 50%, CQS-4/5 → 100%, CQS-6 → 150% (Art. 121) | ../sa-risk-weights.md |
| Basel 3.1 (PS1/26) | Institutions (Art. 121 Bucket A/B/C) | ECRA-rated: A → 20%, B → 30%/40% by short/long-term; SCRA: A → 40%, B → 75%, C → 150% | ../sa-risk-weights.md |
The non-QCCP fallback does not amend the SA-CCR EAD — α = 1.4
still applies, the multiplier and add-on aggregation are unchanged.
What changes is only the downstream risk-weight lookup: instead of the
2% / 4% Art. 306 pin, the row is weighted as an ordinary institution
exposure. Under Basel 3.1, the same row also enters both legs of the
output floor (U-TREA and S-TREA) per ../basel31/output-floor.md.
Worked numeric examples¶
All three examples re-use a CCR-A1-style unmargined IR-swap netting
set that produces ead_ccr = 5,480,017.52 (see
pfe-multiplier.md for
the EAD derivation). The trade-exposure path then diverges based on
is_qccp and is_client_cleared.
Example 1 — Direct-cleared QCCP trade (proprietary, 2%)¶
A clearing member trades for its own book against a UK-recognised QCCP
(e.g. LCH SwapClear). is_qccp = True, is_client_cleared = False.
Inputs:
ead_ccr = 5,480,017.52 (from SA-CCR per Art. 274(2))
is_qccp = True (Art. 272 Def (88))
is_client_cleared = False (proprietary leg)
apply_ccp_risk_weight branch:
is_qccp & ¬is_client_cleared → Art. 306(1)(a)
risk_weight = QCCP_PROPRIETARY_RW = 0.02
RWA (Art. 306(4)):
RWA = ead_ccr × risk_weight = 5,480,017.52 × 0.02 = 109,600.35
Example 2 — Client-cleared QCCP trade, Art. 305(2) met (2%)¶
The same clearing member intermediates the same trade on behalf of a
buy-side client. The client's collateral is segregated at the CCP,
positions are portable to a back-up clearing member on default, and a
clean Art. 305(2)(c) legal opinion is on file. is_qccp = True,
is_client_cleared = True, and the Art. 305(2) conditions are
satisfied.
Inputs:
ead_ccr = 5,480,017.52
is_qccp = True
is_client_cleared = True
Art. 305(2)(a)–(c) condition list: all three satisfied
(segregation, portability, legal robustness)
Branch outcome (Art. 306(1)(b)):
risk_weight = QCCP_PROPRIETARY_RW = 0.02 (Art. 305(2) compliance routes back to 2%)
RWA:
RWA = 5,480,017.52 × 0.02 = 109,600.35
Engine flag granularity
The engine's is_client_cleared flag is a single Boolean — it
does not separately encode "client-cleared AND Art. 305(2)
satisfied". The firm-level legal review must collapse the
three-part Art. 305(2)(a)–(c) test into the Boolean before
the row hits SA-CCR. When the legal review says "yes — all
three conditions hold", the engine routes the trade through
apply_ccp_risk_weight as if it were the proprietary leg
(re-using the QCCP_PROPRIETARY_RW = 0.02 scalar). This is a
deliberate simplification — the engine does not separately
materialise the (a)/(b)/(c) booleans. The follow-up batch P8.30
that wires apply_ccp_risk_weight into the orchestrator may
revisit this if a firm requires per-condition audit trail.
Example 3 — Client-cleared QCCP trade, Art. 305(2) NOT met (4%)¶
The same trade as Example 2, but the client's collateral arrangement
fails Art. 305(2)(b): the CCP segregates positions at the omnibus
client account level only, with no individual client identification.
Portability under Art. 305(2)(a) is therefore not legally robust
either. is_qccp = True, is_client_cleared = True, but
Art. 305(2) is not satisfied.
Inputs:
ead_ccr = 5,480,017.52
is_qccp = True
is_client_cleared = True
Art. 305(2) condition list: at least one of (a)–(c) NOT satisfied
Branch outcome (Art. 306(1)(c)):
risk_weight = QCCP_CLIENT_CLEARED_RW = 0.04 (the 305(2) penalty)
RWA:
RWA = 5,480,017.52 × 0.04 = 219,200.70
The 2% → 4% step is exactly a doubling of CCP-leg RWA — the regulator's quantitative signal that the Art. 305(2) protections materially reduce client-leg counterparty risk.
Example 4 — Non-QCCP fallback (standard SA institution RW)¶
The same trade, but the CCP is not on the PRA / FSMA-recognised QCCP
list (e.g. a non-EMIR-equivalent overseas CCP). is_qccp = False,
is_client_cleared is irrelevant on this branch.
Inputs:
ead_ccr = 5,480,017.52
is_qccp = False (Art. 272 Def (88) not satisfied)
is_client_cleared = (any) (ignored on the non-QCCP branch)
apply_ccp_risk_weight branch:
¬is_qccp → Art. 107(2)(a) (institution SA path)
risk_weight = NULL (deferred to Classifier + SA Calculator)
Downstream Classifier (P8.30):
exposure_class = "INSTITUTION" (CRR Art. 121 / B31 Art. 121 Bucket A/B)
CQS = 2 (illustrative)
risk_weight = 0.50 (CRR Art. 121 Table 3; or B31 ECRA Bucket B → 0.40)
RWA (under CRR):
RWA = 5,480,017.52 × 0.50 = 2,740,008.76
Compare with the 2% QCCP proprietary leg: the non-QCCP fallback multiplies the CCP-leg RWA by 25× under CRR (50% / 2%) and 20× under Basel 3.1 (40% / 2%). This is the structural incentive that drives clearing through QCCPs.
Pending — items documented here for forward visibility¶
| # | Gap | Article | Status |
|---|---|---|---|
| 1 | apply_ccp_risk_weight not wired into pipeline_adapter.py::ccr_rows_to_exposures. The function exists with unit-test coverage but is unreachable from the orchestrator. |
Art. 306(1)(a)–(c) | P8.30 follow-up |
| 2 | Art. 307 own-funds-requirement formula for pre-funded default-fund contributions to a QCCP — K_CCP / K_CM allocation stack — not implemented. |
Art. 307 | Engine batch deferred |
| 3 | Art. 308(3) and Art. 309(2) RWA conversion (× 12.5) — gated on (2). |
Art. 308(3), 309(2) | Engine batch deferred |
| 4 | Per-condition Art. 305(2)(a)/(b)/(c) audit-trail booleans on the trade schema (the engine currently collapses the three-part test into a single is_client_cleared flag pre-engine). |
Art. 305(2) | Tracked alongside (1); operator-driven |
The math itself is documented above for all four — the engine wiring is the follow-up.
References¶
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 306 — trade-exposure risk weights (2% / 4%); UK-onshored re-export of the pre-revocation CRR text with PS1/26 Art. 306(4) restated verbatim.
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 305(2) — client-clearing condition list (segregation, portability, legal robustness) that gates the 2% vs 4% client-leg distinction.
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 307 — own-funds requirement for default-fund contributions to a CCP (engine-pending — see "Pending" table above).
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 308(3) — RWA = own-funds-requirement × 12.5 for pre-funded default-fund contributions to a QCCP.
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 309(2) — RWA = own-funds-requirement × 12.5 for default-fund contributions to a non-QCCP.
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 272 Def (88) — definition of qualifying central counterparty.
- PRA Rulebook — Counterparty Credit Risk (CRR) Part, Article 107(2)(a) — non-QCCP exposures classified as institution exposures and weighted per the SA institution ladder.
- BCBS CRE54.14, CRE54.15, CRE54.18, CRE54.21–22, CRE54.27 — Basel-level methodology for QCCP trade-exposure weights, the client- clearing condition list, and the default-fund-contribution stack.
src/rwa_calc/engine/ccr/ccp.py— engine implementation ofapply_ccp_risk_weight(Art. 306(1)(a)–(c)).src/rwa_calc/rulebook/packs/common.py— cited pack params (qccp_proprietary_rw = 0.02,qccp_client_cleared_rw = 0.04), resolved inengine/ccr/ccp.pyvia_QCCP_PACK.scalar_param(...).src/rwa_calc/data/schemas.py— CCR schemas carrying theis_qccp(counterparty) andis_client_cleared(trade) Boolean flags.tests/unit/ccr/test_ccp.py— unit-test coverage of the 2% / 4% / NULL branching matrix.- SA risk weights (CRR) — risk-weight lookup used on the non-QCCP fallback branch (Art. 107(2)(a) institution ladder).
- EAD composition —
α · (RC + PFE)chain that producesead_ccr; QCCP rows preserve this EAD and override only the risk weight. - PFE multiplier — upstream Art. 278 stage that contributes the PFE limb of EAD.
- Replacement cost (RC) — upstream Art. 275 stage that contributes the RC limb of EAD.
- SA-CCR — CCR landing page — full SA-CCR pipeline shape with this page positioned at step 9 (post-EAD).
- Output floor (Basel 3.1) — the
QCCP row enters both
U-TREAandS-TREAidentically (the 2% / 4% pin is framework-invariant).