RBC / C-3 Capital Sufficiency Compute NAIC Risk-Based Capital including C-3 Phase 1 (interest-rate risk) and Phase 2 (variable annuity capital).
Required statutory capital determination. C-3 Phase 1 deterministic interest-rate scenarios; Phase 2 stochastic scenarios for VA guarantee capital with CTE 90 / CTE 98.
Inputs, processing, outputs
Methodology
M-050 implements the NAIC Risk-Based Capital formula for life and annuity carriers, with primary focus on the C-3 (interest-rate + market) component. The model produces five capital amounts that compose into Total RBC:
- C-0 — Asset risk (affiliated): capital charges on affiliated insurance company investments + non-insurance-affiliated subsidiaries. Factor-based per NAIC tables. Composed in
capital_engine. - C-1 — Asset risk (unaffiliated): factor-based charges on bonds (by NAIC class 1–6), preferred stock, common equity (RBC factor 30%), real estate, and alternatives. Composed in
capital_engine. - C-2 — Insurance risk: mortality (life), morbidity (health/LTC), and lapse risk charges. Factor × in-force, with prescribed mortality factors tiered by sum-insured band.
- C-3 Phase 1 (interest-rate risk on fixed-income liabilities): 7 prescribed deterministic parallel-shift interest-rate scenarios (level, +100, +200, +300, −100, −200, −300 bps; floored at 0.1%) run against fixed-annuity and other interest-sensitive liabilities via asset/liability cash-flow projection. Capital = max(C3-factor × reserve, CTE95 of scenario deficits), where the C3 factor derives from the worst-scenario accumulated deficit. Computed by
C3Phase1Engine(sourcefirmmodel/engines/c3_phase1_engine.py; registeredinsmodel.L4.c3_phase1) via_generate_prescribed_scenarios. The scenarios are deterministic parallel shifts of a flatbase_rate— there is no CIR / stochastic short-rate process in this phase, and A-050/A-051 are not consumed here (see Key Assumptions). - C-3 Phase 2 (variable annuity stochastic capital): stochastic equity scenarios run through VA guarantee liabilities (GMDB/GMWB). As of INV-011
C3Phase2Engineconsumes the calibrated GOES equity set (jump-bearing, RAT-120) via agoes_provider/equity_scenariosengine_contexthook, with the legacy constant-volatility GBM generator (_generate_equity_scenarios, equity_drift 0.08, equity_vol 0.18) retained as fallback. Capital =max(CTE(70), Standard Scenario Amount)per VM-21, where SSA =max(guarantee − 0.6·AV, 0)discounted (40% equity-drop deterministic stress). CTE90/CTE95 are computed as diagnostics only. Computed byC3Phase2Engine(sourcefirmmodel/engines/c3_phase2_engine.py; registeredinsmodel.L4.c3_phase2). It does not callstochastic_engine(the separate CIR+jump process), nor does it consume A-050/A-051. Note (scope of M-050's Output Snapshot): the M-050 RBC snapshot below is produced byCapitalEngine, whose C-3 component is the flat interest-rate factor, not the stochastic C3P2 CTE path — so the INV-011 GOES swap changes M-002's C3P2 output but leaves M-050's RBC snapshot unchanged. See the C3P2-side detail in M-002. - C-4 — Business risk: factor-based charges on premiums and reinsurance arrangements. Factor × premium.
Covariance adjustment (per capital_engine._aggregate_rbc_components): Total RBC = C0 + sqrt(C1o² + C1cs² + C2² + C3² + 0.75·2·C2·C3) + C4a. C1 and C3 are not summed inside a single square; the C2–C3 pair carries a 0.75 covariance cross-term (rbc_covariance_factor, default 0.75). Computed in capital_engine.py after the component capital amounts settle.
RBC ratio = Total Adjusted Capital (TAC) / Authorized Control Level RBC. Action levels: ratio < 200% triggers Company Action Level (file plan); < 150% Regulatory Action; < 100% Authorized Control Level; < 70% Mandatory Control Level. C-3 Phase 1 + Phase 2 amounts feed directly into the RBC denominator.
Key Assumptions and Their Justification
The five formally-bound A-NNN entries plus operational choices:
| ID | Name | Value | Derivation | Justification for RBC C-3 |
|---|---|---|---|---|
| A-001 | Base mortality table | 2017 CSO Loaded (Male/Female) | published_source | C-2 insurance-risk mortality charge derived from in-force × CSO factors. Same base table as M-001 / M-020 for consistency. |
| A-002 | Mortality improvement scale | MP-2021 (SOA) | published_source | Applied to CSO base for C-2 capital. |
| A-050 | CIR mean reversion speed (kappa) | 3-factor: [0.15, 0.30, 0.05] | data_calibrated | Bound but not consumed by any M-050 engine. Neither C3 engine uses a CIR short-rate process: C3 Phase 1 uses deterministic parallel shifts and C3 Phase 2 uses constant-vol GBM equity paths. A-050 is documented as bound-but-unconsumed pending registry remediation (gated; see Limitations §1). |
| A-051 | CIR long-run mean (theta) | 3-factor: [0.04, 0.02, 0.01] | data_calibrated | Bound but not consumed by any M-050 engine (same rationale as A-050). No CIR process drives either C-3 phase; the binding is a placeholder pending the gated CIR-driven scenario set (see Limitations §1). |
| A-080 | CTE level for capital | CTE(70) per VM-21 | published_source | CTE(70) is the actual level used. C-3 Phase 2 capital = max(CTE(70), Standard Scenario Amount) (c3_phase2_engine, cte_level default 0.70); CTE90/CTE95 are computed only as diagnostics. The registry value matches the engine — there is no CTE 90 + 25% and no CTE 98 in the code. |
Operational assumptions beyond the formal IDs:
- Scenario count for C-3 Phase 2: n_scenarios default 1,000 (the NAIC-specified minimum). The snapshot value is whatever the run config supplies; the engine default is 1,000.
- Equity index process: constant-volatility geometric Brownian motion (_generate_equity_scenarios) with fixed engine defaults equity_drift 0.08, equity_vol 0.18 — these are not DS-021-calibrated values. Jump-diffusion is not used in the C3P2 path; the separate stochastic_engine carries a CIR + jump process but C3P2 does not call it (cf. INV-011).
- Reinsurance handling: gross-of-reinsurance capital amounts produced by default; ceded capital adjustments require a separate downstream step (not in M-050 v1.0.0 scope).
- RBC factor tables: hardcoded to NAIC 2025 RBC instructions. Updates each January when NAIC publishes new factors.
Output Snapshot
Deterministic NAIC RBC run of CapitalEngine v2.0.0 — reproducible, no live firm data (python scripts/model_snapshots.py M-050 in InsModel; asserted by tests/mrm/test_gold_tier2.py::TestGoldCapital).
Input (canonical balance sheet): equity $100M · BBB corporate bonds $400M · life reserves $300M · life premiums $50M
| RBC component | value ($) | basis |
|---|---|---|
| C0 — affiliate risk | 0 | no affiliated investments |
| C1cs — equity risk | 30,000,000 | $100M equity × 30% |
| C1o — credit risk | 20,000,000 | $400M bonds × 5.0% (bonds_default factor) |
| C2 — insurance risk | 34,000,000 | $300M reserves × 10% + $50M premium × 8% |
| C3 — interest-rate risk | 15,000,000 | max($500M, $300M) × 3.0% (flat — no duration gap supplied) |
| C4a — business risk | 1,000,000 | $50M premium × 2% |
| total RBC | 59,702,640 | C0 + √(C1o² + C1cs² + C2² + C3² + 0.75·2·C2·C3) + C4a |
| available capital | 200,000,000 | (assets − reserves) × 1.0 |
| RBC ratio | 3.35× | available capital ÷ formula RBC |
The square-root covariance adjustment (with the 0.75 C2–C3 correlation) is the engine's defining mechanic — it credits diversification across independent risk charges rather than summing them, so total RBC ($59.7M) is well below the naive sum of components ($100M). The resulting 3.35× ratio indicates strong capitalization, comfortably above NAIC action levels. Note the C-3 charge here is the flat interest-rate factor; the full C-3 Phase I (deterministic) and Phase II (stochastic VA) charges are separate M-050 components and the stochastic path requires the GOES scenario set (M-120).
Captured 2026-06-04 · deterministic, no live data.
Limitations and Known Gaps
- A-050 / A-051 bound but unconsumed; richer C-3 methodology is gated for ratification. A-050 (CIR kappa) and A-051 (CIR theta) are bound to M-050 in the registry but consumed by no M-050 engine: C-3 Phase 1 uses deterministic parallel shifts and C-3 Phase 2 uses constant-vol GBM equity paths. A-080 (CTE 70) is the level the C3P2 engine actually uses, so there is no A-080 registry mismatch (the earlier "CTE 90 + 25% / CTE 98" framing did not match the code). The output-changing work — a true CIR-driven scenario set for both C-3 phases, a CTE90+25%/CTE98-style capital basis, the full prescribed-scenario stochastic path gated on GOES/M-120 (INV-010), the non-parallel C3P1 prescribed set with asset call/prepay + credit-default modeling, and either unbinding A-050/A-051 or rebinding them to a consuming engine — is tracked for ratification, not applied in this documentation pass. Update (INV-011, 2026-06-07): the NAIC/GOES ESG equity set for C3P2 is now implemented —
C3Phase2Engineconsumes the calibrated jump-bearing GOES equity set (see M-002). This does not alter M-050's RBC Output Snapshot, because that snapshot's C-3 charge isCapitalEngine's flat interest-rate factor, not the stochastic C3P2 CTE path; M-050's stochastic-C3P2-into-RBC wiring remains a separate, unimplemented step. - C-3 Phase 1 uses 7 deterministic parallel-shift scenarios, not the full non-parallel NAIC C3P1 set.
_generate_prescribed_scenariosproduces exactly 7 parallel shifts (level, ±100, ±200, ±300 bps). The full NAIC C3P1 scenario set (twist / inversion / non-parallel paths) and carrier-specific tailored scenarios are not implemented in v1.0.0 (tracked for ratification per §1). - No stand-alone C-3a (variable life) capital component. C-3a (variable life guarantees) is a 2017+ NAIC addition not yet implemented; the model covers C-3 Phase 1 (fixed-income) + C-3 Phase 2 (VA guarantees). Carriers with significant VL guarantee exposure will under-state capital here. Tracked as Phase 2 refinement.
- C-4 business risk is a factor-only computation. No stochastic operational-risk capital model (Solvency II SCR Op style); NAIC RBC permits the factor-based approach and this is the v1.0.0 scope.
- No look-through for affiliated company investments. C-0 captures affiliated-insurance investments at book value × NAIC factor. Look-through to underlying assets (per Solvency II SCR style) is deferred.
- Covariance assumption (statistical independence between C-1+C-3, C-2, C-4) is NAIC-specified but actuarially debated — equity-market stress correlates with insurance-risk realizations. The covariance offset under-states tail capital; this is a NAIC-formula limitation we inherit, not a model bug.
Validation Packet
RBC formula identity (mechanically enforced in capital_engine._aggregate_rbc_components): Total RBC = C0 + sqrt(C1o² + C1cs² + C2² + C3² + 0.75·2·C2·C3) + C4a. This matches the Output Snapshot. The covariance offset is NAIC-prescribed; the engine cannot be configured to skip it.
C-3 Phase 1 non-negative-capital invariant: the 7-scenario C3 required capital should always be ≥ 0. The engine floors the C3 factor, worst-deficit, CTE95 and CTE90 at 0.0 in _compute_c3_factor. A dedicated C3P1 invariant test file is not yet in the tree — status: pending (invariant test authoring tracked for ratification).
C-3 Phase 2 CTE monotonicity: the code computes CTE70 ≤ CTE90 ≤ CTE95 in c3_phase2_engine._compute_cte (each as the mean of a smaller, worse tail). CTE98 is never computed and there is no "CTE 90 + 25%" relation. A dedicated C3P2 monotonicity test file is not yet in the tree — status: pending (invariant test authoring tracked for ratification).
Track C cross-check (Gold Copy validation, per crosscheck_pricing_v1 contract): RBC amounts compared against goldcopy.L7.cross_check for 4 representative carrier archetypes (large-VA, fixed-income-heavy, life-heavy, mid-size-mixed); tolerance ±5% on Total RBC, ±10% on C-3 Phase 2 (higher tolerance reflects stochastic noise).
Gold test suite: frozen RBC values asserted by tests/mrm/test_gold_tier2.py::TestGoldCapital::test_gold_capital and the broader Models/tests/test_engine_golden_cases.py regression; CI-gated. These are the test surfaces that exist in the tree today.
Sensitivity packet (closes COND-001 in RAT-050-v1.0.0): see validation_evidence/M-050/v1.0.0/README.md for the full §10.5 item 5 sub-requirement map.
Peer-review (AP-26 / NAIC RBC): under Decision 028, peer-review attestation moved from 1L to 2L. The 2L technical ratification is vsdhaka/insightalm-mrm:ratifications/RAT-050-v1.0.0.yaml (decision: conditionally_approved, expires 2026-08-23). Conditions COND-001 (validation evidence) and COND-002 (change log) are satisfied by this Phase 1 PR; the closure-loop pipeline auto-drafts the supersession ratification RAT-050-v1.0.1 with decision: approved.
References
Regulatory: - NAIC Risk-Based Capital Model Act + Instructions (2025 edition) — formula, factor tables, action-level mechanics. - NAIC C-3 Phase 1 — deterministic interest-rate-risk methodology for fixed-income liabilities (implemented here as 7 parallel-shift scenarios: level, ±100, ±200, ±300 bps). - NAIC C-3 Phase 2 / AG 43 / VM-21 — stochastic capital methodology for VA guarantees; capital = max(CTE(70), Standard Scenario Amount). - Federal Reserve SR 26-2 (April 2026, supersedes SR 11-7) — Model risk management for banks (applicable via Decision 018 MRM Framework). - PCAOB AS 2501 — Auditing Accounting Estimates.
Actuarial standards: - ASOP No. 56 — Modeling (cross-cutting modeling standard). - ASOP No. 7 — Analysis of Life, Health, or Property/Casualty Insurer Cash Flows (cash-flow framework underlying C-3 deterministic scenarios).
Source data: - 2017 Commissioners Standard Ordinary (CSO) Mortality Tables — NAIC, loaded composite (for C-2 insurance-risk). - NAIC RBC factor tables — published annually each January in NAIC instructions.
Internal:
- Decision 018 (MRM Framework) — Management/decisions/018-mrm-framework-multi-regime.md.
- Decision 020 (Assumption Policy v1.2) — insightalm/modelling/charters/assumption_policy.md.
- Decision 023 (Policy-Based Binding Architecture) — Management/decisions/023-policy-based-binding-architecture.md.
- Decision 028 (Independent 2L MRM Workspace) — moves peer-review from 1L to 2L.
Change Log
Canonical going-forward change log: M-050-changes.md (Keep-a-Changelog format, versioned with the InsModel release cycle). Code-side change history lives in git log of the component files; release notes in ecosystem/InsModel/CHANGELOG.md.
Pre-baseline authorship history of this card:
- 2026-05-08 — stub created from registry data per Decision 023 Phase 5 / B-07.
- 2026-05-25 — Tier-1 hand-authoring of Methodology, Key Assumptions and Their Justification, Limitations and Known Gaps, Validation Packet, and References sections. Standards Coverage section body filled in (declaration was present in stub but body was empty). Stub marker advanced from
to. Phase 1 "conditional-first" path: RAT-050-v1.0.0 issued conditional; this hand-authoring + the validation_evidence pack carry theCloses COND-XXXmarkers that the closure-loop pipeline auto-detects to draft RAT-050-v1.0.1 (approved supersession). - 2026-06-06 — Documentation-currency pass: reconciled the card to the actual
c3_phase1_engine.py/c3_phase2_engine.py/capital_engine.pycode. Corrected C3 Phase 1 scenario count (16 → 7 parallel shifts) across Description, Methodology, Limitations, References, Standards Coverage; corrected C3 Phase 2 capital basis (CTE 90+25% / CTE 98 →max(CTE(70), Standard Scenario Amount)per VM-21), dissolving the framed A-080 registry mismatch; documented A-050/A-051 as bound-but-unconsumed (no CIR process drives either C-3 phase); corrected C3P2 scenario count default (10,000 → 1,000) and equity process (GBM constant-vol defaults 0.08/0.18, not DS-021-calibrated, no jumps — cf INV-011); fixed the covariance/RBC formula in Methodology + Validation Packet to match the engine and Output Snapshot; replaced two non-existent invariant test references with the existingTestGoldCapital+test_engine_golden_cases.pyand marked the C3 invariant suites "pending"; restated CTE monotonicity as CTE70 ≤ CTE90 ≤ CTE95; flagged the engine_registry path mismatch (c3_phase1/c3_phase2 → capital_engine.py vs the real source files) to the registry owner. Output-changing items (true CIR-driven scenarios, CTE90+25%/CTE98 basis, GOES/SVJ ESG, non-parallel C3P1 set, dedicated C3 invariant tests) left for ratification per the gated-findings list. - 2026-06-07 — INV-011 (GOES equity cascade): noted in Methodology §5 and Limitation 1 that
C3Phase2Enginenow consumes the calibrated jump-bearing GOES equity set (implemented 1L, gold re-frozen on the M-002 side). M-050's RBC Output Snapshot is unchanged — its C-3 charge isCapitalEngine's flat interest-rate factor, not the stochastic C3P2 CTE path, so no M-050 gold re-freeze was needed. Documentation-only on the M-050 card; the substantive engine change and gold re-freeze live on M-002. Wiring the stochastic C3P2 CTE charge into the M-050 RBC roll-up remains a separate unimplemented step tracked for ratification.
Open findings (2)
Independent 2nd-line review (INV-2026-06) — implemented capability vs registered scope. Each carries a recommended fix and is tracked in insightalm-mrm until closed.
Full stochastic reserves are gated on GOES (M-120) — today they run on the deterministic floor
VM-20 (M-001), VM-21 (M-002), and C-3 (M-050) all require the full prescribed ESG scenario set for their held *stochastic* reserve. Because GOES (M-120) is under_development, these engines compute the SET/SSA *exclusion diagnostics* but hold max(deterministic, NPR) — the stochastic CTE shown is a diagnostic, not the held amount. The platform's "stochastic" reserves are effectively deterministic today.
Recommendation: Sequence M-120 calibration (INV-009) as the unlock for the Tier-1 stochastic chain, then enable the full-scenario path in VM20ReserveEngine / C3Phase2Engine and re-validate the held reserves. Until then, state plainly (done in cards) that the held reserve is the deterministic floor.
Validation evidence + change logs missing across most of the inventory
Only M-001/M-020/M-050 carried full documentation packs before this pass. Most models record validation_evidence: missing and change_log: missing with peer_review: pending. Gold tests freeze behaviour but many assert only structural invariants (e.g. reserve>0), not correctness against external truth. The flagship T0-vs-10-K match is circular (BV-032).
Recommendation: For each Tier-1 model: produce a validation-evidence pack (back-test vs disclosed results once BV-032 re-calibration lands, sensitivity suite, challenger comparison), a change log, and a 2L ratification. Sequence behind BV-032 (firm-data) for anything needing 10-K reconciliation.
Per-tier expectations
Per MRM Framework §10.2 + §10.3, this model's regulatory_frameworks tag list activates the following overlays:
| component | tier-1 expectation | status |
|---|---|---|
| Registry entry | required | present |
| Model card (§10.5 doc pack) | required | present |
| Validation evidence | required | present |
| Change log | required | present |
| Independent effective challenge (2L) | required | attested |
Ratified — RAT-050-v1.0.1
Latest ratification on file: RAT-050-v1.0.1. Authored by 2L (mrm-peer-reviewer) per Decision 028 charter §5 Pattern A.