The FXWholeLife_JP_S Model#
Reference liability cash flow model for Japanese foreign-currency whole life.
FXWholeLife_JP_S is the executable counterpart of
products/fx_whole_life/technical-notes.md in the lifelib-products library. It
projects gross best-estimate liability cash flows for a single-policy model point of
外貨建終身保険 (gaika-date shūshin hoken, foreign-currency-denominated whole life
assurance) in its 積立利率変動型 form, on a monthly grid, in the two shapes the
representative product carries:
LEVEL平準払 積立利率変動型 — a level US-dollar premium, a 積立利率 redeclared monthly and floored at the contract’s own 予定利率, a 増加死亡保険金額 uplift over the 基本保険金額, and no 市場価格調整.
SINGLE一時払 積立利率更改型 — one premium, a rate fixed for a 15-year 積立利率適用期間, a death benefit of
max(積立金, 解約返戻金)with no sum assured above the fund, a 市場価格調整 on surrender inside the period, and the 目標到達時円建終身保険移行特約 as an election.
Everything the model computes is in US dollars. The policy currency is the model
currency; the yen columns are a translation of the dollar ledger, and the translation
is three separate rates — premiums at e + s, benefits at e - s, expenses and
commission at e — so net_cf_jpy(t) is not net_cf(t) times anything. The
difference is the insurer’s 為替手数料 spread income and the model publishes it as its own
column, fx_spread_jpy.
Spaces. The model contains two:
DataReads the five 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. t counts completed policy months from 契約日,
t = 0 ... proj_len() - 1, and t = 0 is the month beginning at issue. Stepping
is on the 月単位の契約応当日, not the calendar month end: the 約款 credits the 積立利率 from
the monthly policy anniversary while the 重要事項説明書 says the rate is declared on the
1st, and crediting on calendar month ends would be wrong by the anniversary offset for
the whole life of the contract. There is no maturity date and no 満期保険金; the horizon
is the terminal age of the mortality table, 12 x (omega - x + 1) months, and there
are no tail states.
What is sourced and what is not. The contractual mechanics are sourced: the
surrender-value formula AV (1 - mva - sc) kl, the 解約控除 scale and its base (the
積立金, not the 基本保険金額), the symmetry of the 市場価格調整, the 増加死亡保険金額’s definition
against a 予定利率 basis, the 低解約返戻金割合 ramp, the ±50銭 conversion spread, the one-year
dead zone on the target test and the fact that the test runs on the surrender value.
The charge stack is not: every carrier in the source set refuses to quantify its
mortality-and-expense charge, so prem_charge_early, prem_charge_late and
maint_rate are back-solved from one carrier’s published guaranteed
surrender-value run and carry the whole surrender-benefit stream. The mortality basis
is a [std] construction anchored to published rates, not a copy of a table whose
publisher restricts redistribution. 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.
Model points. Eight, covering both shapes, the 低解約返戻金特則 cliff, the 自動振替貸付, a crediting rate above the guaranteed floor (which is what makes the uplift and the 特別積立金 non-zero), the prospective uplift basis, a loaded mortality assumption, an FX path, dynamic surrender, both target elections, a negative 市場価格調整, a female life at the female terminal age and a policy settling in US dollars throughout. Model point 1 is the anchor cell of the worked example in the technical notes.
Verification. tests/test_fx_whole_life_jp.py asserts the notes’ worked example
to the precision the notes print it — the first three months to four decimal places,
the account and surrender values to the cent, the nine-duration calibration table, the
whole-run totals, the yen ledger and its ¥125.17 spread, the mva(36) row across
five rate moves and the month-52 target hit with its three counterfactuals.
Example
>>> import modelx as mx
>>> model = mx.read_model("products/fx_whole_life/FXWholeLife_JP_S")
>>> model.Projection[1].result_cf()