Technical Notes#

Status: Draft, 2026-08-03 (underlying research accessed 2026-08-03).

Scope note: these notes specify a reference liability cash flow projection model (lifelib/modelx style) for the standardized composite products defined in product-spec.md (“RefWL-Par” participating whole life; “RefWL-FE” non-par final-expense whole life). They do not describe any single insurer’s model. [S#]/[R#] tags cite the product research file (_research/whole-life.md); [REG-R#] tags cite the cross-product reference library (references/regulatory-and-actuarial-references.md; research provenance in _research/regulatory-actuarial.md, same R-numbering). std marks standardizations introduced for the reference implementation. Parameter values are identical to those in product-spec.md.


Model scope and conventions#

  • Projection frequency: annual, on policy years (anniversary to anniversary) std. Rationale: the contract’s cash flow drivers — level annual premium, annual dividend declaration, anniversary loan-interest capitalization [S1] — are all annual. No monthiversary processing is performed; monthly modal premiums would enter only as a premium-income refinement via modal factors [S1] and are excluded by the annual-mode standardization (product-spec Table 2 note (f)).

  • Timing conventions std: premiums and premium-linked expenses at the beginning of the policy year (BOY); death claims, dividends, surrenders, and maturity at the end of the policy year (EOY), in the processing order given below. State variables are stored at EOY (= policy anniversary t).

  • Age basis: age nearest birthday (ANB) std (product-spec Table 1 note (a)); the 2017 CSO set provides ANB tables R8. Attained age at anniversary t is x + t.

  • Projection horizon: to the anniversary at attained age 100, where the model pays a maturity benefit and terminates std. The contract itself matures at 121 [S1], but the guaranteed CV equals face at 100 and PUA CV equals PUA face at 100 [S1] [S3], so from age 100 the policy is economically an endowment at face; truncating at 100 changes only the timing of the terminal payment between ages 100–121 (mortality vs. maturity), not its amount per survivor.

  • Model points: single-policy model points, projected seriatim; results scale linearly in face within a band-free specification std. Amounts are U.S. dollars per policy; probabilities are per policy year.

  • Decrement model: annual rates; deaths before surrenders at EOY; dividends credited to policies in force at EOY before surrender processing std (order list below).

  • Sex-distinct rates throughout (unisex only as a variant) [S1] [S3].

Model point attributes#

Attribute

Type

Example

policy_id

str

“WLPAR-000001”

product

enum {WL_PAR, WL_FE_LEVEL, WL_FE_GRADED}

WL_PAR

premium_period

enum {TO_100, PAY_10, PAY_20, TO_65}

TO_100 std (product-spec Table 1 note (b); menu [S1] [S3])

issue_age (x)

int

45

sex

enum {M, F}

M

risk_class

enum {PREF_NT, STD_NT, TOB} std

STD_NT

face_amount (F)

float

100,000 std

annual_premium (G)

float

1,800.00 [std illustrative] (product-spec Table 2 note (c))

dividend_option

enum {CASH, REDUCE_PREM, ACCUM, PUA}

PUA (default [S1] [S2])

pua_rider_premium (A_t)

float per year

0.00

term_blend_target

float (0 = off)

0.00 (variant: 2 × F std)

loan_utilization

float in [0,1]

0.00 (variant: 0.20 std)

duration_inforce (t0)

int (0 for new business)

0

puaf_inforce

float (PUA face at t0)

0.00

loan_inforce

float

0.00

State variables#

Variable

Meaning

Initialization

l_t

Probability in force at anniversary t (per issued policy)

l_0 = 1

CV_t

Guaranteed cash value per policy (base), EOY t

table input; CV_{100−x} = F [S1] [S3]

PUAF_t

Paid-up additions face in force, EOY t

PUAF_0 = puaf_inforce

PUACV_t

PUA cash value, EOY t

PUAF_t · NSP_{x+t} std

DA_t

Dividend accumulation balance (ACCUM option only)

0

L_t

Loan balance incl. capitalized interest, EOY t

L_0 = loan_inforce

DB_t

Death benefit payable on death in year t

formula below

D_t

Dividend credited at EOY t

recursion below

Assumption inputs#

The model distinguishes three assumption classes. Keeping them in separate input structures is deliberate: (a) is locked by contract, (b) is an insurer-declared snapshot that re-rates annually, (c) is the modeler’s experience basis.

(a) Contractual / guaranteed elements (from the product spec)#

Input

Value

Basis

Guarantee interest i_g

4.00%

[S1]; Model 808 floor R1

Guarantee mortality q^g_{x+t}

2017 CSO composite, sex-distinct, ANB

[S1] R3 R8; ANB std

Guaranteed CV schedule CV_t

Table input per model point (generated on the above basis)

[S1] R1; see below

Gross premium G

Model point input (level, guaranteed)

[S1] [S3]

Loan rate i_L

6.00% fixed, in arrears

[S1]

Endowment/maturity

CV = F at age 100; model maturity at 100

[S1] [S3]; truncation std

FE premium rates

Per $1,000 rate table + $36 fee

[S7]

FE graded DB

110% of premiums paid, natural death in years 1–2

[S6] [S7]

(b) Current non-guaranteed scale (insurer-declared; snapshot)#

Input

Value

Basis

Dividend interest rate i_d

6.00% (2026-scale snapshot)

std, within observed 5.75%–6.60% [S4] [S14]

Experience mortality in scale q^{sc}_{x+t}

AE^{sc} · q^{2015VBT}_{x+t} with AE^{sc} = 0.70 of 2017 CSO in the worked example

[std illustrative]; structure per [S4] R6, tables REG-R18

Expense margin in scale e^{m}_t

$25 per policy per year

std

Dividend floor

D_t 0

std (dividends are non-negative distributions of surplus R6)

PUA purchase basis

NSP_{x+t} on 2017 CSO / 4%, unloaded (dividend purchases); 10% load on rider payments

std / [S3] (product-spec Table 3 note (k), Riders)

Accumulation option credit rate

i_d

[S2] rate declared annually; reuse of DIR std

Non-guaranteed scales are constrained in illustration use by the disciplined-current-scale and self-support / lapse-support machinery of Model 582 R2 and ASOP 24 REG-R30; the model’s “current scale” should be interpreted as a currently-payable-scale snapshot, not a projection of future scale changes.

Cash flow components and recursions#

Notation (defined once, used throughout)#

x           issue age (ANB)                     t   policy year, t = 1 … 100 − x
F           base face amount                    G   gross annual premium
i_g         guaranteed interest (4.00%)         i_d dividend interest rate (6.00%)
i_L         policy loan rate (6.00%)            v_g = 1 / (1 + i_g)
q^g_{y}     2017 CSO rate at attained age y     q^e_{y}  best-estimate rate at age y
w_t         lapse rate in policy year t         l_t  in-force probability at EOY t
CV_t        guaranteed cash value (base), EOY t
NSP_y       net single premium per 1 of paid-up (endow-at-100) WL face at age y,
            on 2017 CSO / 4%:  NSP_y = A_{y:(100−y)|}  (endowment insurance to 100)
ä_{y:n|}    annuity-due, n years, on 2017 CSO / 4%
D_t         dividend credited at EOY t          PUAF_t, PUACV_t  PUA face / cash value
DA_t        dividend accumulation balance       L_t  loan balance at EOY t
DB_t        death benefit for deaths in year t  E_t  expense outgo in year t

Guaranteed cash value: conceptual formula and practical treatment#

Conceptual (Standard Nonforfeiture Law minimum, adjusted-premium / nonforfeiture-net-level- premium method) R1:

NNLP      = F · NSP_x / ä_{x:(100−x)|}                       (net level premium, NF basis)
EA        = 0.01 · F + 1.25 · min(NNLP, 0.04 · F)            (expense allowance)  [R1]
P_adj     such that  P_adj · ä_{x:m|} = F · NSP_x + EA       (m = premium period)  [R1]
CV_t^min  = F · NSP_{x+t} − P_adj · ä_{x+t:(m−t)|}           (t < m; second term 0 for t ≥ m)

on 2017 CSO / 4% [S1] R1 R3. Properties to verify: CV_{100−x}^min = F (since NSP_100 = 1), and smooth progression by duration R1.

Practical treatment std: the reference implementation reads CV_t (per $1,000 of face) from a table input, because contractual CV tables are policy-form documents not publicly available for the surveyed carriers (research gap noted in _research/whole-life.md). The shipped table is generated from the formula above; an implementer replacing it with a carrier table changes no other logic. Contractual CV_t CV_t^min always R1.

Dividend recursion (three-factor contribution formula)#

Anchor (published mechanics of one surveyed carrier) [S4]:

D_t = ( CV_{t−1} + G − MEC_t ) · (1 + i_d) − CV_t

where MEC_t is the mortality-and-expense charge based on actual company results — i.e., the dividend is the excess of an experience-basis accumulated value over the guaranteed value [S4].

Reference parametrization std (exact carrier factor formulas are proprietary; this is the classic three-factor contribution decomposition consistent with [S4] and the contribution principle R6):

D_t = D^int_t + D^mort_t + D^exp_t ,   floored at 0
D^int_t  = (i_d − i_g) · (CV_{t−1} + NP_g)                       (interest margin)
D^mort_t = (q^g_{x+t−1} − q^{sc}_{x+t−1}) · (F − CV_t)           (mortality margin)
D^exp_t  = e^m_t                                                  (expense margin)

with NP_g = NNLP (the nonforfeiture net level premium, so the interest margin applies to the guaranteed fund including the year’s net premium) std, q^{sc} the scale’s experience mortality (class (b)), and e^m_t the per-policy expense margin (class (b)). Dimensions: every term is dollars per policy per year. Refinements observed in practice — interest on the mortality margin, premium-timing adjustments, banded factors [S1] [S3] — are absorbed into the calibration of q^{sc} and e^m_t std.

Dividends on the PUA block (PUAs are dividend-eligible [S14]) std:

D^PUA_t = (i_d − i_g) · PUACV_{t−1} + (q^g_{x+t−1} − q^{sc}_{x+t−1}) · (PUAF_{t−1} − PUACV_{t−1})

No dividend is credited for policy year 1 (D_1 = D^PUA_1 = 0) std (product-spec Table 3 note (j); one carrier pays none [S1], another pays a first-year dividend [S3]).

Direct recognition (loaned values) std parametrization of [S1] [S3]: replace i_d with i_L on the loaned portion:

D^int_t (adjusted) = (i_d − i_g) · (CV_{t−1} + NP_g − L_{t−1}) + (i_L − i_g) · L_{t−1}

With i_L = 6.00% [S1] and the snapshot i_d = 6.00% std the adjustment is zero — a coincidence of the snapshot, not a model property.

Dividend application (by option)#

  • PUA (default [S1] [S2]): ΔPUAF_t = (D_t + D^PUA_t) / NSP_{x+t}; PUAF_t = PUAF_{t−1} + ΔPUAF_t; PUACV_t = PUAF_t · NSP_{x+t} std (valuing all PUA face at the attained-age NSP on the guarantee basis; exact at issue of each layer and at age 100, approximate between std). At age 100, NSP_100 = 1 so PUACV = PUAF [S1].

  • CASH: dividend paid out; policyholder cash flow at EOY.

  • REDUCE_PREM: offsets next year’s BOY premium: G^{net}_{t+1} = max(G D_t, 0), excess to PUAs std (excess-to-PUA per one carrier’s reduce-premium option [S3]).

  • ACCUM: DA_t = DA_{t−1} · (1 + i_d) + D_t; balance adds to death and surrender proceeds [S1] [S2].

PUA rider (in-scope rider)#

Rider payment A_t (BOY, within limits set at issue [S3] [S11]): ΔPUAF^rider_t = A_t · (1 0.10) / NSP_{x+t−1} — 10% load std from the observed 7.5%–10% range [S3]. Rider PUAs merge into PUAF_t.

Term-blend rider (in-scope rider, simplified std)#

Target face TF = 2 F std (within observed caps: ≤ 9× base [S2], ≤ 300% of base [S3]). Each year, OYT face = max(TF F PUAF_t, 0); the dividend first pays the OYT cost q^{sc}_{x+t} · OYT_t · v_g std, remainder buys PUAs; crossover when PUAF_t TF F, after which the rider is pure PUA [S2] [S3] [S11]. Death benefit while blended: TF + excess PUAs L_t.

Benefit amounts#

DB_t   = F + PUAF_{t−1} + DA_{t−1} − L_{t−1}                 (PUA/ACCUM components as elected)
CSV_t  = CV_t + PUACV_t + DA_t − L_t                          (surrender value, EOY t)
MAT    = F + PUAF_T + DA_T − L_T   at T = 100 − x             (model maturity [std])

DB per the contractual formula [S1], reduced to modeled components std. Deaths in year t are assumed to occur at EOY before the year-t dividend is credited, so DB_t carries the prior year’s PUA face std (terminal-dividend and premium-refund items not modeled, product-spec Table 3 note (m)).

Annual processing order (policy year t, per unit in force l_{t−1})#

  1. BOY: collect gross premium G (if t premium period) and PUA rider premium A_t; pay premium tax and acquisition/maintenance expense E_t.

  2. BOY: apply REDUCE_PREM offset from D_{t−1} if elected.

  3. During year: interest accrues implicitly (CV table on i_g [S1]; loan at i_L [S1]).

  4. EOY — deaths: probability q^e_{x+t−1}; outgo q^e_{x+t−1} · l_{t−1} · DB_t.

  5. EOY — loan interest capitalization: L_t = L_{t−1} · (1 + i_L) less repayments [S1].

  6. EOY — dividend: credit D_t + D^PUA_t to survivors (from t = 2 std); apply per dividend option; update PUAF_t, PUACV_t, DA_t.

  7. EOY — surrenders: probability w_t applied to survivors l_{t−1} · (1 q^e_{x+t−1}); outgo = CSV_t per surrendering policy.

  8. Update in force: l_t = l_{t−1} · (1 q^e_{x+t−1}) · (1 w_t).

  9. At T = 100 − x: pay MAT · l_T; terminate std.

Ordering (deaths → dividend → surrenders at EOY) is std; it makes surrender values include the just-credited dividend, consistent with anniversary processing.

Net liability cash flow (per issued policy, year t)#

NetCF_t = − G^{net}_t · l_{t−1} − A_t · l_{t−1} + E_t · l_{t−1}          (BOY items, sign: outgo +)
          + q^e · l_{t−1} · DB_t + w_t · l_{t−1}(1 − q^e) · CSV_t        (EOY benefits)
          + D^{cash}_t · l_{t−1}(1 − q^e) + MAT · l_T · 1{t=T}           (cash dividends, maturity)

Internal dividend applications (PUA, ACCUM, REDUCE_PREM) are not cash flows when credited; they emerge later through DB, CSV, and MAT std. Loans are modeled on the offset view: see next.

Loans (offset treatment — brief)#

Base run: loan_utilization = 0. Variant std: L_t = 0.20 · CV_t maintained by borrowing/repaying at EOY; borrowed amounts are policyholder cash outflows from the insurer, loan interest received is an inflow, and DB/CSV/MAT are net of L_t [S1] [S3] [S9]. Under direct recognition the dividend adjustment above applies [S1] [S3]. Economically the loan is an offsetting asset; the reference model reports gross liability flows plus a separate loan account rather than netting into a “net amount at risk” presentation std.

RefWL-FE variant deltas#

  • Premium: G = (F/1000) · rate(x, sex, tobacco) + 36 [S7]; no dividends (non-par unverified; modeled non-par).

  • Graded plan: for natural-cause deaths in years 1–2, DB_t = 1.10 · (cumulative premiums paid); accidental deaths pay F from day 1 [S6] [S7]. Accidental split requires an accidental-death fraction of q^e std (reference value 3% of deaths std).

  • Maturity at age 100 (120 in FL — not modeled std) pays F L_T [S8].

  • CV schedule: reuse of the par nonforfeiture machinery std (product-spec Table 5 note (r)).

  • Lapse: FE simplified-issue business lapses higher than par WL; reference schedule 12% year 1, 10% year 2, grading to 6% level by year 5 std (no FE-specific study in the research base; flagged as an open issue).

Policyholder behavior modeling#

Base behavior is static (schedules in class (c)). Dynamic overlays, all std:

  • Interest-sensitive lapse multiplier (for scenario runs): w_t^dyn = w_t · min(1 + 2.0 · max(0, r^{cmp}_t i_d 0.01), 3.0) where r^{cmp}_t is the competitor/market rate in the scenario. Rationale: par WL cash values are liquid at book value, so sustained rate spreads induce excess surrender; the low base level reflects the strong persistency of dividend-paying WL. Calibration is judgmental std — the research base records no dynamic-lapse study for WL.

  • Premium offset behavior: once D_t G (dividend covers the premium), a fraction 0.50 std of policyholders switch to REDUCE_PREM/premium-offset behavior (offset is a real product feature: a lettered dividend option at one carrier [S2]; a named automatic offset option at another [S3]). This shifts premium income to internal dividend application in later durations.

  • Loan utilization: static 0%/20% variants only std; no dynamic loan take-up (the 6%-fixed direct-recognition design largely neutralizes loan arbitrage [S1] [S3]).

  • No dynamic mortality (anti-selection) on lapse for the base par product std; selective-lapse mortality loading is documented mainly for term post-level-period designs (see the SOA persistency/PLT study family around REG-R20), not level-premium par WL.

Worked example#

Single-year walk-through of the core recursion: RefWL-Par, male Standard NT, x = 45, F = 100,000 std, G = 1,800 [std illustrative], PUA dividend option, no rider, no loan. Policy year t = 10 (attained age 55 at EOY). All table values are illustrative std (the shipped CV/NSP tables are generated on 2017 CSO / 4% as specified above); i_g = 4.00% [S1], i_d = 6.00% std.

Step

Item

Formula

Value

1

Guaranteed CV, BOY (EOY 9)

CV_9 (table)

9,500.00 std

2

Guaranteed CV, EOY

CV_10 (table)

11,200.00 std

3

Net level premium (NF basis)

NP_g

1,300.00 std

4

Guarantee mortality, age 54

q^g_54

0.00320 std

5

Scale mortality, age 54

q^{sc}_54 = 0.70 · q^g_54

0.00224 std

6

Interest margin

(0.06 0.04) · (9,500 + 1,300)

216.00

7

Mortality margin

(0.00320 0.00224) · (100,000 11,200)

85.25

8

Expense margin

e^m_10

25.00 std

9

Dividend

D_10 = 216.00 + 85.25 + 25.00

326.25

10

NSP at age 55

NSP_55 (table)

0.42 std

11

PUA face purchased

ΔPUAF = 326.25 / 0.42

776.79

12

PUA face, EOY (prior 4,100.00 std)

PUAF_10 = 4,100.00 + 776.79

4,876.79

13

PUA cash value, EOY

PUACV_10 = 4,876.79 × 0.42

2,048.25

14

Death benefit for year 11 deaths

F + PUAF_10

104,876.79

15

Surrender value, EOY 10

CV_10 + PUACV_10

13,248.25

(For clarity the PUA-block dividend D^PUA_10 is omitted from this table; in the model it adds (0.02 · PUACV_9) + (0.00096 · (PUAF_9 PUACV_9)) to the amount in step 9 std.)

Valuation and reserve pointers (brief)#

This library projects gross liability cash flows; statutory, tax, and GAAP measurement are separate layers, cited not reproduced:

  • Statutory: Standard Valuation Law root REG-R1, codified in the AP&P Manual as Appendix A-820 and now read in full — ¶11 CRVM, ¶¶7–10 the valuation interest rate, ¶16 the aggregate nonforfeiture floor, ¶¶19–20 deficiency reserves, ¶¶24 and 27 the formulaic/PBR boundary REG-R153; A-830 likewise REG-R154, though ¶3.b routes no calculation paragraph to a level-premium level-benefit whole life. Both were “not retrieved” behind the VM-A index entry REG-R110 and no longer are. For issues on/after 2020-01-01 — a date that is the PBR accreditation year, the statutory-law trigger A-820 ¶¶3–4 prints being 1 January 2017 — VM-20 minimum reserve = f(net premium reserve, deterministic reserve, stochastic reserve) with exclusion tests; seriatim NPR on 2017 CSO; traditional par WL typically passes the deterministic exclusion test (valuation net premiums ≤ guaranteed gross premiums) and many WL blocks hold NPR only R3. Small companies under the Life PBR Exemption (< $300M) value under VM-A/VM-C (pre-PBR CRVM) R3. ASOP 52 governs the actuary’s PBR work REG-R31.

  • Tax: IRC §807 — greater of net surrender value and 92.81% of the CRVM/VM reserve, capped at statutory REG-R16; the statutory engine plus a haircut/cap wrapper.

  • GAAP: LDTI (ASU 2018-12) rewrites long-duration GAAP (annually updated cash flow assumptions, single-A discounting through OCI) REG-R34 — not fetched; characterization corroborated only by secondary summaries. Same projected cash flows, different measurement overlay — the reason projection and measurement are separated in this library.

  • Model governance: ASOP 56 (modeling) REG-R32 and, for cash-flow analysis engagements, ASOP 7 REG-R27 — listed in the regulatory bibliography frame validation/documentation expectations for the implementation itself.

Key sensitivities and model risks#

Dominant assumptions (in typical order of impact on par WL liability value):

  1. Dividend scale vs. guarantee spread (i_d i_g, mortality margin, expense margin): drives dividends, hence PUA growth, hence death benefit and surrender value trajectories — compounding because PUAs themselves earn dividends [S14]. The DIR snapshot is a declared, changeable rate (observed 5.75%–6.60% for 2026 alone [S4] [S14]); scale-change dynamics are a scenario input, not a model constant.

  2. Best-estimate mortality (level and improvement vs. 2015 VBT REG-R18, A/E per ILEC R9): sets both claim outgo and the mortality margin of the dividend; note the same table family feeds two places with opposite signs — a consistency trap.

  3. Lapse: low and level for par WL, but long-duration liabilities are convex in lapse; illustration regulation exists precisely because lapse-supported scales misstate value R2. Verify the model is not inadvertently lapse-supported when testing dividend scales.

  4. Expense inflation on per-policy maintenance for a product with 55+-year horizons.

  5. Loan utilization under direct recognition [S1] [S3]: shifts dividend composition and net cash flow timing; the fixed-6%/DIR-6% snapshot coincidence (zero adjustment) will not survive a scale change.

Known modeling pitfalls:

  • CV-table vs. first-principles mismatch: if the CV table input and the NSP/annuity functions come from different bases, PUACV PUAF at age 100 and the dividend recursion leaks. Regenerate all guarantee-basis quantities from one 2017 CSO / 4% source [S1] R1 R8.

  • Dividend floor and negative margins: with D_t floored at 0 std, adverse experience does not claw back — asymmetry matters in stochastic runs.

  • First-dividend timing (year 1 vs 2) shifts early-duration PUA compounding; it is a real cross-carrier difference [S1] [S3], keep it a parameter.

  • MEC administration on limited-pay variants: 10-pay premiums approach 7-pay limits; face decreases can retroactively create MECs and PUA-rider payments consume 7-pay room R5 [S3] [S1]. The reference model does not police §7702/§7702A limits R4 R5 — flag model points that would fail rather than silently projecting them std.

  • Truncation at age 100 std is exact for surrender/maturity amounts but reallocates age-100–121 payments from death to maturity; do not use the truncated model for mortality-timing-sensitive measures beyond age 100 [S1].

  • State variations (FL maturity 120, WA face minimums, ND suicide, MT unisex) [S6] [S7] [S8] [S1] are not modeled; the reference is a generic-state contract std.