The Data Space#
Input data shared by every by-policy projection.
The three 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/whole_life/, 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
WholeLife_JP_A 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 |
mort_table_file |
mort_table() |
mort_table.csv |
lapse_table_file |
lapse_table() |
lapse_table.csv |
The mortality table is a construction, and the reason is the licence
生保標準生命表2018(死亡保険用)is published by 日本アクチュアリー会 in full, free, at a stable public URL — the sharp contrast with the UK library, whose CMI tables cannot be read at all without a subscription. Anyone can retrieve it and check a rate. But the publisher’s site terms prohibit reproduction, alteration and transmission to third parties without prior written consent, so this library must not ship a copy of the file.
mort_table.csv is therefore a [std] construction, and its provenance column
says so row by row, ANCHOR row by ANCHOR row. It is the canonical jplib death table:
one file, built once from the union of every anchor any product in this library sources,
and shipped identically by every product that needs it, so that a rate quoted in two
products carries the same number and the same provenance in both. This product ships
the age range it reads, 15 to ω.
Two kinds of row, and the provenance string names which is which. An ANCHOR row is a rate quoted and attributed to the IAJ table [REG-R18]; an INTERPOLATED row is filled by log-linear interpolation in ln q between the two neighbouring anchors, evaluated in double precision and rounded to five decimal places. There is no extrapolation anywhere: both sexes run from an age-0 anchor to a terminal anchor, so every interpolated age lies strictly between two sourced ones. Over the range shipped here, 27 of the 95 male rows and 24 of the 99 female rows are anchors; the remaining 68 and 75 are the standardization. The interpolated rows are not IAJ values and no conclusion about Japanese insured mortality should be drawn from them.
How far an interpolated row sits from the rate the IAJ actually publishes is not
known and is not asserted anywhere: this library reads the anchors and constructs the
rest, so it has nothing to measure the fill against. What is known is where the fill is
thinnest — between age 90 and ω the anchors are five and then four years apart while
q is turning over, which is the widest gap in the file. A user who has downloaded the
IAJ PDF replaces mort_table.csv with a same-schema file and changes no formula.
The other two files are standardizations end to end. No Japanese carrier publishes a lapse or surrender curve by duration — the only public benchmark is an amount-weighted, all-product industry 解約・失効率 — and none publishes an expense basis at all, the 予定事業費率 being named in the 保険契約者保護機構 boilerplate and never quantified. The expense and commission levels are Projection References rather than a table, because each is a single scalar.
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 model point table, read from model_point_table.csv.
Indexed by
point_id. Point 1 is the technical notes’ worked-example anchor cell; the other nine exercise the product’s variants, its optional modules and its edge cases.
- mort_table()[source]#
The mortality rates by sex and attained age, from mort_table.csv.
A [std] construction anchored on quoted rates of 生保標準生命表2018(死亡保険用), not a copy of the published table; see the Space docstring. The rate includes 高度障害, which the published table already carries inside the death rate, so a projection using it must not add a separate disability decrement.
- lapse_table()[source]#
The base voluntary surrender rates by policy year, from lapse_table.csv.
Three rows: policy years 1 and 2, then a level tail read for every later year. The surrender surge at 払込満了 is not in this table — it is the model point’s
lapse_spike, held apart so that it can be switched off and its effect read directly.