アクチュアリーのためのPython入門(第3回)
基数表から給付現価を作成する
はじめに
前回は、生存者数と死亡者数から、計算基数表の
$D_x$, $C_x$, $N_x$, $M_x$を作成しました。
今回はそれを使って死亡給付現価と年金給付現価を計算します。
ここでは、
- 数理の理論説明は最小限に
- Pythonで「どう計算するか」焦点をあてます
今回すること
今回扱うのは、次の2つです。
- 即時払(期央)死亡給付現価$\bar{A}_{x:\overline{n}|}$
- 期始払年金現価$\ddot{a}_{x:\overline{n}|}$
の値を計算します。
前提条件
今回の計算では、次の前提を置きます。
-
死亡給付現価
- 実務でよく使われる即時払とします。
-
年金給付現価
- 収入保険料に用いるため期始払とします。
また、前回までの続きとして、計算基数表は作成済みとします。
死亡給付現価と年金給付現価の計算
前回に作成した$M_x$と$D_x$を使って関数を作成します。
関数名は内容が分かりやすいようにA1xnとします。
# 死亡給付現価の関数
def A1xn(start_age, n):
value = 0
# 年齢をリスト内の順序に
age_index = start_age - 40
# 死亡給付現価の計算
value = (Mx[age_index] - Mx[age_index + n]) / Dx[age_index]
return value
ここでは、$M_x$と$D_x$が40歳からはじまっているので、
age_indexでリストでの値の順序にしてから、計算しています。
returnで戻り値を指定します。
同様にして、年金給付現価を計算します。
こちらも関数名は分かりやすいようにaxnとします。
# 年金給付現価の関数
def axn(start_age, n):
value = 0
# 年齢をリスト内の順序に
age_index = start_age - 40
# 年金現価の計算
value = (Nx[age_index] - Nx[age_index + n]) / Dx[age_index]
return value
計算の形はA1xnと同じです。
defを使って関数を定義することができます。
ExcelVBAを使用している方であれば、
Functionと同じ意味といえば分かるかと思います。
最後に計算結果を出力します。
40歳の5年死亡給付現価、40歳の5年年金給付現価、
41歳の4年死亡給付現価、41歳の4年年金給付現価です。
print(round(A1xn(40,5),6),round(axn(40,5),6)
print(round(A1xn(41,4),6),round(axn(41,4),6)
出力例は次のようになります。
0.00688 4.928062
0.007458 4.926975
少しだけ補足
本来は、
- 保険料や責任準備金の計算に必要な給付現価をすべて計算しておく
- それを参照する
方が計算効率はよくなります。ただし、
- 分かりやすさを優先していること
- Pythonに慣れることを目的としていること
- 私自身にもそこまでの知識がないこと
から、関数を使って都度計算する方法で進めていきます。
まとめ
今回は、
- 即時払の死亡給付現価
- 期始払の年金給付現価
をPythonで計算しました。
次回は、これらを使って、
保険料と責任準備金を計算します。
※ 補足
本記事では、説明を簡潔にするため、
計算はfloat型(Excelのdouble型に当たる)で行っています。
実務では、保険料や責任準備金のように
最終的に金額が確定する箇所では、
Decimal型などを用いた厳密な端数処理が必要です。
この点について、後の回で
Decimal型を用いた実装例と合わせて改めて追記します。