0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アクチュアリーのためのPython入門(性別を加えた計算基数)

0
Last updated at Posted at 2026-02-08

アクチュアリーのための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入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?