predict_clv() has,
driven from a browser · toolkit cas_clv v1.1 · seed 42Research preview — shared for Project Oversight Group review. This calculator accompanies a Casualty Actuarial Society research project on customer lifetime value in property-casualty ratemaking. The manuscript is under review and not yet published, and the figures here are not a published result.
Every coefficient comes from a
seeded synthetic book of 5,000 customers — no real carrier or agency data is used
anywhere in this project. The research was funded by the Casualty Actuarial Society under an
agreement executed 21 May 2026, and all rights in the work, including copyright, are assigned
to the CAS. The companion toolkit will be released at github.com/casact under the
Mozilla Public License 2.0. Please do not redistribute these figures ahead of publication.
Two calculators. They answer different questions, and only one of them can be exact about retention.
predict_clv() — not an approximation. Use it to ask
“what does this assumption do to the book?”The page verifies itself: it recomputes a suite of Python-generated golden vectors on load and reports the worst deviation. checking…
| 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.
predict_clv().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.