wealthschemaresourcesarticlesAnnuity modeling — fixed, variable, indexed, SPIA
Article

Annuity modeling — fixed, variable, indexed, SPIA

An annuity is not an account balance. It's a contract with multiple value streams, rider-defined guarantees, and surrender mechanics that mock data quietly omits.

WealthSchema StaffInsurance product modelingMay 9, 20265 min read

A retirement-income platform that ingests an annuity as if it were a brokerage account quietly produces wrong projections from the moment the customer's annuity is added. Annuity contracts have multiple value streams (cash value, account value, surrender value, guaranteed minimum value, income base value), rider-based guarantees that produce contract-level rather than account-level dynamics, surrender schedules that lock the cash for years, and tax treatment under §72 that interacts with both retirement-account rules (§72(t)) and contract early-distribution rules (§72(q)).

This article is the data shape annuity-aware test corpora actually need: per-product-type field requirements, rider taxonomy, surrender-charge schedules, and the synthetic data that exercises each of them. Companion piece: life insurance illustration software testing.

The four major annuity types

 TypeCash value behaviorIncome mechanicsMost common use
SPIA (Single Premium Immediate Annuity)None — premium becomes incomeIncome stream begins immediately, fixed by contractPension replacement at retirement
Fixed deferred annuityGrows at contract rate (typically 2-5%)Annuitization optional at maturity; surrender for cash also possibleConservative tax-deferred accumulation
Variable annuityLinked to subaccount investment performanceIncome via withdrawals (with riders) or annuitizationTax-deferred investment with optional income guarantees
Indexed annuity (FIA)Linked to market index with caps, participation, floorsIncome via withdrawals (with riders) or annuitizationHybrid of fixed and variable; equity exposure with downside cap

SPIA: the cleanest case

A Single Premium Immediate Annuity is the simplest annuity to model. The customer pays a lump-sum premium; the insurer promises a guaranteed income stream for life (or a defined period). There is no cash value to track, no surrender option, no riders. The income stream is fixed by the contract at issue based on the customer's age, gender (in non-Sex-Discrimination jurisdictions), and prevailing interest rates.

// SPIA contract shape
{
  "contract_id": "SPIA-2024-09-15-001",
  "type": "SPIA",
  "issuer": "Pacific Life",
  "premium_paid": 250000.00,
  "issue_date": "2024-09-15",
  "annuitant_age_at_issue": 67,
  "annuitant_gender": "M",
  "income_election": "life_only",        // or "life_with_period_certain", "joint_and_survivor"
  "monthly_income": 1532.40,             // fixed by contract
  "income_start_date": "2024-10-15",
  "expected_present_value": 245832.00,    // for tax-basis exclusion ratio
  "exclusion_ratio": 0.4250               // % of each payment that's basis return (non-taxable)
}

The synthetic-data simplicity belies the planning complexity: the SPIA is irreversible at the customer level, the customer loses access to the principal, and the right SPIA-purchase decision depends on mortality assumptions, longevity-risk pooling preferences, and prevailing interest rates. Test data has to include households with SPIA holdings to exercise the income-stream-fixed projections distinct from the variable-balance projections the rest of the portfolio produces.

Fixed deferred annuity: the accumulation case

A fixed deferred annuity has a cash value that grows at the contract's declared rate (typically 2-5% historically, varying with rate environment). The customer can surrender for cash (subject to surrender charges in the early years), annuitize at maturity, or take systematic withdrawals.

// Fixed deferred annuity contract
{
  "contract_id": "FDA-2022-03-12-001",
  "type": "fixed_deferred",
  "issuer": "AIG",
  "initial_premium": 100000.00,
  "issue_date": "2022-03-12",
  "current_rate": 0.0420,
  "rate_guarantee_period": "5_years",
  "current_account_value": 113450.83,
  "surrender_value": 110895.62,        // current account value minus surrender charge
  "surrender_schedule": [
    { "year": 1, "charge_pct": 0.07 },
    { "year": 2, "charge_pct": 0.06 },
    { "year": 3, "charge_pct": 0.05 },
    { "year": 4, "charge_pct": 0.03 },
    { "year": 5, "charge_pct": 0.01 },
    { "year": 6, "charge_pct": 0.00 }
  ],
  "free_withdrawal_amount_remaining": 11345.08,  // typically 10% of account value annually free
  "mortality_and_expense_charge": 0.00            // typically zero for fixed; relevant for variable
}

The surrender schedule is the major modeling complexity. A customer who needs cash in year 2 of a 7-year surrender period faces a 6% charge on amounts above the free-withdrawal corridor. A test corpus that doesn't model surrender schedules can't exercise the platform's surrender-charge calculation logic.

Variable annuity: the rider-laden case

Variable annuities are the most complex annuity type to model because the cash value is investment-linked but the income guarantees can be rider-defined and substantially divergent from the investment-linked value. A holder can have a variable annuity whose subaccount value drops 30% in a market crash but whose guaranteed income base (a separate rider-tracked value) holds steady or even continues to step up.

The major rider types:

 RiderAcronymWhat it guarantees
Guaranteed Minimum Withdrawal BenefitGMWBMinimum withdrawal stream regardless of subaccount performance
Guaranteed Lifetime Withdrawal BenefitGLWBLifetime withdrawal stream tied to a 'benefit base' that can step up
Guaranteed Minimum Income BenefitGMIBMinimum income at annuitization based on a roll-up benefit base
Guaranteed Minimum Accumulation BenefitGMABMinimum account value at a specified date regardless of investment performance
Guaranteed Minimum Death BenefitGMDBMinimum death benefit (typically return-of-premium or step-up to high-water-mark)

The rider mechanics are the source of most variable-annuity modeling bugs. A GLWB rider's benefit base is the value income is computed against; it's typically the higher of (a) the account value, (b) a roll-up amount (e.g., 5% per year for 10 years), or (c) the annual high-water-mark step-up. The benefit base can grow even when the account value declines. The income stream is computed as a percentage of the benefit base; the percentage depends on attained age at first withdrawal and may step up at age bands.

// Variable annuity with GLWB rider
{
  "contract_id": "VA-2020-06-22-001",
  "type": "variable_deferred",
  "issuer": "Prudential",
  "initial_premium": 200000.00,
  "issue_date": "2020-06-22",
  "subaccounts": [
    { "name": "Large Cap Growth", "allocation": 0.50, "current_value": 105230.40 },
    { "name": "International Equity", "allocation": 0.20, "current_value": 38420.50 },
    { "name": "Investment Grade Bond", "allocation": 0.30, "current_value": 65180.20 }
  ],
  "current_account_value": 208831.10,
  "mortality_and_expense_charge": 0.0125,
  "subaccount_expense_avg": 0.0080,
  "rider_type": "GLWB",
  "rider_charge": 0.0110,
  "benefit_base": 248000.00,              // higher of account value, 5%-rollup, HWM step-up
  "withdrawal_percentage": 0.05,          // 5% of benefit base = $12,400/yr lifetime income
  "withdrawal_started": false,
  "withdrawal_start_age": null
}

The benefit-base computation is a stateful rolling calculation: it has to be carried in the longitudinal data along with the subaccount values, because regenerating it from current state requires the full history. Mock data that stores only the current account value cannot exercise the rider mechanics correctly.

Indexed annuity: the index-linked case

Indexed annuities (FIAs — Fixed Indexed Annuities) credit interest based on the performance of a market index (S&P 500, etc.) with caps, participation rates, and floors. The customer gets some upside exposure with downside protection (typically a 0% floor — no negative crediting).

The indexing mechanics are formula-driven and product-specific:

// Indexed annuity with annual point-to-point S&P 500 crediting
{
  "contract_id": "FIA-2023-01-15-001",
  "type": "indexed_deferred",
  "issuer": "Athene",
  "initial_premium": 150000.00,
  "issue_date": "2023-01-15",
  "indexing_strategy": "annual_point_to_point",
  "underlying_index": "SP500",
  "cap_rate": 0.075,                     // 7.5% cap on annual crediting
  "participation_rate": 1.00,            // 100% participation up to the cap
  "floor": 0.00,                         // 0% floor — no negative crediting
  "current_account_value": 165321.50,
  "credited_history": [
    { "anniversary": "2024-01-15", "index_return": 0.062, "credited": 0.062 },   // below cap, full credit
    { "anniversary": "2025-01-15", "index_return": 0.118, "credited": 0.075 },   // above cap, capped credit
    { "anniversary": "2026-01-15", "index_return": -0.043, "credited": 0.000 }   // negative return, floored
  ],
  "surrender_schedule": [/* typical 10-year schedule */]
}

Cap rates and participation rates are reset annually in many products, which means the same contract's economics change year-by-year. Synthetic test data has to include the indexing-strategy parameters and the per-anniversary crediting history.

The §72(q) tax interaction

Annuity tax treatment is governed by IRC §72. The cash inside an annuity grows tax-deferred. Withdrawals are taxed under exclusion-ratio mechanics (a portion of each withdrawal is tax-free return of basis; the remainder is ordinary income). Early withdrawals (before age 59½) are subject to a 10% §72(q) penalty in addition to ordinary income tax.

For annuities held inside qualified retirement accounts (a rare but real configuration), §72(q) is supplanted by §72(t) — the same 10% penalty applies but under different rules. Annuities held outside retirement accounts (the typical case) follow §72(q) directly.

The exclusion ratio is the cost-basis-divided-by-expected-return ratio at annuitization. For a SPIA, it's fixed at issue. For systematic withdrawals from a deferred annuity, the rules are different — §72(e) applies the LIFO ordering: withdrawals come from earnings first (taxable) until basis is reached, then basis (non-taxable). Test data has to track basis explicitly and apply the correct ordering depending on contract type and withdrawal mode.

What synthetic test data has to model

A realistic annuity-aware test corpus needs:

 Test caseWhat it exercises
SPIA in retirementIncome-stream-fixed projections; exclusion-ratio tax treatment
Fixed deferred annuity in surrender periodSurrender-charge calculation; free-withdrawal corridor; year-by-year decay
Variable annuity with GLWB riderSubaccount-vs-benefit-base divergence; lifetime income computation
Indexed annuity with caps and floorsPer-anniversary crediting computation; cap/floor application
Annuity early withdrawal§72(q) penalty + ordinary income; LIFO ordering on deferred annuities
Annuity inherited at owner's deathSpousal-continuation election; non-spousal 5-year/10-year/lifetime distribution
1035 exchange (annuity-to-annuity)Basis carryover; surrender-period interactions
Annuity with multiple ridersRider-charge stacking; GLWB+GMDB combination economics

How this shows up in our catalog

The decumulation-tagged bundles in the WealthSynth catalog include households with annuity holdings reflecting realistic distributions: SPIAs concentrated in early-retirement households (≥10% of retirees per LIMRA data), fixed and variable deferred annuities in pre-retirement households, indexed annuities increasingly common in 55-70 age cohort. Variable-annuity contracts include rider-base tracking; indexed-annuity contracts include indexing-strategy parameters and crediting history. The longitudinal data carries surrender-schedule decay and benefit-base evolution.

For the broader decumulation context, see Decumulation Edge Cases. For the retirement-income-sequencing piece this complements, see Retirement Income Sequencing and Drawdown sequencing. For the lump-sum-vs-annuity decision when DB pensions are in play, see Lump sum vs. annuity for pension decisions.