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-04-18

アクチュアリーのためのPython入門(保険数理モデリング編第4回)

保険契約の現在価値

📚 アクチュアリーのためのPython入門
この記事は保険数理モデリング編の一部です。
目次はこちら
逆引きガイドはこちら

はじめに

前回は複数商品の将来キャッシュフローの計算をしました。
複数商品を一度に取り扱う場合は、商品種類によって異なる

  • 死亡率
  • 解約率
  • 給付種類(死亡や生存など)
  • 保険料や解約返戻金

などを関数化しました。

キャッシュフローの計算には、
商品種類による分岐はなるべくなくし
修正しやすく、分かりやすくしました。

前回までのキャッシュフローは、
結果を表示するため、2030年度までとしていましたが、
実際は保有契約がなくなるまでキャッシュフローは続きます。
その上で、今回はキャッシュフローの現在価値を計算します。

キャッシュフローの現在価値について

生命保険数学では、
将来の支払いに備えるため留保しておく金額を
保険料積立金(責任準備金)としています。
これはあらかじめ決められた予定利率予定死亡率などに
基づいて計算されるもので、日本の会計基準で用いられます。

一方で、現在の市場環境実績の死亡率などを
反映して評価を行う場面もあります。
例えば、将来の保険金の支払いを「今の金利で」評価すると、
その価値はどの程度になるのかという考え方です。

実績の死亡率などを反映した将来のキャッシュフローを、
現在の市場環境(主に金利)を用いて評価したものを
経済価値ベースの保険負債といいます。
(他にリスクマージンなども保険負債に含まれます)

なお、保険料積立金の計算式は、
$$_tV = A - P _{net}\cdot\ddot{a}$$の形で、支払現価-収入現価です。
キャッシュフローもそれに合わせて、
支払-収入で計算します(前回までとは符号が逆です)。

キャッシュフローの現在価値も保険料積立金と同じように、
将来の支払いに備えるため留保しておくべき金額です。
ただし、安全を見込んだ予定死亡率や予定利率ではなく、
より実態に近い額となります。

cashflow.pyの準備

前回まで複数商品の保有契約を計算したcashflow.pyとは別に、
現在価値を計算するpresentvalue.pyを作成しますが、
その前にcashflow.pyの一部を修正しておきます。

まず、キャッシュフローの計算を関数化して、
外部ファイルから引用できるようにします。

また、結果の出力部分は、
引用した場合は、読み込まないようにします。
具体的には次のようにします。

cashflow.py
# キャッシュフロー計算の関数化 base_yearは計算基準年度
def create_cashflow(base_year = 2022):    

    # 結果を入れる変数
    results1 = []

    df = pd.read_excel("contr_all.xlsx")

    for _, row in df.iterrows():
        product = row["product"]
        policy = int(row["policy"])
        sex = row["sex"]
        age = int(row["age"])
        term = row["term"]
        amount = int(row["amount"])

        # 保険収支の計算
        l0 = amount      # 初期保険金額

        # 残存表の作成
        lx = [l0]        # 保有保険金額
        dx = []          # 死亡保険金額
        wx = []          # 解約保険金額
        mx = []          # 満期保険金額

        n = InsPeriod(product, sex, age, term) # 保険期間
        m = PremPeriod(product, sex, age, term) # 保険料払込期間
        # 生命表の作成
        for t in range(n):
            q = qdx(sex, age + t)
            w = qwx(product, t, m)
            next_d = lx[-1] * q * mort_k(product)
            next_w = lx[-1] * w
            if t == n - 1:
                next_m = lx[-1] - next_d - next_w
                next_l = 0
            else:
                next_m = 0
                next_l = lx[-1] - next_d - next_w

            lx.append(next_l)
            dx.append(next_d)
            wx.append(next_w)
            mx.append(next_m)

        # 補整値の計算
        af = amount / lx[base_year - policy + 1]

        # 保険収支の項目
        inprem = []    # 保険料収入
        benefit = []   # 保険金支払い
        surrender = [] # 解約返戻金支払い
        expenses = []  # 事業費
        cashflow = []  # キャッシュフロー

        P = float(prem_func(product, sex, age, term))

        # キャッシュフローの計算
        for t in range(n):
            # 保険料の収入
            if t < m:
                inprem.append(lx[t] * P)
            else:
                inprem.append(0)
            # 保険金の支払い
            if t == n - 1:
                # 死亡+満期保険金の支払い
                pay_ben = dx[t] + mx[t] * maturity(product)
            else:
                # 死亡保険金の支払い
                pay_ben = dx[t]
            benefit.append(pay_ben)
            # 解約返戻金の支払い
            W = float(sv_func(product, sex, age, term, t + 1))
            surrender.append(wx[t] * W)
            # 事業費の支払い
            expenses.append(inprem[t] * 0.3)
            # キャッシュフロー
            cashflow.append(benefit[t] + surrender[t]\
                      + expenses[t] - inprem[t])

            # 商品別のキャッシュフロー
            results1.append({"product":product,
                             "year":policy + t,
                             "benefit":int(benefit[t] * af),
                             "surrender":int(surrender[t] * af), 
                             "expenses":int(expenses[t] * af),
                             "inprem":int(inprem[t] * af),
                             "cashflow":int(cashflow[t] * af)
            })

    result_df = pd.DataFrame(results1)
    # 商品別の集計
    grouped_product = result_df.groupby(["product", "year"]).sum()
    summary_product = grouped_product.reset_index()

    # 合計の集計
    grouped_total = result_df.groupby("year").sum()
    summary_total = grouped_total.reset_index()
    # Totalのラベルを付ける
    summary_total["product"] = "Total"

    # 結合
    summary = pd.concat([summary_product, summary_total], ignore_index=True)
    # 年度のフィルタ
    summary = summary[summary["year"] >= base_year + 1]
    return summary

# キャッシュフローの出力
if __name__ == "__main__":
    summary = create_cashflow()
    summary.to_excel("result_all.xlsx", index=False)

キャッシュフローを計算するcreate_cashflow関数は、
引数として、計算基準年度base_yearを持たせます。
また、その初期値を今回は2022年度末としておきます。

if __name__ == "__main__":で、
メインで動作させた場合はキャッシュフローを出力し、
ファイルを引用した場合は、出力させないようにします。
ここまでが、cashflow.pyの準備です。

現在価値を計算するファイルの作成

現在価値を計算するファイルを新しく作成します。
ファイル名はpresentvalue.pyとしておきます。

先ほど作成したcreate_cashflow関数を使えるようにしておきます。
今回使用する金利は、金融庁が過去に行った
経済価値ベースのフィールドテストの金利を使用します。

現価率の計算から分かるように、
キャッシュフローはすべて年央に発生すると仮定しています。

presentvalue.py
from core import *
from cashflow import create_cashflow

rate0 = [
    0.00178,0.00295,0.00328,0.00400,0.00478,0.00519,0.00588,0.00680,0.00769,0.00877,
    0.00972,0.01053,0.01129,0.01204,0.01283,0.01367,0.01452,0.01532,0.01605,0.01667,
    0.01718,0.01759,0.01795,0.01827,0.01856,0.01885,0.01914,0.01944,0.01977,0.02012,
    0.02051,0.02092,0.02135,0.02178,0.02221,0.02263,0.02305,0.02345,0.02384,0.02421,
    0.02458,0.02492,0.02526,0.02558,0.02590,0.02619,0.02648,0.02676,0.02702,0.02728,
    0.02753,0.02776,0.02799,0.02821,0.02842,0.02863,0.02883,0.02902,0.02920,0.02938,
    0.02956,0.02972,0.02988,0.03004,0.03019,0.03034,0.03049,0.03063,0.03076,0.03089,
    0.03102,0.03114,0.03126,0.03138,0.03150,0.03161,0.03172,0.03182,0.03193,0.03203,
    0.03212,0.03222,0.03231,0.03240,0.03249,0.03258,0.03267,0.03275,0.03283
    ]

# 現価率
def DF(t):
    if t < len(rate0):
        r = rate0[t]
    else:
        r = rate0[-1]
    return (1 + r) ** (-t-0.5)

続いて、先ほど作成したcreate_cashflow関数で
キャッシュフローを計算して、計算結果をsummaryへ代入します。
Totalのみを抽出し(E,T,Wは削除)、
経過年数tを付け加えます。

presentvalue.py
# 計算基準年度
base_year = 2022
# キャッシュフローの計算
summary = create_cashflow(base_year)
# Totalのみ抽出
summary = summary[summary["product"] == "Total"]
# 経過年数を追加
summary["t"] = summary["year"] - base_year - 1

最後に現在価値を計算します。
summaryから経過年数とキャッシュフローを取得して、
現価率を乗じて、足し合わせていきます。

presentvalue.py
# 現在価値を計算
PV = 0
for _, row in summary.iterrows():
    t = int(row["t"])
    cf = int(row["cashflow"])

    PV += cf * DF(t)

# 結果の表示
print(int(PV))

計算結果は次のようになります。

812213

まとめ

今回は、金利を使ってキャッシュフローの現在価値を計算しました。
保険会社に導入された経済価値ベース規制では、中核になる部分ですので、
実際の数値で計算してみることで、理解が進むのではないでしょうか。


📚 ナビゲーション
前の記事
複数商品のキャッシュフロー

次の記事
保険負債の金利変動による影響

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