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入門(複数のCFを合計する)

0
Last updated at Posted at 2026-03-06

アクチュアリーのためのPython入門(第15回)

複数の将来キャッシュフローの合計

📚 アクチュアリーのためのPython入門
この記事は入門編の一部です。
目次はこちら

はじめに

前回は、ファイル構成を整理して、

  • 共通部分となるcore.py
  • 商品ごとのファイルendowment.py,term.py,whole.py
    に分けてみました。

将来収支のコードも商品ごとのファイルそれぞれに入れています。
コードも整理されて、見やすくなったので、
将来収支のうち、キャッシュフローを例にあげて、
今まで1種類の契約だけだったものを複数の契約種類にします。

今回の前提

前回の契約の種類は固定されて、1通りだけだったので、
それを複数にして、あとはfor文で繰り返し処理をしていきます。

今回は、前回までの養老保険のファイルを使って、
次のような契約内容を仮定して、
キャッシュフローを計算します。

保険期間 年齢 男性_保険金額 女性_保険金額
10年 20歳 1,000,000 1,500,000
10年 30歳 2,000,000 2,500,000
10年 40歳 3,000,000 3,500,000
20年 20歳 1,500,000 1,000,000
20年 30歳 2,500,000 2,000,000
20年 40歳 3,500,000 3,000,000
60歳 20歳 2,000,000 3,000,000
60歳 30歳 4,000,000 2,000,000
60歳 40歳 3,000,000 1,500,000

男女・年齢・保険期間別で、
18種類のキャッシュフローを計算して、
それを合計して出力します。

キャッシュフローの計算

まず、先の契約内容をリスト化しますが、
たくさん並べると、20とか30とか並んだ数値が
年齢なのか、保険期間なのか分からなくなってしまうので、
辞書化して、分かりやすくしておきます。

また、c_periodに計算期間を設定します。
長くなるので、今回は20年にしています。
前回までと同じく、死亡指数は0.7、解約率は年間2%としています。

endowment.py
# アサンプションの設定 
c_period = 20  # 計算する期間
k = 0.7        # 死亡指数
qwx = [0.02] * c_period    # 解約率

# 契約内容
contracts = [
    {"sex":"M", "age":20, "term":10, "amount":1_000_000},
    {"sex":"F", "age":20, "term":10, "amount":1_500_000},
    {"sex":"M", "age":30, "term":10, "amount":2_000_000},
    {"sex":"F", "age":30, "term":10, "amount":2_500_000},
    {"sex":"M", "age":40, "term":10, "amount":3_000_000},
    {"sex":"F", "age":40, "term":10, "amount":3_500_000},
    {"sex":"M", "age":20, "term":20, "amount":1_500_000},
    {"sex":"F", "age":20, "term":20, "amount":1_000_000},
    {"sex":"M", "age":30, "term":20, "amount":2_500_000},
    {"sex":"F", "age":30, "term":20, "amount":2_000_000},
    {"sex":"M", "age":40, "term":20, "amount":3_500_000},
    {"sex":"F", "age":40, "term":20, "amount":3_000_000},
    {"sex":"M", "age":20, "term":"A60", "amount":2_000_000},
    {"sex":"F", "age":20, "term":"A60", "amount":3_000_000},
    {"sex":"M", "age":30, "term":"A60", "amount":4_000_000},
    {"sex":"F", "age":30, "term":"A60", "amount":2_000_000},
    {"sex":"M", "age":40, "term":"A60", "amount":3_000_000},
    {"sex":"F", "age":40, "term":"A60", "amount":1_500_000}
]

続いて、最終的に出力する、

  • 保険料収入の合計
  • 保険金支払いの合計
  • 解約返戻金支払いの合計
  • 事業費の合計
  • キャッシュフローの合計

のリストを作成しておきます。
初期値として0で計算期間分を埋めておきます。

endowment.py
# キャッシュフローの合計の初期値
inprem_total = [0] * c_period    # 保険料収入
benefit_total = [0] * c_period   # 保険金支払い
surrender_total = [0] * c_period # 解約返戻金支払い
expenses_total = [0] * c_period  # 事業費
netcash_total = [0] * c_period   # キャッシュフロー結果

ここからキャッシュフローの計算に入ります。
contractsの契約内容を1組ずつ取り出し、
それを使って、性・年齢に応じた生命表(保険金額の推移)を作成します。
なお、保険期間に年齢満期が含まれていますので、parse_term関数を使って年満期へ変換しておきます。

endowment.py
# キャッシュフローの計算
for c in contracts:
    sex = c["sex"]   # 性別
    age = c["age"]   # 加入年齢
    term = parse_term(c["term"], age) # 保険期間
    l0 =c["amount"]  # 初期保険金額
    # 残存表の作成 
    lx = [l0]        # 保有保険金額
    dx = []          # 死亡保険金額
    wx = []          # 解約保険金額
    # 生命表の作成
    for t in range(c_period):
        q = qx[sex][age + t]
        w = qwx[t]
        next_d = lx[-1] * q * k 
        next_w = lx[-1] * w
        next_l = lx[-1] - next_d - next_w
        lx.append(next_l)
        dx.append(next_d)
        wx.append(next_w)

ここ以降もまだ、for c in contracts:の中の部分です。
それぞれの契約内容の、性・年齢・保険期間に応じて、

  • 保険料収入
  • 保険金支払い
  • 解約返戻金支払い
  • 事業費
  • キャッシュフロー

を計算します。

for文で繰り返し計算する期間を保険期間ではなく、
計算期間(今回は20年)としています。
また、保険期間を超えた期間は0埋めにしたいので、
else:で、それぞれの項目を0で埋めています。
基本的な部分は前回と変更していません。

endowment
    # キャッシュフローの項目
    inprem = []    # 保険料収入
    benefit = []   # 保険金支払い
    surrender = [] # 解約返戻金支払い
    expenses = []  # 事業費
    netcash = []   # キャッシュフロー結果
    # 保険料をfloat型へ
    P = float(PremE(sex, age, term))
    # キャッシュフローの計算
    for t in range(0, c_period):
        if t < term:
            inprem.append(lx[t] * P)    # 保険料の収入
            if t == term - 1:           # 死亡保険金+満期返戻金の支払い
                benefit.append((lx[t] - wx[t]))
            else:                       # 死亡保険金の支払い
                benefit.append(dx[t])
            W = float(SVE(sex, age, term, t + 1))
            surrender.append(wx[t] * W)   # 解約返戻金の支払い
            expenses.append(inprem[t] * 0.1)  # 事業費の支払い
            # キャッシュフローの計算
            netcash.append(inprem[t] - benefit[t] \
            - surrender[t] - expenses[t])
        # 満期後は0を入力
        else:
            inprem.append(0)
            benefit.append(0)
            surrender.append(0)
            expenses.append(0)
            netcash.append(0)

ここ以降もまだ、for c in contracts:の中の部分です。
最後に、それぞれの契約内容のキャッシュフロー項目を合計します。

endowment.py
        inprem_total[t] += inprem[t]       # 保険料収入の合計
        benefit_total[t] += benefit[t]     # 保険金支払いの合計
        surrender_total[t] += surrender[t] # 解約返戻金支払いの合計
        expenses_total[t] += expenses[t]   # 事業費の合計
        netcash_total[t] += netcash[t]     # キャッシュフローの合計

以上で、契約内容のキャッシュフローの合計が計算できます。
計算結果を確認してみます。

print("t", "inprem", "benefit", "surrender", "expenses","netcash")
for t in range(0, c_period):
    print(t, int(inprem_total[t]), 
          int(benefit_total[t]),
          int(surrender_total[t]),
          int(expenses_total[t]),
          int(netcash_total[t]))

計算結果は次のとおりです。

t inprem benefit surrender expenses netcash
0 2764913 21325 29942 276491 2437154
1 2708176 22229 79759 270817 2335369
2 2652510 23153 127804 265251 2236300
3 2597892 24045 174125 259789 2139932
4 2544303 25046 218763 254430 2046062
5 2491713 26205 261761 249171 1954575
6 2440091 27830 303153 244009 1865098
7 2389384 29721 342974 238938 1777750
8 2339557 31851 381261 233955 1692488
9 2290575 10983770 418051 229057 -9340303
10 1068100 24052 209910 106810 727327
11 1045545 25417 224828 104554 690745
12 1023373 26752 239123 102337 655159
13 1001577 28116 252814 100157 620488
14 980149 29477 265916 98014 586740
15 959082 30996 278442 95908 553735
16 938362 32820 290406 93836 521299
17 917968 34926 301815 91796 489428
18 897879 37194 312682 89787 458214
19 878082 11729539 323018 87808 -11262284

まとめ

今回は、複数のキャッシュフローの合計を計算しました。

商品開発の試作段階では、
専用の数理計算ソフトウェアに組み込めないので、
このような簡易的な将来収支プログラム組めるようになると、
実務でも役立つようになるかと思います。

引き続き、拡張を進めていきたいと思います。


📚 ナビゲーション
前の記事
ファイルの構成

次の記事
感応度分析

📚 目次
アクチュアリーのための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?