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.
Inputs, processing, outputs
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 infirmmodel/engines/hedge_effectiveness.py, consumed byHedgingEngine, 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) whosecalculate()emits a path DataFrame with columnsscenario_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 itsinterest_rate/equity_return/ credit-spread path columns feedDerivativeProjectionEngineas thescenario_pathsinput, with oneDerivativeProjectionEngine._stepper 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:
- Roll equity spot by the period
equity_returnand decay every class's remaining maturity by one month. - 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. - Charge hedge cost. New swaps and credit hedges cost
hedge_cost_bpsof new notional; new equity options costoption_premium_pctof new notional. - 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 bynotional / K. - Credit derivatives — written-protection spread-duration proxy:MV = −N · spread · min(T, duration)(negative, widens as spreads rise). - 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). - 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 usesscipy.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 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
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 and Known Gaps
- 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 inHedgingEngine._calculate_pnl_attribution(M-401) and is not wired into the projection path. A card consumer wanting period-over-period P&L must differencenet_hedge_positionacross rows or invoke M-401 separately. - Flat volatility, no skew or term structure. Equity options use a single
default_equity_volper 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. - 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.
- 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 intoportfolio_dv01rather than reported as a separate output. - Effectiveness inputs — projection-integrated, production-inputs still
exogenous.
HedgeEffectivenessCalculatorconsumes Δ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.pydrives theDerivativeProjectionEngineforward 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. - 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. - (Closed by RAT-110-v1.0.0 remediation.)
HedgeEffectivenessCalculatornow 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. - 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 forHedgeEffectivenessCalculatorplus a projection→effectiveness integration test and record a real validation result forlast_validated_on; replace the simplifiedderivative_pnl = net_hedge_position − hedge_costidentity with a true period change carrying the greek/theta attribution that currently exists only inHedgingEngine._calculate_pnl_attribution. No model outputs were fabricated or changed in this documentation pass.
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
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.py — DerivativeProjectionEngine
(governance ID M-403), the projection / MV / Greeks engine.
- firmmodel/engines/hedge_effectiveness.py — HedgeEffectivenessCalculator,
the ASC 815 / IFRS 9 effectiveness battery.
- firmmodel/engines/hedging_engine.py — HedgingEngine (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
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 itsinterest_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_onnull, 2L peer-review pending —ratification_refnull, 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_pnlattribution) 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 addingtests/test_hedge_projection_integration.py(effectiveness battery on projection-produced series; recorded result: overall effective 2-of-3) and settinglifecycle.last_validated_onto 2026-06-06. Reconciled COND-110-03 (registrydocumentation_pack.model_card/validation_evidence→ present). Assembled the scoped Tier-2 evidence pack atmodelling/validation_evidence/M-110/v1.0.0/README.md; re-stamped doc-currency (fingerprint6c0c3389f350a5bd, 2026-06-06). Output snapshot md5 unchanged (6deda4779f731f26907e3a12ece3f6a0) — no model output changed. No validation results, back-test numbers, or model outputs were fabricated.
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.
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.
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.
Per-tier expectations
Per MRM Framework §10.2 + §10.3, this model's regulatory_frameworks tag list activates the following overlays:
| 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 |
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.