The Rente_FR_S Model#
Reference liability cash flow model for the French rente viagère immédiate.
Rente_FR_S is the executable counterpart of
products/rente_viagere/technical-notes.md in the lifelib-products library. It
projects gross best-estimate liability cash flows for a single French immediate life
annuity in payment: the arrérages to the annuitant, the prorata d’arrérages settled
on death, the réversion stream, the frais d’arrérages the insurer retains out of
each quittance, and maintenance expense.
Mortality is the model. After conversion the contract has no premiums, no surrender value at any duration, no account value and no policyholder option of any kind. The only decrements are deaths. There is no lapse machinery anywhere in this model and that is a cited product feature, not an omission.
The UK counterpart in the same library is PA_UK_S and the US one
SPIA_US_S; the three share the payout chassis, so lives_if, lives_death,
certain_floor, payment_factor, payment_surv_mth, cum_annuity_pp,
annuity_pp, annuity_payments, pols_if and liability_cf mean the same
thing on all three and can be laid side by side. Where France parts company:
the mortality basis is a generational table keyed on
(sex, birth_year, age), so there is no improvement scale and no calendar-year argument — the trend is inside the table, and animprove_factoron top of it would double-count;the tariff is unisex by law and struck on the more prudent table for every life, while the best estimate is sex-dependent, so the two are separate objects and the gap between them is the surplus the eight-year profit-sharing rule sends back;
revalorisation is a discretionary annual uplift credited at 31 December, pro-rated in the first partial calendar year and floored at zero — a calendar event, never a policy anniversary;
the frais d’arrérages are retained out of every payment, including the prorata settled on death, which is why they are a cash flow rather than a pricing loading; and
the month of death is paid in full: the accrued arrears go to the heirs.
Spaces. The model contains two:
DataReads the three input CSVs and holds their filename References. It takes no parameters, so each file is read once per model.
ProjectionThe by-contract projection, parameterized by
point_id:Projection[1]is an ItemSpace projecting model point 1. It reaches the input tables through itsdataReference, which resolves to the singleDataSpace.
The split matters for more than tidiness. Because Projection is parameterized, every
Projection[N] is a separate ItemSpace with its own cells cache; readers placed there
would re-read every file for every contract, and the generational mortality table is the
largest input in this library. In Data they are evaluated once, however many
contracts are projected.
Input data is external: CSVs in the model folder’s parent directory, read at run time rather than stored inside the model. The model folder itself holds no data, so the model and its inputs must travel together.
Projection basis. Monthly steps from the effective date, which is always the 1st day
of a civil month. The month index t is 0-based: t = 0 is the first projected
month — the first whole civil month of service — and the frame is
t = 0, 1, …, proj_len() - 1, so proj_len() is the number of months projected and
policy_year(t) = t // 12 + 1. The model therefore carries the calendar — the
effective year and civil month — and not merely the duration, because revalorisation and
expense inflation step at 31 December while the paliers and the attained ages step on
12-month multiples of the effective date. Age is age last birthday; the millésime (year of birth) is a
separate model point attribute and is never derived from the projection year. The
limiting age is 120, the published top age of the tables, and the projection runs to the
last month of age 119 of the youngest covered life, t = proj_len() - 1 — stopping
on the annuitant’s age alone would truncate a younger reversionary’s tail.
What is sourced and what is not. The contractual mechanics are sourced: the instalment formula and its terme échu timing, the rule that the arrérage of the month of death is due in full, the reversion at a stated percentage of the rente atteinte starting the month after death, the definitive reversion coefficient and its published age-difference table, the annuités garanties as an annuity-certain floor and their exclusivity with the reversion, the four paliers schemes, the 31 December revalorisation date with its first-year pro-rating and its zero floor, the frais d’arrérages per quittance, the frais sur encours de rentes biting on the provision rather than on the instalment, the absence of any surrender value, and the statutory commutation threshold. Every rate is a standardization. TGH05/TGF05 are annexed to the Code des assurances and are not redistributable here, so the mortality basis shipped with the model is a [std] INSEE-shaped generational proxy, anchored so that the tariff annuity factor reproduces the notes’ placeholder taux de rente exactly; no French insurer publishes an annuity rate card. This model is a mechanics demonstration, not a pricing or reserving result. Replace the basis with a licensed same-schema file before drawing any conclusion from the output.
Verification. tests/test_rente_viagere_fr.py asserts the notes’ worked example
row by row to the cent, including the 1.125% pro-rated first uplift reaching the month-9
instalment, the whole instalment settled as a prorata on the month-25 death, and the
reversion starting at 60% of the rente atteinte in month 26.
Example
>>> import modelx as mx
>>> model = mx.read_model("products/rente_viagere/Rente_FR_S")
>>> model.Projection[1].result_cf()