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
| Type | Cash value behavior | Income mechanics | Most common use | |
|---|---|---|---|---|
| SPIA (Single Premium Immediate Annuity) | None — premium becomes income | Income stream begins immediately, fixed by contract | Pension replacement at retirement | |
| Fixed deferred annuity | Grows at contract rate (typically 2-5%) | Annuitization optional at maturity; surrender for cash also possible | Conservative tax-deferred accumulation | |
| Variable annuity | Linked to subaccount investment performance | Income via withdrawals (with riders) or annuitization | Tax-deferred investment with optional income guarantees | |
| Indexed annuity (FIA) | Linked to market index with caps, participation, floors | Income via withdrawals (with riders) or annuitization | Hybrid 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:
| Rider | Acronym | What it guarantees | |
|---|---|---|---|
| Guaranteed Minimum Withdrawal Benefit | GMWB | Minimum withdrawal stream regardless of subaccount performance | |
| Guaranteed Lifetime Withdrawal Benefit | GLWB | Lifetime withdrawal stream tied to a 'benefit base' that can step up | |
| Guaranteed Minimum Income Benefit | GMIB | Minimum income at annuitization based on a roll-up benefit base | |
| Guaranteed Minimum Accumulation Benefit | GMAB | Minimum account value at a specified date regardless of investment performance | |
| Guaranteed Minimum Death Benefit | GMDB | Minimum 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 case | What it exercises | |
|---|---|---|
| SPIA in retirement | Income-stream-fixed projections; exclusion-ratio tax treatment | |
| Fixed deferred annuity in surrender period | Surrender-charge calculation; free-withdrawal corridor; year-by-year decay | |
| Variable annuity with GLWB rider | Subaccount-vs-benefit-base divergence; lifetime income computation | |
| Indexed annuity with caps and floors | Per-anniversary crediting computation; cap/floor application | |
| Annuity early withdrawal | §72(q) penalty + ordinary income; LIFO ordering on deferred annuities | |
| Annuity inherited at owner's death | Spousal-continuation election; non-spousal 5-year/10-year/lifetime distribution | |
| 1035 exchange (annuity-to-annuity) | Basis carryover; surrender-period interactions | |
| Annuity with multiple riders | Rider-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.