[!IMPORTANT] This package is still in active development and is not production ready - release 1.0.0 will confirm when ready for current CRR and 2.0.0 for Basel 3.1
UK Credit Risk (CR) & Counterparty Credit Risk (CCR) RWA Calculator
A high-performance Risk-Weighted Assets (RWA) calculator for UK CR & CCR, supporting both current regulations and future Basel 3.1 implementation. Built with Python using Polars for vectorized performance.
Documentation: https://OpenAfterHours.club/rwa_calculator/
Installation
Install with uv (recommended)
uv add rwa-calc
Or with pip
pip install rwa-calc
The web UI and REST API ship with the base package — no extra required.
Optional Dependencies
| Extra | Description |
|---|---|
dev |
Development tools (pytest, ruff, ty, zensical) |
all |
All optional dependencies |
Quick Start
from datetime import date
from rwa_calc.api import CreditRiskCalc
response = CreditRiskCalc(
data_path="/path/to/data",
framework="CRR",
reporting_date=date(2026, 12, 31),
permission_mode="irb",
).calculate()
if response.success:
print(f"Total RWA: {response.summary.total_rwa:,.0f}")
df = response.collect_results()
IRB Mode — set permission_mode="irb" and provide a model_permissions input table
to route exposures to FIRB, AIRB, or slotting based on per-model approvals. Exposures
without a matching model permission fall back to SA. See the
Data Model docs
for the model permissions schema.
Interactive UI — server-rendered web interface (calculator, results, CRR vs Basel 3.1 comparison, and legacy-engine reconciliation) plus a REST API:
uv add rwa-calc
rwa-ui
# Open http://localhost:8000 in your browser (REST API + OpenAPI at /docs)
Regulatory Scope
This calculator supports two regulatory regimes:
| Regime | Effective Period | UK Implementation | Status |
|---|---|---|---|
| CRR (Basel 3.0) | Until 31 December 2026 | UK CRR (EU 575/2013 as onshored) | Active |
| Basel 3.1 | From 1 January 2027 | PRA PS1/26 | Implemented |
A configuration toggle allows switching between calculation modes for:
- Current regulatory reporting under UK CRR
- Impact analysis and parallel running ahead of Basel 3.1 go-live
- Seamless transition when Basel 3.1 becomes effective
Migrating from an Existing Calculator
The hardest part of adopting a new credit-risk engine is not installing it — it is signing off that the new numbers are correct on your own book. Parallel-run reconciliation operationalises that discipline: run this calculator and your existing/legacy calculator on the same portfolio, then reconcile the two outputs component by component (exposure class, approach, CCF, EAD, PD, LGD, risk weight, RWA, …).
Every exposure is bucketed as an exact match, a within-tolerance difference, a break, or missing on one side — with our engine's reason and input drivers attached so each break can be traced to either a data / mapping issue or an engine difference.
from datetime import date
from rwa_calc.api import CreditRiskCalc
calc = CreditRiskCalc(
data_path="/path/to/data",
framework="CRR",
reporting_date=date(2026, 12, 31),
permission_mode="standardised",
)
# Map your legacy output columns onto our components in a small TOML file
response = calc.reconcile("reconciliation.toml")
print(response.collect_totals_tie_out()) # does it tie out?
print(response.collect_summary_by_component()) # which components agree
breaks = response.collect_breaks_detail() # the break worklist, largest first
response.to_excel("reconciliation.xlsx") # full report, one sheet per view
You can also run it without writing Python from the Reconciliation page in the web UI
(rwa-ui, then open http://localhost:8000/reconciliation) or over HTTP via
POST /api/reconcile. This is distinct from Framework Comparison (CRR vs Basel 3.1 on the
same engine) — here the other side is your external, legacy output.
Details: See the Parallel-Run Reconciliation guide.
Key Features
- Dual-Framework Support: Single codebase for CRR and Basel 3.1 with UK-specific deviations
- High Performance: Polars LazyFrames for vectorized calculations (50-100x improvement over row iteration)
- Complete Coverage: Standardised (SA), IRB (F-IRB & A-IRB), and Slotting approaches
- Credit Risk Mitigation: Collateral, guarantees, and provisions with RWA-optimized allocation
- Complex Hierarchies: Multi-level counterparty and facility hierarchy support
- Audit Trail: Full calculation transparency for regulatory review
- Framework Comparison: Side-by-side CRR vs Basel 3.1 impact analysis
- Parallel-Run Reconciliation: Tie this calculator out against your existing/legacy engine component-by-component (EAD, RWA, risk weight, PD, LGD, …) to sign off a migration with confidence
- COREP Output: Export results to COREP regulatory templates
- Multiple Export Formats: Parquet, CSV, Excel, and COREP
Supported Approaches
| Approach | Description |
|---|---|
| Standardised (SA) | Risk weights based on external ratings and exposure characteristics |
| Foundation IRB (F-IRB) | Bank-estimated PD, supervisory LGD |
| Advanced IRB (A-IRB) | Bank-estimated PD, LGD, and EAD |
| Slotting | Category-based approach for specialised lending |
Supported Exposure Classes
Sovereign / Central Bank, Institution, Corporate, Corporate SME, PSE, MDB, RGLA, Retail Mortgage, Retail QRRE, Retail Other, Specialised Lending, Equity, Covered Bond, Residential Mortgage, Commercial Mortgage (Basel 3.1 RE split), High Risk, Defaulted, Other
Documentation
Comprehensive documentation is available at OpenAfterHours.club/rwa_calculator
| Section | Description |
|---|---|
| Getting Started | Installation and first calculation |
| User Guide | Regulatory frameworks, methodology, exposure classes |
| Reconciliation | Parallel-run tie-out against a legacy calculator for migration |
| Architecture | System design and pipeline |
| Data Model | Input schemas and validation |
| API Reference | Complete technical documentation |
| Development | Testing, benchmarks, contributing |
| Plans | Development roadmap and status |
Running Tests
Test fixtures are parquet files generated from Python builders and are not checked into the repo (they are gitignored). Generate them once before running the test suite for the first time, and again whenever a fixture builder under tests/fixtures/ changes:
# Generate all test fixtures (parquet output, 8 groups)
uv run python tests/fixtures/generate_all.py
# Run all tests
uv run pytest -v
# Run with coverage
uv run pytest --cov=src/rwa_calc
# Run benchmarks (10K + 100K, excludes 1M/10M)
uv run pytest tests/benchmarks/ -m "benchmark and not slow" -k "not 1m" -o "addopts=" --benchmark-only -v
Test Results: ~5,500 tests (~4,675 unit + ~500 acceptance + ~165 contract + ~145 integration + ~30 benchmark)
License
References
Current Regulations (CRR / Basel 3.0)
Basel 3.1 Implementation (January 2027)
Release files for rwa-calc 0.3.34
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rwa_calc-0.3.34.tar.gz | 7.1 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rwa_calc-0.3.34-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 8.9 MB
Release files / rwa_calc-0.3.34.tar.gz
| Download URL | rwa_calc-0.3.34.tar.gz |
|---|---|
| Size | 7.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bb8ecfe671b84c69e2370cb07860ce0c6a80ab0c38cc7a8518e58ac0b5e442cc
|
|
BLAKE2b-256 checksum How to use checksums |
635ce68ee555241dcf53002384671d0c1816966791e776b52f69f8c092b35060
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / rwa_calc-0.3.34-py3-none-any.whl
| Download URL | rwa_calc-0.3.34-py3-none-any.whl |
|---|---|
| Size | 1.8 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2f344f9aaae7f7033d785a8ffcbe717a3c76c5f365874d2bee4b3aabb04e3d7b
|
|
BLAKE2b-256 checksum How to use checksums |
e0ede6d4bd36c9f73179156dacc0ff699046d19a336b636aa64e48c30f0b0750
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency log