アクチュアリーのためのPython入門(第10回)
計算基数を実務仕様に修正する
📚 アクチュアリーのためのPython入門
この記事は入門編の一部です。
▶ 目次はこちら
▶ 逆引きガイドはこちら
はじめに
ここからは、これまでのプログラムを
実務でも使えるように、少しずつ手直ししていきます。
前回までの記事では、
- ある年齢
- ある保険期間
について、保険料を1つずつ計算するコードを作ってきました。
ただ、実務で商品を開発するときに必要なのは、
- 年齢ごとの保険料
- 性別ごとの保険料
- 保険期間ごとの保険料
をまとめて一覧にしたものです。
いわゆる保険料レート表です。
今回と次回に分けて、
「保険料レート表を一気に作る」
ことをやってみます。
レート表の仕様
対象商品
- 定期保険:保険期間10年、20年、30年
- 養老保険:保険期間10年、20年、30年
- 終身保険:払込満了60歳、65歳、70歳
加入範囲
- 加入年齢:20~50歳
- 性別:男女
前回までのプログラムの修正
前回までのプログラムでは、
流れや仕組みを分かりやすくするために
男性40歳のみとしていました。
ここから引数に性別を加えて、
女性も計算できるように修正します。
まずは女性の死亡率と計算基数表を追加します。
死亡率は同じく標準生命表2018を使用します。
前回までと異なり、男女別の0歳から最終年齢までとします。
# 年齢の範囲
ages = list(range(0, 114))
# 死亡率(標準生命表2018)
# 男性
qxM = [0.00081,0.00056,0.00036,
# ...
,0.61642,0.65494,0.69314,1]
# 女性
qxF = [0.00078,0.00053,0.00033,
# ...
,0.67863,0.72158,0.76308,1]
qx ={"M":qxM, "F":qxF}
0歳から最終年齢までの死亡率をリストとしていますが、
表示では途中を省略しています。コピーする際は気を付けてください。
その男女の死亡率をqxが"M"なら、男性の死亡率qxMが、
qxが"F"なら、女性の死亡率qxFが代入されるようにします。
続いて、生命表と計算基数表の作成です。
# 辞書の作成
Dx = {}
Cx = {}
Nx = {}
Mx = {}
ここは、Dx、Nx、Cx、Mxの計算基数をリストではなく辞書とします。
リストでは、位置でしか指定できないのですが、
辞書ですと、位置以外での指定ができます。
今回は辞書を使って、"M","F"で男性と女性の計算基数を
切り替えられるようにしておきます。
# 計算基数表の作成
for sex in ("M","F"): # ←sexに"M"と"F"を代入
# 初期生存者数
l0 = 100000
# lx, dx
lx = [l0]
dx = []
# 生命表の作成
for q in qx[sex]: # ←[sex]で死亡率の切り替え
next_d = lx[-1] * q
next_l = lx[-1] - next_d
lx.append(next_l)
dx.append(next_d)
# 利率と現価率
i = 0.006
v = 1 / (1 + i)
# Dx, Cx
Dx[sex] = [] # ←Dx["M"]とDX["F"]のリスト
Cx[sex] = [] # ←Cx["M"]とDX["F"]のリスト
for age, l, d in zip(ages, lx, dx):
Dx[sex].append(l * v ** age)
Cx[sex].append(d * v ** (age + 0.5)) # 即時払(年央近似)
# Nx, Mx
Nx[sex] = [] # ←Nx["M"]とNX["F"]のリスト
Mx[sex] = [] # ←Mx["M"]とMX["F"]のリスト
Dx_sum = 0
Cx_sum = 0
for D, C in zip(reversed(Dx[sex]), reversed(Cx[sex])):
Dx_sum += D
Cx_sum += C
Nx[sex].append(Dx_sum)
Mx[sex].append(Cx_sum)
Nx[sex] = list(reversed(Nx[sex]))
Mx[sex] = list(reversed(Mx[sex]))
これで男性と女性の計算基数ができました。
例えば、男性の40歳のDxでしたら、Dx["M"][40]と指定します。
試しに、計算基数を確認してみます。
for i in ("M","F"):
for x, q in zip(ages, qx[i]):
print(i, x, round(Dx[i][x],2), round(Nx[i][x],2), round(Cx[i][x],2), round(Mx[i][x],2))
結果は長いので、途中を省略しています。
M 0 100000.0 6417769.62 80.76 61907.94
M 1 99323.06 6317769.62 55.45 61827.18
M 2 98675.39 6218446.56 35.42 61771.72
# ...
M 107 4.56 6.6 2.98 4.53
M 108 1.56 2.04 1.08 1.56
M 109 0.48 0.48 0.48 0.48
F 0 100000.0 6772644.9 77.77 59784.88
F 1 99326.04 6672644.9 52.49 59707.12
F 2 98681.31 6573318.86 32.47 59654.63
# ...
F 111 2.46 3.14 1.77 2.29
F 112 0.68 0.68 0.52 0.52
F 113 0.16 0.16 0.16 0.16
計算基数が作られていることが確認できました。
まとめ
今日は計算基数を性別で切り替えられるように、
前回までのコードを修正しました。
次回は、この先の給付現価の関数に性別の引数を加える修正と、
保険料の計算する関数にも性別の引数を加える修正を行います。
📚 ナビゲーション
◀ 前の記事
キャッシュフローと保険収支の計算
▶ 次の記事
性別を加えた給付現価
📚 目次
アクチュアリーのためのPython入門