The Data Space#
Input data shared by every by-policy projection.
The nine input CSVs are read here, once per model, and referenced from
Projection as data. Projection is
parameterized by point_id, so each Projection[N] is a separate ItemSpace with its
own cells cache; if the readers lived there, every model point would re-read every file.
Holding them in an unparameterized Space reads each file once no matter how many policies
are projected.
Inputs are external files: plain CSVs in the model folder’s parent directory,
products/pflegerentenversicherung/, rather than data stored inside the model. The
model folder therefore holds nothing but formulas — no _data/, no IOSpec, no embedded
values — so a diff of the model shows logic changes only. This follows
annuallife.TradLife_A; contrast basiclife.BasicTerm_S, which keeps its inputs
inside the model through modelx’s IOSpec machinery.
The consequence worth knowing: the model is not portable on its own. Copying the
Pflege_DE_S folder without its parent’s CSVs produces a model that reads and then
fails on first evaluation.
input_dir() resolves the directory from _model.path.parent at run time, so the
model works wherever the repository is checked out. Each table has a filename Reference
and a reader Cells:
Reference |
Cells |
File |
|---|---|---|
model_point_file |
model_point_table() |
model_point_table.csv |
benefit_scale_file |
benefit_scale_table() |
benefit_scale_table.csv |
mort_table_file |
mort_table() |
mort_table.csv |
incidence_file |
incidence_table() |
incidence_table.csv |
care_file |
care_table() |
care_table.csv |
lapse_file |
lapse_table() |
lapse_table.csv |
surrender_file |
surrender_table() |
surrender_table.csv |
expense_file |
expense_table() |
expense_table.csv |
basis_file |
basis_table() |
basis_table.csv |
Every file but model_point_table.csv carries a final provenance column, one tag
per row — the library’s second ruling, asserted by
tests/test_model_conventions_de.py. A model point is a configuration rather than an
assumption, which is why it is the single exemption.
The tables are [std] proxies, and what a replacement must preserve
DAV 2008 P, the German market’s standard multi-state *Pflegetafel*, is the property of
the Deutsche Aktuarvereinigung, is not public, and is not redistributed by this library.
Neither is DAV 2008 T, DAV 2004 R or any other DAV table. They are cited by name in
sources.md and nothing here is derived from them. What ships instead is a set of
shaped proxies, and the anchors below are what a substitute must reproduce for the
technical notes’ worked example to close to the cent:
mort_table.csv— active-life mortality, a Gompertz proxy1 - exp(-B c**age)by sex over ages 18 to 108, withmort_rate = 1.0at age 109. Anchored atq(65) = 1.35 %andq(85) = 10.5 %male,q(65) = 0.75 %andq(85) = 7.0 %female, which fixB_M = 1.47884e-05,c_M = 1.110680,B_F = 4.76290e-06,c_F = 1.119962. A replacement must preserve those four anchor rates.incidence_table.csv— the rate at which an active life enters any Pflegegrad,min(I0 exp(g (age - 65)), 0.50)withI0_F = 0.0110,g_F = 0.1400,I0_M = 0.0085,g_M = 0.1380. The slope is anchored on the one shape the research file states with confidence — prevalence roughly doubling every five years of age above 75, a growth rate ofln 2 / 5 = 0.1386.care_table.csv— the whole in-care basis in five rows.mort_multis a multiple on the force of active mortality at the same age, not on the rate.
A replacement table must preserve four properties: (a) incidence by attained age, sex and grade of entry, because a stroke or a fracture enters directly at grade 3 or 4; (b) deterioration dominating recovery above age 75; (c) mortality in care as a grade-increasing multiple of active mortality; and (d) transition probabilities out of each state summing, with the stay probability, to one. Dropping a licensed or company table in place of these changes the basis with no formula change.
The remaining tables are standardizations of a different kind: lapse_table.csv and
surrender_table.csv encode a shape argued from the Zillmerung and the § 169 VVG
five-year spread rather than from data — no lapse rate and no Rückkaufswert for a German
Pflegerente at any duration was established — and expense_table.csv carries five
placeholder levels whose only cited element is the 25 ‰ ceiling the acquisition charge is
set exactly at. basis_table.csv holds the Rechnungszins, the terminal age, the
unisex mix, the recovery-damping shape, the Beitragssumme convention, the check
tolerance and the five first-order prudence margins; only the Rechnungszins is cited.
Cells Descriptions#
- input_dir()[source]#
The directory holding the input CSVs: the model folder’s parent.
Inputs are external files, not data stored inside the model, so the model folder is pure formulas. The path is resolved at run time from where the model was read, following
annuallife.TradLife_A.
- model_point_table()[source]#
The fourteen model points, read from model_point_table.csv.
The only input file without a
provenancecolumn: a model point is a configuration — one policy’s own terms — rather than an assumption, and that is the single exemption from the library’s second ruling.
- benefit_scale_table()[source]#
The Leistungsstaffel by schedule and Pflegegrad, from benefit_scale_table.csv.
Two schedules ship.
delib_stdis 0 / 30 / 50 / 75 / 100 % — the flatter, higher shape a Pflegerente aimed at the residential funding gap tends to use, and a [std] choice within an observed range.bahris the statutory 10 / 20 / 30 / 40 / 100 % minimum grid of § 127 SGB XI, the only Leistungsstaffel fixed by German statute; it is carried for comparison, since a Pflegerente written by a Lebensversicherer cannot be a geförderter Tarif.
- mort_table()[source]#
Annual active-life mortality by sex and attained age, from mort_table.csv.
A [std] Gompertz proxy over ages 18 to 108 with the limiting-age rate of 1.0 at age 109, not a fitted or standard table; see the Space docstring for the four anchor rates a replacement must preserve. In-care mortality is not tabulated: it is this rate’s force multiplied by
mort_multfrom care_table.csv.
- incidence_table()[source]#
Annual incidence into any Pflegegrad by sex and age, from incidence_table.csv.
A [std] exponential proxy capped at
inc_cap. It is the rate of leaving the active state for care; the grade actually entered is drawn fromentry_sharein care_table.csv, because entry is not uniformly at the lowest grade.
- care_table()[source]#
The whole in-care basis in five rows, from care_table.csv.
entry_shareis the distribution of the grade first entered and sums to 1.00;det_ratethe annual deterioration rate to the next grade up, zero at grade 5;rec_ratethe annual recovery rate to the grade below — to the active state from grade 1 — before the age damping; andmort_multthe multiple on the force of active mortality at the same age.entry_shareis deliberately not the stock distribution of about 9 / 44 / 27 / 14 / 6 %: entrants skew lower than the stock because deterioration moves people up over a spell, and using the stock as the entry mix is a listed pitfall.
- lapse_table()[source]#
Annual lapse rates from the active state by policy year, from lapse_table.csv.
Policy years 1 to 40; year 40’s rate applies to every later year. A [std] shape: no lapse rate for a German Pflegerente at any duration was established, and the profile is argued from the Zillmerung — the Rückkaufswert is near zero for the first years, so an early lapse is expensive to the policyholder.
- surrender_table()[source]#
The guaranteed Rückkaufswert as a fraction of premiums paid to date.
Read from surrender_table.csv, by Versicherungsjahr
y(t) = t // 12 + 1, 1 to 40: yeark’s ratio applies throughout policy yeark,t = 12(k - 1) … 12k - 1, and year 40’s applies thereafter, intermediate years interpolated in the shipped file. It is the current policy year, not the completed one — a surrender att = 24, two completed years, already takes year 3’s ratio. The scale-free form, which is the form a German contract states. The shape encodes two cited facts — the 25 ‰ Zillmerung allowance, which is why the first two years are zero, and the § 169 Abs. 3 VVG five-year spread floor, which is why it turns positive in year three — and no cited level, because none was established.
- expense_table()[source]#
The five expense assumptions and their units, from expense_table.csv.
acq_permille(‰ of Beitragssumme, charged once att = 0),admin_prem_pct(fraction of each Beitrag collected),admin_mth_pp(EUR per policy in force per month att = 0prices),claim_expense_pp(EUR per annuity payment made) andexpense_infl(annual). All five levels are [std]; only the 25 ‰ ceiling the first is set exactly at is cited.
- basis_table()[source]#
The scalar bases and conventions, from basis_table.csv.
The Rechnungszins; the terminal age
omega_age; the unisex pricing mix; therec_age_ref/rec_age_decayrecovery damping; theinc_capshape device; thebeitragssumme_cap_ageconvention the Zillmerung base is struck on; theroll_fwd_toleverycheck_*identity uses; and the five first-order prudence marginsinc_margin,det_margin,rec_margin,care_mort_marginandact_mort_margin. Only the Rechnungszins is cited; everything else is [std].