Technical Notes#
Status: Draft, 2026-08-03 (all cited sources accessed 2026-08-03).
Scope note. These notes specify a reference liability cash-flow projection model
for the standardized composite product defined in product-spec.md (same directory).
This is not any single insurer’s product. [S#]/[R#] tags refer to the source list in
_research/universal-life.md; [REG-R#] tags refer to the cross-product reference
library references/regulatory-and-actuarial-references.md (its own R-numbering;
research provenance in _research/regulatory-actuarial.md). std marks
standardizations introduced for the reference implementation. Parameter values are
identical to those in product-spec.md; the implementation anchor for mechanics is
the Pacific Life Versa-Flex PRO specimen policy S3.
Revision note, 2026-08-06. The reserve material under “Valuation and reserve pointers” was revised when the AP&P Manual appendix items were read at first hand from the free As of March 2026 download: A-585 (universal life) REG-R155, A-820 with A-821 and A-822 REG-R153 and A-830 REG-R154. The shared reference numbering now runs R1–R157, with most of the R73–R149 block unused. Nothing outside those paragraphs was re-dated, and no std or unverified marker elsewhere in this file was upgraded: every standardization here is a product-parameter choice made because insurers do not publish current scales S3 S5, a limit the appendix reading does not touch.
Model scope and conventions#
Purpose. Project gross liability cash flows (premiums, death claims, surrender and withdrawal payments, expenses, loan flows optional) for a single-policy model point of current-assumption fixed UL, on a monthly grid. Reserves are not computed (see Valuation and reserve pointers).
Projection frequency. Monthly. The contract credits interest daily on a 365-day year S3; the model discretizes to monthly compounding std: one month of interest is applied at the end of each policy month to the post-deduction balance.
Timing / monthiversary processing. All policy transactions are processed on the monthiversary (the monthly payment date — the same day each month as the policy date S3), at the beginning of the policy month (BOM); interest accrues over the month and is credited at end of month (EOM) std. The monthly deduction taken at BOM pays for that policy month’s coverage (the specimen states the deduction provides coverage for the following policy month S3; with BOM indexing the deduction at the start of month t covers month t).
Age basis. Age nearest birthday (ANB) std. Rationale: the specimen’s nonforfeiture basis is 2001 CSO ANB S3, the SOA/LIMRA UL study methodology is ANB R7, and the 2017 CSO/2015 VBT families provide ANB variants R4 REG-R18.
Model points. Single-policy model points, projected on an expected (probability-weighted) basis: survivorship factors multiply per-policy cash flows. No aggregation logic is specified here.
Decrement order within a month. Contractual transactions first (BOM), then decrements (death, lapse) treated as EOM events std (see processing order).
Rounding. Intermediate values carried at full precision; cash flows reported to cents std. (Production admin systems round per-transaction; the specimen is silent on model rounding.)
Model point attributes#
Attribute |
Type |
Example (anchor cell S3) |
|---|---|---|
|
int (ANB) |
35 |
|
enum {M, F} |
M |
|
enum (6 classes, spec table) |
Standard NT |
|
currency |
100,000 |
|
enum {A, B} |
A |
|
enum {GPT} (CVAT out of scope) |
GPT |
|
date / int |
month 1 |
|
currency |
1,800 std |
|
enum {level, single, target} |
level std |
|
enum {monthly, annual} |
monthly std |
|
currency (0 at issue; >0 for in-force cells) |
0 |
|
currency |
0 |
|
schedule per $1,000 |
$9.00 initial, 9-yr std |
|
currency (compliance input) |
34,138.15 S3, incl. riders |
|
currency (compliance input) |
2,825.52 S3, incl. riders |
|
currency (compliance input) |
6,702.10 S3, incl. riders |
State variables#
Variable |
Description |
Updated |
|---|---|---|
|
Account value (the specimen’s “accumulated value”) at end of policy month t |
monthly recursion |
|
Total face amount (after any option changes/withdrawal-driven reductions) |
on events |
|
Death benefit in month t after corridor test |
monthly |
|
Net amount at risk for COI in month t |
monthly |
|
Surrender charge in month t |
monthly amortization |
|
Policy loan balance (with capitalized interest) |
monthly |
|
Cumulative premiums less withdrawal offsets (GPT/7-pay tracking) |
monthly |
|
In-force probability at end of month t (survivorship) |
monthly decrements |
|
In-grace indicator and months-in-grace counter |
monthly |
|
Free-withdrawal usage in current policy year |
on withdrawal |
Assumption inputs#
Three classes are distinguished explicitly. Class (a) is contractual and cannot be changed by the insurer; class (b) is the insurer-declared current scale (an NGE under ASOP 2 R8); class (c) is the modeler’s view of policyholder/insurer experience.
(a) Contractual / guaranteed elements (from the spec)#
Input |
Value |
Basis |
|---|---|---|
Guaranteed minimum annual interest |
2.00% |
|
Guaranteed max COI rates |
specimen table by policy year s (spec, charges table) |
|
Guaranteed max premium load |
9% |
|
Per-policy charge (guaranteed = current) |
$7.50/month to age 121 |
|
Per-unit charge |
$0.26/$1,000/mo yrs 1–10; $0.156 to age 121 |
|
Surrender charge schedule |
$9.00/$1,000 initial, linear monthly runoff, 0 from year 10 |
|
Corridor factors (GPT) |
specimen table 250% (ages 0–40) → 101% (94+) |
|
Loan spread (charged − credited on loaned AV) |
0.75% |
|
Grace |
61 days; required payment 3xMD + load |
|
Charges cease / premiums stop |
attained age 121 |
(b) Current non-guaranteed scales (snapshot; revisable NGEs R8)#
Input |
Value |
Basis |
|---|---|---|
Current credited annual rate |
4.00% |
std — current declared rates are not public; the one rates page attempted returned HTTP 403 S5 |
Current COI scale |
60% x guaranteed max, all durations |
std — current COI scales are not public; only guaranteed maxima appear in the specimen S3 |
Current premium load |
6% |
|
Current per-policy charge |
$7.50/month |
NGE revision logic (optional module): under ASOP 2, scales are revised only on changes
in anticipated experience factors, with no recouping of past losses and prospective
profitability not materially greater than original R8. A simple reference rule:
i_cr(t) = max(i_guar, earned_rate(t) − spread) with a constant spread std;
the base projection holds the snapshot scales level.
(c) Behavioral / experience assumptions (modeler’s view)#
Input |
Recommended public basis |
Basis tags |
|---|---|---|
Best-estimate mortality |
2015 VBT (sex/smoker-distinct, ANB) x 100% A/E std factor; monitor against ILEC 2012–2019 A/E experience |
|
Mortality improvement |
None in base std |
— |
Guaranteed-element mortality reference |
2017 CSO (cap for guaranteed COI; valuation/nonforfeiture basis for new issues) |
R4 REG-R17; COI-cap role [unverified — search-result context] |
Base lapse/surrender |
SOA/LIMRA UL studies (2015–2021 UL persistency & lapse; 2009–2013 all-product persistency); detailed tables are behind the paid package, so the reference table below is std |
|
Premium persistency |
SOA/LIMRA 2015–2021 UL study: premium persistency (paid/planned) highest in year 1 (dump-ins); current-assumption products highest ongoing persistency |
|
Maintenance expense |
$75/policy/year, inflating 2.5%/year |
|
Premium tax / percent-of-premium expense |
2.5% of premium |
Reference base lapse table std (annual rates, all calibration to be replaced by the user’s experience; shape informed qualitatively by R7 REG-R20):
Policy year |
1 |
2 |
3–9 |
10 |
11+ |
|---|---|---|---|---|---|
Annual lapse |
6% |
5% |
4% |
4% x shock (below) |
3% |
Reference premium persistency factors pp(y) std (fraction of planned premium
actually paid, level-pay pattern): 100% in year 1, declining 2 percentage points per
year to a 70% floor (year 2: 98%, year 3: 96%, …, floor from year 16).
Cash flow components and recursions#
Notation (defined once, used throughout)#
Symbol |
Meaning |
|---|---|
t |
policy month index, t = 1, 2, … (t=1 is the issue month); y = policy year = ceil(t/12); x = issue age; attained age = x + y − 1 (ANB) |
|
total face amount (per policy) |
|
units of face = F / 1000 |
|
gross premium received at BOM of month t |
|
current premium load rate (0.06) |
|
net premium = GP(t) x (1 − pl) |
|
partial withdrawal amount at BOM of month t (plus fee |
|
per-policy charge ($7.50/month) |
|
per-unit charge per $1,000/month (0.26 yrs 1–10; 0.156 yrs 11 to age 121; 0 after) |
|
rider charges (0 in base model) |
|
current monthly COI rate per $1,000 NAAR at policy year s = 0.60 x q_coi_guar(s) |
|
guaranteed annual effective rate (0.02) |
|
current credited annual effective rate (0.04) |
|
monthly credited rate = (1 + i_cr)^(1/12) − 1 = 0.0032737 (derived) |
|
monthly guaranteed rate = (1 + i_guar)^(1/12) − 1 = 0.0016516 (derived) |
|
|
|
AV after premium and withdrawal, before monthly deduction |
|
monthly deduction |
|
net amount at risk |
|
death benefit after corridor test |
|
surrender charge; |
|
loan balance; |
|
best-estimate monthly mortality rate; |
|
in-force probability at end of month t; l(0) = 1 |
Dimensional check: q_coi is per $1,000 per month, so COI charge = q_coi/1000 x NAAR
is in currency; e_unit x U is currency; all MD components are currency/month.
Monthly processing order (monthiversary, per the specimen S3; discretization std)#
At BOM of month t (skip steps 2–7 from attained age 121: charges cease, premiums not accepted S2 S3):
Set policy year y, attained age a. Amortize surrender charge:
SC(t) = max(0, (9.00 − t/12) x U)(per-layer if face increases are modeled) [std amount; mechanics S3].Premium:
GP(t)per the premium pattern and persistency assumption; check GPT guideline limit and 7-pay limit (compliance side-calculation — see below); deduct load; creditNP(t)to AV. (If L(t−1) > 0, unallocated payments repay the loan first unless designated premium S3 — base model designates all as premium.)Withdrawal: deduct
W(t) + wf; apply free-amount rule (10% of AV per policy year std); under Option A reduce F if the withdrawal would otherwise increase NAAR beyond the free amount S3. After steps 2–3:AV'(t) = AV(t−1) + NP(t) − W(t) − wf x 1{W>0}.Death benefit and corridor:
DB(t) = max(optionDB(t), cf(a) x AV'(t))whereoptionDB = F(Option A) orF + AV'(t)(Option B) S1 S3; corridor per GPT S3 R2.NAAR (specimen discounting convention — DB discounted one month at the guaranteed rate; AV measured before the deduction S3):
NAAR(t) = DB(t) / (1 + i_gm) − AV'(t), floored at 0. (The specimen states this as DB / NAAR-factor with factor 1.03^(1/12) = 1.0024663 at its 3% guarantee S3; at the composite 2% guarantee the factor is 1.02^(1/12) = 1.0016516, derived.)Monthly deduction:
MD(t) = e_pol + e_unit(y) x U + rc(t) + q_coi(y)/1000 x NAAR(t)S3.Shortfall test: if
AV'(t) − L(t−1) < MD(t), enter grace S2 S3 (see grace logic); otherwise deduct: AV after deduction =AV'(t) − MD(t).Interest (EOM): credit one month at the current rate on unloaned AV and at the guaranteed rate on the loaned portion; accrue loan interest at r_L [std discretization of daily crediting S3]:
AV(t) = (AV'(t) − MD(t) − L(t−1)) x (1 + i_m) + L(t−1) x (1 + i_gm)L(t) = L(t−1) x (1 + r_L)^(1/12)(capitalized annually per contract S3; monthly compounding std).Decrements (EOM): deaths at
q_m(t), lapses/surrenders atw_m(t)applied to survivors; updatel(t) = l(t−1) x (1 − q_m(t)) x (1 − w_m(t))[std order: death before lapse].
With no loans and no withdrawals, steps 2–8 collapse to the core recursion:
AV(t) = [ AV(t−1) + NP(t) − MD(t) ] x (1 + i_m)
with NP(t) = GP(t) x (1 − pl), matching the contractual roll-forward in which the
policy-date AV equals net premium minus the first monthly deduction S3.
Grace and lapse-for-insufficiency logic#
Trigger (month t):
AV'(t) − L(t−1) < MD(t)on a monthiversary S2 S3. (Model 585 default defines lapse at NCSV = 0 with >= 30-day grace R1; the composite follows the specimen trigger.)During grace (61 days ≈ 2 policy months std): coverage continues; deductions accrue as due-and-unpaid; if death occurs, claim = DB − L − overdue deductions S3.
Required cure payment: >= 3 x MD due plus premium load S3. In the deterministic base model, planned-premium payers are assumed to cure if
pp(y) x planned >= curestd; otherwise the policy lapses at the end of the second month in grace with zero payment (terminates without value S3).Reinstatement is not modeled (contractual provision only S3) [std scope].
Cash flow outputs (per policy, month t, before survivorship weighting)#
Cash flow |
Formula |
Sign |
|---|---|---|
Premium income |
GP(t) |
+ |
Death claims |
DB(t) − L(t−1) − overdue deductions (in grace) S3 |
− |
Surrender outgo |
NCSV(t) = AV(t) − SC(t) − L(t) |
− |
Withdrawal outgo |
W(t) (fee wf retained by insurer) |
− |
Maintenance expense |
75/12 x (1.025)^(y−1) std |
− |
Percent-of-premium expense |
0.025 x GP(t) std |
− |
Loan flows (optional) |
new loans −, repayments + |
+/− |
Aggregate expected cash flows multiply each row by the appropriate in-force factor: premiums/expenses by l(t−1); death claims by l(t−1) x q_m(t); surrenders by l(t−1) x (1 − q_m(t)) x w_m(t) [std timing].
Policyholder behavior modeling#
All dynamic formulas are std reference constructions; calibration sources are cited where they exist.
Premium patterns std.
level: GP(t) = planned/12 x pp(y) each month (pp per the persistency table);single: one premium at issue capped at GSP, no further premiums;target: GP as level but capped so CumPrem stays within the GPT limit. Qualitative anchors: year-1 premium persistency is highest (dump-ins), and current-assumption products show the highest ongoing paid-to-planned ratios after early years R7.Base lapse std. Annual
w_base(y)per the table above, converted monthly:w_m = 1 − (1 − w_annual)^(1/12).Surrender-charge-expiry shock std. During policy year 10 (the first year with SC = 0):
M_sc = 2.0; else 1.0. Rationale: the surrender charge suppresses surrender while it is positive; its expiry is a known industry lapse-shock point (product-specific studies are proprietary; shape assumption).Interest-sensitive (dynamic) lapse std.
M_rate(t) = min(3.0, 1 + 5 x max(0, r_comp(t) − i_cr(t) − 0.01))wherer_compis a competitor/market new-money rate input. Base deterministic run:r_comp = i_cr, so M_rate = 1.Total lapse.
w_annual(y,t) = min(0.35, w_base(y) x M_sc(y) x M_rate(t))[std cap].Premium suspension std. Implicit in pp(y) < 1; no separate paid-up state is modeled.
Worked example#
Anchor cell: Male 35 Standard NT, F = $100,000 (U = 100), Option A, GPT; GP = $150/mo; pl = 6% → NP = $141.00; e_pol = $7.50; e_unit = 0.26 → $26.00/mo; guaranteed COI year 1 = 0.10090 S3, current = 60% → q_coi = 0.060540 per $1,000/mo std; i_m = 0.0032737 (from i_cr = 4.00% std); 1 + i_gm = 1.0016516 (from i_guar = 2.00% std); DB/(1+i_gm) = 100,000 x 0.9983511 = 99,835.11; corridor 250% x AV’ never binds at these AV levels S3. No withdrawals or loans. All figures in dollars, rounded to cents for display (full precision carried).
Month t |
AV(t−1) |
NP |
AV’ |
DB |
NAAR = 99,835.11 − AV’ |
COI = 0.06054xNAAR/1000 |
MD = 7.50+26.00+COI |
AV’−MD |
Interest (x i_m) |
AV(t) |
|---|---|---|---|---|---|---|---|---|---|---|
1 |
0.00 |
141.00 |
141.00 |
100,000 |
99,694.11 |
6.04 |
39.54 |
101.46 |
0.33 |
101.80 |
2 |
101.80 |
141.00 |
242.80 |
100,000 |
99,592.32 |
6.03 |
39.53 |
203.27 |
0.67 |
203.93 |
3 |
203.93 |
141.00 |
344.93 |
100,000 |
99,490.18 |
6.02 |
39.52 |
305.41 |
1.00 |
306.41 |
Trace, month 1: AV’ = 0 + 141.00; corridor min = 2.50 x 141.00 = 352.50 < 100,000 so DB = 100,000; NAAR = 99,835.11 − 141.00 = 99,694.11; COI = 0.060540/1000 x 99,694.11 = 6.0355 (displayed 6.04); MD = 7.50 + 26.00 + 6.0355 = 39.5355 (displayed 39.54); AV(1) = (141.00 − 39.5355) x 1.0032737 = 101.80. Month-1 shortfall test: AV’ (141.00)
= MD (39.54), no grace. This reproduces the contractual policy-date rule AV = net premium − first monthly deduction S3, followed by one month’s interest.
Valuation and reserve pointers#
This library projects gross liability cash flows; reserve layers consume them and are NOT reproduced here:
Statutory (pre-PBR / formulaic). The UL CRVM adaptation as printed at AP&P Appendix A-585: Guaranteed Maturity Premium / Guaranteed Maturity Fund construction, the funding ratio —
r = min(1, policy value/GMF)here only because this chassis is flexible premium,r ≡ 1unconditionally for a fixed premium UL — and the ¶¶12–13 alternative minimum reserve, with every rate, table and factor delegated to A-820 by year of issue REG-R155 ¶¶8, 12–13 REG-R153. Nonforfeiture floor: Model 585 Section 6A retrospective minimum CSV — A-585 carries no nonforfeiture provisions at all, so that floor stays with the model regulation R1 REG-R5 REG-R155.Statutory (PBR). VM-20 minimum reserve for life products (net premium reserve plus deterministic/stochastic excess subject to exclusion tests), per the Valuation Manual (operative 2017-01-01; accreditation standard 2020-01-01 — both verbatim at R5, now also the shared REG-R150) REG-R3; implementation guidance in the AAA VM-20 practice note REG-R23. Prescribed NPR mortality: 2017 CSO family via VM-M REG-R3 [REG-R17; exact table mapping unverified](#uslib-reg-r17).
Tax. IRC 807: greater of net surrender value and 92.81% of the NAIC-method reserve, capped at statutory REG-R16.
Standards for the modeling work itself. ASOP 7 (life cash flow analysis) REG-R27; ASOP 52 (PBR reserves) REG-R31; ASOP 56 (modeling: validation, documentation, model risk) REG-R32; NGE determination under ASOP 2 R8.
Key sensitivities and model risks#
Dominant assumptions (in rough order for a cash-value-oriented block):
Credited-rate spread and current COI scale (the NGE pair). They set the AV growth net of charges and hence funding adequacy, surrender values, and the grace/lapse cascade. Both are std snapshots here because insurers do not publish them S3 S5; sensitivity-test the 60% COI factor and the 4.00% credited rate first.
Premium persistency. UL cash flows are premium-behavior-driven; paid/planned ratios vary by product focus and duration R7. Underfunding accelerates shortfall-driven lapse; dump-ins interact with GPT/7-pay limits.
Lapse/surrender, especially at surrender-charge expiry. Current-assumption UL charge structures can be lapse-supported; the year-10 shock multiplier materially moves the value of later-duration COI margins.
Mortality at high attained ages. COI rates grade to 1000/12 at ages 112–120 and to zero at 121+ while coverage continues S3; late-age mortality assumptions drive the cost of the post-121 charge-free period.
Known modeling pitfalls:
Deduction/interest ordering. The recursion applies interest to the post-deduction balance; reversing the order overstates AV by roughly one month’s interest on MD each month and compounds over decades.
NAAR convention. The specimen discounts DB one month at the guaranteed rate and measures AV before the deduction S3. Using the current rate in the discount, or AV after deduction (which makes COI implicit and requires iteration), produces small but systematic COI errors.
Corridor circularity under Option B. DB depends on AV’ and NAAR depends on DB; with the BOM ordering above there is no simultaneity, but corridor-active cells (heavily funded, older ages) are sensitive to where in the order AV is measured.
Daily-vs-monthly interest. The contract credits daily on a 365-day year S3; monthly discretization is a std approximation — do not also compound daily, and document the convention when reconciling to admin-system values.
ANB vs ALB mismatch. Mortality/corridor lookups must match the std ANB basis; the 2017 CSO/2015 VBT families ship both variants R4 REG-R18.
Era mixing. The guaranteed COI table is a 2001 CSO-era specimen table S3 paired here with a 2%-guarantee-era interest assumption std; a production model for post-2020 issues should substitute a 2017 CSO-capped guaranteed table (not publicly obtained — research gap) R4 unverified.
Grace-period timing. The 61-day grace spans two monthiversaries; skipping the due-and-unpaid deduction accrual understates death claims in grace S3.
MEC/GPT are not cash flows. Modeling them as charges or refunds distorts premium income; they are caps/flags only S3 R2 R3.