The Term_JP_S Model#
Reference liability cash flow model for Japanese level term life insurance.
Term_JP_S is the executable counterpart of
products/term_life/technical-notes.md in the lifelib-products library. It projects
gross best-estimate liability cash flows for a single-policy model point of 定期保険
(teiki hoken, level term life) in the two term shapes the representative composite
offers — 年満了 (nen manryō, a fixed number of years, automatically renewable at
attained-age rates up to a ceiling) and 歳満了 (sai manryō, to a stated age, which
never renews) — with 高度障害 (kōdo shōgai, severe disability) inside the death
decrement, and no tail states of any kind: there is no 満期保険金 (maturity
benefit), no 解約返戻金 (kaiyaku-henreikin, surrender value) and no paid-up value
at any duration [S1][S4][S6][S8][S9][S10][S13][S14].
This is the library’s protection chassis: the decrement recursion, the premium
chassis and the expense and commission structure specified here are inherited by
IncomeTerm_JP_S (収入保障保険) rather than restated.
Two mechanics have no analogue in this repository’s U.S. or UK term models and drive the shape of the answer:
更新 (*kōshin*, automatic renewal). A 年満了 contract renews automatically at the
end of each 保険期間 unless the policyholder declines, with no 告知 and no fresh
underwriting, and the premium is recomputed on attained age at the scale then in
force [S1][S4][S8][S12]. On the anchor cell the monthly premium multiplies by 1.87 at
the first renewal, then 2.16, 2.28 and 2.66 — so the premium is a function of the
term index, not of the policy year, and the projection horizon is the renewal
ceiling of attained age 80 rather than the ten-year term. A UK term assurance
guarantees its premium for the whole term; this one guarantees it only within the
current 保険期間, which is why contract_boundary is a model point column and not a
detail.
The renewal decline. At each renewal boundary a proportion of survivors leave
rather than accept the repriced contract. It is a different event from a mid-term
lapse, it applies only in boundary years and only after mortality and ordinary lapse,
and it dominates both: in the anchor cell’s first boundary year (t = 9) it is
0.08235591 of 0.11175249 total exits. A model that folds it into the lapse rate cannot
see the boundary at all.
Spaces. The model contains two:
DataReads the four input CSVs and holds their filename References. It takes no parameters, so each file is read once per model.
ProjectionThe by-policy 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 policy. In Data they are evaluated
once, however many policies 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. The projection index t is 0-based and
counts policy months: it runs 0, 1, …, proj_len() - 1, so proj_len() is the
number of projected months — 600 on the anchor cell — the contractual policy year is
policy_year(t) = 1 + t // 12, and duration(t) = t // 12 is the completed-years
count every contractual schedule is quoted against. Premiums and maintenance expense fall
at the start of the month; acquisition expense and initial commission at issue; death and
高度障害 claims and their claim expense at the end of the month; ordinary lapse at the end
of the month after deaths; the renewal decline at the end of a boundary month after lapse.
The contract is still quoted in years — the 保険期間, the ceiling, the rate card’s own
term basis — so the grid is finer than the guarantees, not finer than the product. What it
buys is three things the annual grid could not do. The premium payment mode becomes a
cash flow rather than a column: 月払, 半年払 and 年払 now differ, which matters because
Japanese rate cards are quoted monthly [S2]. The 更新 boundary is one month rather than
one year, so the renewal decline stands alone instead of being averaged against twelve
months of ordinary lapse — at t = 119 it is better than 97% of the month’s exits,
against the 74% the annual grid could see. And the 猶予期間 (yūyo kikan, grace period
of about a month) is for the first time shorter than a step rather than longer, so the
unpaid-premium exit at a renewal is representable even though this composite still folds
it into one decline rate for want of a take-up assumption.
It also retires a standardization rather than restating it. The annual grid collected a whole year’s premium in advance from lives that might exit in month two and offset the overstatement against claims booked at the end of the year; the notes declared the pair matched and warned against correcting either alone. Here a policy pays for the months it is in force and its claim falls in the month it arises, so there is no offset to keep straight — and the anchor cell’s undiscounted premium falls from ¥470,348.54 to ¥457,507.04 as a result.
One decrement, one benefit. 生保標準生命表2018(死亡保険用)includes 高度障害 inside
its death rate [REG-R20], and the contract pays one sum assured and terminates on
whichever event comes first [S1][S8]. There is therefore no disability_rate and no
second decrement anywhere in this model; adding one would double-count the benefit.
What is sourced and what is not. The contractual mechanics are sourced: the attained-age repricing at 更新 and its absence of 告知, truncation at the ceiling into an 80歳満了 term, the 歳満了 shape never renewing, the absence of any 解約返戻金 and hence of 自動振替貸付, and the リビング・ニーズ特約 discount and its per-insured cap. The monthly premium is sourced too — ¥974 for the anchor cell, from a published rate card [S2] — which is the sharpest documentary contrast with this repository’s UK term model, where no premium basis is observable at all. Everything else is a standardization: the best-estimate mortality factor, the lapse curve, the renewal-decline rate, the expense and commission levels, and the premium scale beyond the published age-50 cell. This model is a mechanics demonstration, not a pricing or reserving result. Replace the assumption tables with company data before drawing any conclusion from the output.
The mortality table shipped here is a proxy, not the published table.
標準生命表2018 is freely readable at a stable public URL [REG-R18][R3][R4], but its
publisher prohibits reproduction and transmission to third parties without written
consent [REG-R21], so mort_table.csv is a [std] construction anchored on the
handful of rates the worked example quotes and log-linearly interpolated between them.
It reproduces the notes’ own rates exactly and nothing else should be read from it.
See Data for the construction.
Model points. Nine, covering both sexes, both term shapes, the renewal ladder to the ceiling, truncation of the final term, both contract boundaries, all three optional riders, and the extremes of the issue-age and sum-assured envelopes. Model point 1 is the anchor cell of the worked example in the technical notes.
Verification. tests/test_term_life_jp.py asserts the notes’ worked example to
the yen and the in-force column to six decimals: CF(0) = -20,658.14,
l(120) = 0.466683, the renewal ladder ¥974 → ¥1,823 → ¥3,933 → ¥8,976 → ¥23,881,
and undiscounted totals of ¥457,507.04 of premium and +¥47,254.64 of net cash flow over
the 600 months.
Example
>>> import modelx as mx
>>> model = mx.read_model("products/term_life/Term_JP_S")
>>> model.Projection[1].result_cf()