CAS Ratemaking Working Group · every lever predict_clv() has,
driven from a browser · toolkit cas_clv v1.1 · seed 42
What this is, and which mode you want
Two calculators. They answer different questions, and only one of them can be exact about
retention.
Book average
Values the fitted 5,000-customer
synthetic book, one model family at a time. A faithful factorisation of
predict_clv() — not an approximation. Use it to ask
“what does this assumption do to the book?”
Single customer
A discrete term-by-term calculation
on an explicit flat retention path. No fitted model, every cell checkable by hand. Use it
to ask “does this reproduce my spreadsheet, and where does it differ?”
The page verifies itself: it recomputes a suite of Python-generated golden
vectors on load and reports the worst deviation.
checking…
Assumptions
Preset
Model family
Tenure basis
Tenure convention
Expense treatment
Customer lifetime value
Base variant — P − L − E
—
P − L − E only. Defensible in an indication.
With-growth variant — adds cross-sell and upsell
—
Net of acquisition — new business
—
Year-by-year build-up
The same numbers as a table
Year
Expected renewals
Loss multiplier
Effective loss ratio
Discount factor
Base contribution
Growth contribution
Cumulative (with growth)
The footer row is the headline, by construction — base sums to the
base card and base + growth sums to the with-growth card. A number you cannot trace to a row is
a number you should not trust.
At, Bt and Nt are the
book's premium-weighted, loss-weighted and plain expected renewals for future year
t, exported undiscounted so the page applies your own discount rate.
sP and sL scale them to your premium and loss
ratio, F is fixed expense per term, and Xt is the growth
weight — cross-sell carrying the one-time first-occurrence weight
(1−p)t−1p and upsell the permanent step-up
1−(1−q)t.
The tenure multiplier mt is exact at any horizon and discount
rate, not interpolated from a grid. Writing At for the loss-weighted
mean relative multiplier at full trend, the blend is
1 + trend·(At−1) — linear, because the loss weights do
not depend on the trend. The revenue-neutral basis then applies one scalar,
k = 1/(1+trend·(B−1)), with B the same ratio pooled across
the horizon under your discount factors.
Try this. On the revenue-neutral basis, drag the tenure trend from 0 to 1. The two
headline figures do not move — but every row of the table does. That is the
revenue-neutral property, visible rather than asserted: the curve redistributes expected loss
across tenure without changing the book's total. Switch to level-effect and the headline moves,
because that basis is a forward-looking assumption about loss improvement rather than a
relativity.
Honest limits
Book mode is a book average, not a per-customer prediction. For per-customer CLV,
fit a model and call predict_clv().
Retention differs by mode, deliberately. Single-customer mode carries retention
exactly. Book mode offers a retention shock, which is the toolkit's own
documented book-level approximation — a ratio of flat-retention annuities, because
re-estimating per-customer retention would need a refit and a static page cannot refit.
A reviewer who wants a precise retention path wants single-customer mode.
Premium and loss ratio scale proportionally. Changing them rescales the fitted
book rather than refitting it, so the renewal pattern is held fixed.
The 30-year horizon is an extrapolation past about year 10. The synthetic book
carries roughly ten years of history; beyond that the renewal pattern is the model's
extension of its own fit, not something the data evidences.
The additive tenure convention is not the toolkit's. It is offered because a
reviewer's spreadsheet may read the credit as loss-ratio points per year, and seeing the
difference is the point. The toolkit compounds.
No price elasticity anywhere. There is no rate-change or conversion lever and there
will not be one — a test asserts that the survival covariates cannot gain one. That
invariant is what keeps the filing-side exhibits free of demand-based content.
Synthetic book. Coefficients come from 5,000 seeded synthetic customers, not a real
carrier.
Payload and golden vectors generated by
python scripts/build_clv_planner.py (set_seed(42)), which refuses to
write unless the Python reference in cas_clv.planner_reference reconciles to
predict_clv() across a sweep of lever combinations and reproduces the reviewed
worked example both as written and as corrected. Related:
review-response register ·
cohort deep dive.
This research project has been funded by the Casualty Actuarial Society.