Tier 2 · Internal Risk Management

Hedge Effectiveness & Derivative Projection

M-110 · lifecycle: monitoring · RAT-110-v1.0.1

Intended Use

Hedge Effectiveness & Derivative Projection Assess and project effectiveness of derivative hedging programs (primarily VA guarantee hedges).

Evaluates hedge program effectiveness against guarantee liabilities. Projects derivative cash flows under stochastic scenarios and computes residual risk left unhedged.


Components

Inputs, processing, outputs

data sources
DS-001
assumptions
A-050, A-051, A-060, A-061
engines
insmodel.L4.hedging_engine
insmodel.L4.derivative_projection
insmodel.L4.stochastic_engine
contracts
hedge_results_v1
upstream
M-120
dimensions
D4

Methodology & Mechanics

Methodology

M-110 is a Tier 2 hedge-and-derivative model that does two related jobs for a variable-annuity (VA) guarantee / interest-rate hedging program: it projects the derivative book forward through maturity and replacement, and it measures hedge effectiveness against the hedged item under ASC 815 / IFRS 9. Three InsModel components are registered against M-110 (see Components); two are the engines that produce the card's snapshot and one is the registered scenario driver:

  • DerivativeProjectionEngine (insmodel.L4.derivative_projection, governance ID M-403) — the forward projection and Greeks/MV/P&L engine. Computes the Output Snapshot.
  • HedgeEffectivenessCalculator (utility class in firmmodel/engines/hedge_effectiveness.py, consumed by HedgingEngine, governance ID M-401) — the dollar-offset / regression / variability-reduction effectiveness battery. Computes the effectiveness verdict.
  • StochasticEngine (insmodel.L4.stochastic_engine, governance ID M-301, registry category Stochastic) — the correlated Monte-Carlo economic-scenario generator (CIR/Hull-White rates, GBM-with-Merton-jumps equity, O-U inflation, mean-reverting credit spreads, GBM FX) whose calculate() emits a path DataFrame with columns scenario_id, time, interest_rate, equity_return, credit_spread_{aaa,aa,a,bbb,hy}. Registered but not exercised in this card's deterministic snapshot path. It is the intended scenario driver behind the Description's "under stochastic scenarios" language: in a stochastic run its interest_rate / equity_return / credit-spread path columns feed DerivativeProjectionEngine as the scenario_paths input, with one DerivativeProjectionEngine._step per scenario time-step. The deterministic Output Snapshot below instead feeds a single hand-set scenario (interest_rate 4.0%, equity_return +1.0%, vol 20%) so the snapshot is reproducible with no MC draw — so M-301 contributes no numbers to this card's snapshot.

1. Derivative projection (monthly time-stepping). The projection engine carries an internal portfolio state across three instrument classes — IR swaps, equity options, and credit derivatives — initialized from configured notionals and average maturities. Each _step (one month, dt = 1/12) does the following:

  1. Roll equity spot by the period equity_return and decay every class's remaining maturity by one month.
  2. Mature and replace. A fixed fraction notional / (original_maturity_months) matures each month; replacement_ratio (default 1.0 = full replacement) of that is rolled into a new position, with the class's remaining maturity re-weighted toward the original tenor.
  3. Charge hedge cost. New swaps and credit hedges cost hedge_cost_bps of new notional; new equity options cost option_premium_pct of new notional.
  4. Mark to market each class: - IR swaps — pay-fixed PV via an annuity factor: PV = N · (rate − fixed_rate) · Σ DF_i·τ_i (positive when float > fixed). - Equity options — a long-put book priced with Black-Scholes (K·e^{−rT}·N(−d2) − S·e^{−qT}·N(−d1)), scaled by notional / K. - Credit derivatives — written-protection spread-duration proxy: MV = −N · spread · min(T, duration) (negative, widens as spreads rise).
  5. Recompute portfolio Greeks — analytical Black-Scholes delta/gamma/vega for the equity puts, finite-difference DV01 (1 bp bump-and-reprice) for the IR swap book, and a spread-duration CS01 for credit (folded into portfolio_dv01).
  6. Emit derivative_pnl = net_hedge_position − hedge_cost, the per-class MVs, net hedge position, matured/new notional, and the Greeks.

2. Hedge effectiveness (ASC 815 / IFRS 9). HedgeEffectivenessCalculator consumes two aligned series — period fair-value changes of the hedging instrument and of the hedged item — and runs three independent tests:

  • Dollar-offset (ASC 815-20-35): ratio = −ΣΔHedge / ΣΔHedgedItem, effective when in [0.80, 1.25].
  • OLS regression: fits ΔHedge = α + β·ΔHedgedItem; effective when R² ≥ 0.80, slope β ∈ [−1.25, −0.80], and the F-test p-value < 0.05. The p-value uses scipy.stats.f, with a pure-numpy regularized-incomplete-beta fallback if scipy is unavailable.
  • Variability reduction (IFRS 9, prospective): variance_ratio = Var(ΔHedge + ΔHedgedItem) / Var(ΔHedgedItem); effective when the combined (residual) variance is below the unhedged variance.

run_all_tests returns each test plus an overall_effective verdict that is true when at least 2 of 3 tests pass. This is the qualifying gate for hedge accounting and the "residual/unhedged risk" measure the card reports.


Key Assumptions

Key Assumptions and Their Justification

ID / param Assumption Value Justification
ir_swap_notional_B IR swap book notional $232.7B Engine calibration default (provenance string: PRU FY2024 Note 5 in DerivativeProjectionEngine metadata). Treated here as a calibration default, not a verified 10-K figure — see Limitation 6 / BV-032.
equity_option_notional_B Equity option book notional $104.4B Same calibration-default provenance; modeled as a long-put VA-guarantee hedge.
credit_derivative_notional_B Credit derivative book notional $37.1B Same calibration-default provenance; modeled as written protection (spread-duration proxy).
ir_swap_fixed_rate Avg fixed rate on swap book 3.5% Pay-fixed convention; MV positive when scenario rate exceeds fixed (validated by test_ir_swap_mv_*).
default_equity_vol Flat implied vol 20% Single vol per class — no skew or term structure (engine assumption; see Limitation 2).
risk_free_rate / dividend_yield BS pricing inputs 4.0% / 2.0% Continuously-compounded; standard Black-Scholes parameterization.
replacement_ratio Fraction of matured notional rolled 1.0 Full replacement keeps notional coverage constant; test_new_hedge_notional_matches_matured_with_full_replacement asserts new = matured at 1.0.
hedge_cost_bps / option_premium_pct New-hedge execution cost 5 bps / 3% Swap/credit execution in bps; option cost as premium pct. test_hedge_cost_proportional_to_new_notional confirms linearity.
credit_duration Spread duration for credit MV/CS01 5.0 Proxy duration for the written-protection book.
ASC 815 dollar-offset band Effectiveness window [0.80, 1.25] DOLLAR_OFFSET_LOWER/UPPER constants — ASC 815-20-35 prescribed range.
Regression thresholds R² / slope / p ≥0.80 / [−1.25,−0.80] / <0.05 Standard ASC 815 regression-method qualifying criteria.
2-of-3 overall rule Effectiveness verdict ≥2 pass Engine convention in run_all_tests; conservative consensus across the three methods.

Prose. The hedging program is modeled as a long-put equity hedge plus pay-fixed rate swaps, the standard posture for VA guarantee and interest-rate hedging. The long-put book carries negative delta, positive gamma, positive vega (it gains as equities fall / vol rises), which is exactly what offsets a VA guarantee's short-equity-tail exposure. The IR swap book is pay-fixed, so it gains when rates rise — offsetting the duration mismatch on a long-duration liability. Credit derivatives are modeled as written protection (negative MV that worsens as spreads widen), reflecting a yield-enhancement sleeve rather than a hedge. All Greeks are instantaneous sensitivities; discrete monthly rebalancing error is not captured.


Output Snapshot

Output Snapshot

Deterministic run — DerivativeProjectionEngine v1.0.0 (one monthly step) + HedgeEffectivenessCalculator (six-period offset series). Reproducible, requires no live firm data (python scripts/model_snapshots.py M-110 in InsModel; the projection path is asserted by tests/test_derivative_projection.py).

Input: calibration-default book (IR swaps $232.7B @ fixed 3.5% / 7yr · equity puts $104.4B / 2yr ATM · credit $37.1B / 5yr) · period-1 step at interest_rate 4.0%, equity_return +1.0%, vol 20%, replacement_ratio 1.0, hedge_cost 5 bps, option premium 3%. Effectiveness series: hedged-item ΔFV [100, −150, 200, −80, 120, −60], hedge ΔFV [−92, 138, −185, 75, −110, 56].

output value meaning
portfolio_delta (equity puts) −378,884,624.67 net short equity — the put hedge gains as equities fall
portfolio_gamma 13,634,378.58 positive convexity from long options
portfolio_vega 53,412,233,079.45 long volatility — gains as implied vol rises
portfolio_dv01 (IR + credit) −116,998,030.61 net rate sensitivity per 1 bp (pay-fixed swaps + credit CS01)
ir_swap_mv 6,893,061,290.80 pay-fixed MV, positive because scenario 4.0% > fixed 3.5%
equity_option_mv 8,688,972,376.79 Black-Scholes put-book value
credit_derivative_mv −1,824,598,611.11 written protection — negative MV at base spread
net_hedge_position 13,757,435,056.48 sum of the three class MVs
hedge_cost 132,194,285.71 period roll cost (option premium + swap/credit bps)
derivative_pnl 13,625,240,770.77 net_hedge_position − hedge_cost (simplified period P&L)
matured / new_hedge_notional 7,738,571,428.57 one month's roll at replacement_ratio 1.0 (new = matured)
dollar_offset_cumulative_ratio 0.91 within ASC 815 [0.80, 1.25] → effective
regression_r_squared / slope β 1.00 / −0.92 R² ≥ 0.80 and β ∈ [−1.25, −0.80] → effective
regression_p_value 0.00 F-test significant at p < 0.05
variability_reduction_pct 99.42% residual variance 91.67 vs unhedged 15,680.56
overall_effective / tests_passed True / 3-of-3 all three ASC 815 / IFRS 9 tests pass

Prose. The projection produces an internally consistent hedge posture: a put book that is short-delta, long-gamma, long-vega (the VA-guarantee hedge profile), pay-fixed swaps marking positive because the 4.0% scenario rate sits above the 3.5% fixed rate, and written credit protection marking negative. The hedge effectiveness battery passes all three tests — a 0.91 dollar-offset ratio, a near-perfect regression with slope −0.92, and a 99.4% variance reduction — so the relationship qualifies for hedge accounting and the residual (unhedged) risk is the 91.67 combined-position variance against a 15,680.56 unhedged variance. Note the absolute projection magnitudes are large because the canonical book uses full-scale calibration-default notionals ($374B aggregate); they are illustrative of the engine mechanics, not a claim about any firm's actual book — see Limitation 6.

Captured 2026-06-04 · deterministic, no live data.


Limitations

Limitations and Known Gaps

  1. Period P&L is a simplified identity, not a full attribution. The projection emits derivative_pnl = net_hedge_position − hedge_cost, i.e. current MV minus roll cost — it does not subtract the prior-period MV. So the first-period "P&L" is essentially the standing mark plus cost, not a true period change. The richer delta/gamma/vega/theta/rho/basis/unexplained attribution lives in HedgingEngine._calculate_pnl_attribution (M-401) and is not wired into the projection path. A card consumer wanting period-over-period P&L must difference net_hedge_position across rows or invoke M-401 separately.
  2. Flat volatility, no skew or term structure. Equity options use a single default_equity_vol per class; there is no smile, skew, or vol-term-structure. For a put-heavy VA hedge this understates the cost and vega of deep-OTM tail protection.
  3. No CVA/DVA/FVA or counterparty risk. Neither engine prices counterparty credit, funding, or collateral valuation adjustments. Net hedge MV is a clean mid-market mark.
  4. Credit leg is a spread-duration proxy only. Credit derivatives are valued as −N·spread·min(T, duration) with no default-leg / premium-leg decomposition, no recovery assumption, and no CDS curve. CS01 is similarly a duration proxy folded into portfolio_dv01 rather than reported as a separate output.
  5. Effectiveness inputs — projection-integrated, production-inputs still exogenous. HedgeEffectivenessCalculator consumes ΔHedge / ΔHedgedItem series. As of the RAT-110-v1.0.0 remediation the two halves of M-110 are integration-tested: tests/test_hedge_projection_integration.py drives the DerivativeProjectionEngine forward and feeds its produced equity-option ΔMV and delta-matched hedged-item series into the effectiveness battery (recorded result: dollar-offset 0.7868 ineffective, regression R² 0.9998 / slope −0.9544 effective, variability 99.77% effective → overall effective, 2-of-3). The Output Snapshot below still uses a deterministic illustration series; and a production run must feed real per-period hedge and hedged-item fair-value changes (e.g. from the VA-guarantee reserve engine) rather than the calibration-input derivation. The remaining gap is the production data feed, not the engine wiring.
  6. Calibration-default notionals carry a 10-K provenance string that is NOT an independently verified claim (BV-032). The $232.7B / $104.4B / $37.1B defaults and the "PRU FY2024 Note 5" string come from the engine's legacy_metadata. This card makes no 10-K accuracy claim; the figures are engine calibration defaults used to make the snapshot deterministic. Subject to the BV-032 firm-data divergence caveat, they should not be read as a firm's reported derivative book.
  7. (Closed by RAT-110-v1.0.0 remediation.) HedgeEffectivenessCalculator now has a dedicated test module (tests/test_hedge_effectiveness.py, 22 tests) covering the dollar-offset / OLS-regression / IFRS 9 variability paths and the 2-of-3 verdict including the effective/ineffective band boundaries. The derivative projection retains its thorough suite (tests/test_derivative_projection.py, 50 tests). See Validation Packet.
  8. Greeks are instantaneous; monthly rebalancing only. Discrete intra-month rebalancing error and path-dependent gamma P&L are not captured; rebalancing is a once-a-month roll.

Tracked for ratification (not applied in this documentation pass). The following are output-changing / modeling-code items left for ratification, noted here for transparency: integrate the projection and effectiveness engines so dollar-offset / regression / variability run on real projected hedge + hedged-item MV series instead of the deterministic illustration, and wire greek-attribution P&L from HedgingEngine (M-401) into the projection path (INV-019); add a dedicated test module for HedgeEffectivenessCalculator plus a projection→effectiveness integration test and record a real validation result for last_validated_on; replace the simplified derivative_pnl = net_hedge_position − hedge_cost identity with a true period change carrying the greek/theta attribution that currently exists only in HedgingEngine._calculate_pnl_attribution. No model outputs were fabricated or changed in this documentation pass.


Validation Evidence

Validation Packet

Overall status: scoped Tier-2 evidence assembled; 2L re-review pending. Registry lifecycle.last_validated_on is 2026-06-06 — a recorded validation result now exists (the projection→effectiveness integration verdict, below). The 2L technical ratification is RAT-110-v1.0.0 (decision: conditionally_approved). Following the RAT-110-v1.0.0 remediation: (1) a dedicated test module for HedgeEffectivenessCalculator exists (tests/test_hedge_effectiveness.py, 22 tests — COND-110-01); (2) a projection→effectiveness integration test exists (tests/test_hedge_projection_integration.py — COND-110-02); (3) the recorded validation result populates last_validated_on; (4) the scoped evidence pack is assembled at modelling/validation_evidence/M-110/v1.0.0/README.md. What remains for unconditional sign-off: 2L re-review of COND-110-01 / COND-110-02 (and the external countersign, pending per Decision 028). The table below records the validation that exists.

Check Where What it asserts
Output-contract completeness test_output_columns_match_contract, test_single_period_has_all_output_columns every ENGINE_CONTRACT["outputs"] column is produced
IR swap directionality TestIRSwapValuation (3 tests) pay-fixed MV > 0 when rate > fixed, < 0 when rate < fixed, ≈0 at par
Equity option / vega monotonicity TestEquityOptionValuation (3 tests) put MV non-zero; MV rises with vol
Credit MV directionality TestCreditDerivativeValuation (2 tests) written CDS MV more negative as spreads widen
Greeks signs + finiteness TestGreeks (5 tests) put-book delta < 0, gamma > 0, vega > 0, DV01 ≠ 0, all finite over 60 periods
Roll / replacement mechanics TestMultiPeriod, TestHedgeCost new = matured at ratio 1.0; cost ∝ new notional; 0 cost at ratio 0
Edge cases TestEdgeCases (5 tests) zero notional, 20% rate, −10% equity, large spread widening all finite
SR 11-7 governance metadata TestGovernance (8 tests) model_id M-403, category Risk, ≥3 references/assumptions/limitations
Greeks cross-check engine validation block (legacy_metadata) finite-difference bump-and-reprice vs analytical Greeks each step
Effectiveness calculator (dollar-offset / OLS / IFRS 9) test_hedge_effectiveness.py (22 tests) all three paths + 2-of-3 verdict + effective/ineffective band boundaries (COND-110-01)
Projection→effectiveness integration test_hedge_projection_integration.py::test_recorded_validation_result effectiveness battery on projection-produced ΔMV / delta-matched series → overall effective 2-of-3 (COND-110-02)
Snapshot determinism python scripts/model_snapshots.py M-110 byte-identical output across runs (md5 6deda4779f731f26907e3a12ece3f6a0, verified 2026-06-06)

Validation evidence note (BV-032 / honesty): the projection path, the effectiveness path, and the projection↔effectiveness integration are now all tested (79 tests total across the three modules). M-110 should be read as "two validated component engines wired through a tested integration on calibration-input series" — the remaining honest gap is a production data feed (real per-period hedge / hedged-item fair-value changes), not engine wiring. Full scoped evidence: modelling/validation_evidence/M-110/v1.0.0/README.md.


References

References

Accounting / regulatory: - FASB ASC 815 Derivatives and Hedging — hedge accounting; dollar-offset (ASC 815-20-35) and regression effectiveness methods; effectiveness window [0.80, 1.25]. - IFRS 9 Financial Instruments §6.4 — prospective effectiveness assessment; the variability-reduction basis for the IFRS 9 test. - Federal Reserve SR 26-2 (April 2026, supersedes SR 11-7) — model risk management; the governance metadata (TestGovernance) encodes the SR 11-7 narrative.

Quantitative methods: - Black, F. & Scholes, M. (1973), The Pricing of Options and Corporate Liabilities, JPE — closed-form European option pricing for the equity put book. - Black, F. (1976) — Black's model (used by the sibling HedgingEngine for swaptions). - Hull, J. (2018), Options, Futures, and Other Derivatives, 10th ed. — derivative projection, roll mechanics, Greek evolution. - Fabozzi, F. (2012), Bond Markets, Analysis, and Strategies — DV01 and key-rate duration for the IR swap leg.

Engine source: - firmmodel/engines/derivative_projection.pyDerivativeProjectionEngine (governance ID M-403), the projection / MV / Greeks engine. - firmmodel/engines/hedge_effectiveness.pyHedgeEffectivenessCalculator, the ASC 815 / IFRS 9 effectiveness battery. - firmmodel/engines/hedging_engine.pyHedgingEngine (governance ID M-401), the sibling pricing / Greeks / P&L-attribution engine that consumes the effectiveness calculator.

Tests: - tests/test_derivative_projection.py — 50 tests / 13 classes covering construction, initialization, projection, valuation, Greeks, hedge cost, governance, contract, and edge cases for M-403. - tests/test_hedge_effectiveness.py — 22 tests covering the dollar-offset / OLS-regression / IFRS 9 variability paths, the 2-of-3 verdict, and the effective/ineffective band boundaries of HedgeEffectivenessCalculator (COND-110-01). - tests/test_hedge_projection_integration.py — projection→effectiveness integration: drives DerivativeProjectionEngine and feeds its produced series into HedgeEffectivenessCalculator, recording the validation result (COND-110-02).

Internal: - Engine legacy_metadata: firmmodel/governance/legacy_metadata/DerivativeProjectionEngine.yaml and HedgingEngine.yaml — SR 11-7 narrative, references, assumptions, limitations, and the calibration-default provenance string (BV-032 caveat applies).


Change Log

Change Log

Card change history. Code-side change history lives in git log of the component files.

  • 2026-05-08 — stub created from registry data per Decision 023 Phase 5 / B-07.
  • 2026-06-04 — hand-authored to M-001 depth: Methodology (derivative projection + ASC 815 / IFRS 9 effectiveness battery), Key Assumptions and Their Justification, Output Snapshot (deterministic, no live data), Limitations and Known Gaps, Validation Packet, and References, grounded in DerivativeProjectionEngine (M-403) / HedgeEffectivenessCalculator / HedgingEngine (M-401) source and legacy_metadata. Stub marker advanced to ``.
  • 2026-06-06 — code-grounded documentation completeness pass. Documented the third registered component StochasticEngine (M-301, category Stochastic) and its interest_rate / equity_return / credit-spread path output, marking it registered-but-not-exercised in the deterministic snapshot path, and reconciled the "backed by two components" wording with the three engines in Components. Added a Standards Coverage section (ASC 815 / ASC 815-20-35, IFRS 9 §6.4, ASOP 56) to complete the 13-section structure. Added an explicit Validation-Packet honesty status line (validation pending — last_validated_on null, 2L peer-review pending — ratification_ref null, effectiveness-calculator test module absent). Added a D049 documentation-currency note (unstamped / pending baseline) to the header. Noted gated/ratification items (INV-019, effectiveness-test module + integration, derivative_pnl attribution) under Limitations. No model outputs, back-test numbers, or validation results were fabricated or changed.
  • 2026-06-06 — RAT-110-v1.0.0 1L remediation (Decision 053 §2.2). Closed COND-110-01 by adding tests/test_hedge_effectiveness.py (22 tests: all three ASC 815 / IFRS 9 paths + 2-of-3 verdict + band boundaries). Closed COND-110-02 by adding tests/test_hedge_projection_integration.py (effectiveness battery on projection-produced series; recorded result: overall effective 2-of-3) and setting lifecycle.last_validated_on to 2026-06-06. Reconciled COND-110-03 (registry documentation_pack.model_card/validation_evidence → present). Assembled the scoped Tier-2 evidence pack at modelling/validation_evidence/M-110/v1.0.0/README.md; re-stamped doc-currency (fingerprint 6c0c3389f350a5bd, 2026-06-06). Output snapshot md5 unchanged (6deda4779f731f26907e3a12ece3f6a0) — no model output changed. No validation results, back-test numbers, or model outputs were fabricated.

2L Inventory Review

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.

HIGH INV-029 · P5 · validation-gap

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.

MEDIUM INV-019 · P3 · proxy

Hedge projection and hedge-effectiveness engines are not integrated

DerivativeProjectionEngine (projection) does not produce the delta-hedge / delta-hedged-item series that HedgeEffectivenessCalculator consumes; the offset series used for the ASC-815 effectiveness tests is a deterministic illustration. derivative_pnl is a simplified identity (net_hedge_position - hedge_cost), not a true period-over-period change with greek attribution. No dedicated test module for the effectiveness calculator.

Recommendation: Feed the projection engine's hedge + hedged-item MV series into the effectiveness calculator so dollar-offset/regression/variability run on real projected data; wire the greek-attribution P&L from HedgingEngine; add an effectiveness test module.


Validation Coverage

Per-tier expectations

Per MRM Framework §10.2 + §10.3, this model's regulatory_frameworks tag list activates the following overlays:

asop_56 internal
component tier-2 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

Ratification

Ratified — RAT-110-v1.0.1

Latest ratification on file: RAT-110-v1.0.1. Authored by 2L (mrm-peer-reviewer) per Decision 028 charter §5 Pattern A.