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-03-28

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

保険料積立金の計算と保険収支の分析

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

はじめに

今回はコードの追加修正ではなくて、
過去に取り扱った内容で、
実務ではこういうこともできるよという内容を紹介します。

  • 平準純保険料式とチルメル式の保険料積立金を一度に計算する
  • 保険収支をtで集計はなく、年齢や性別で集計する

ことを取り上げます。
なお、今回の内容は次回以降には反映させません。

保険料と保険料積立金の計算

現在、保険料を計算している関数は、
純保険料と営業保険料を別々としています。
ですが、それぞれで同じ給付現価を使い、
途中まで同じ計算を異なる箇所で行っています。

これを1つにまとめた方が、
関数が減るので、プログラムは短くなります。
また、修正が必要なときは1カ所の修正で済みます。

ただ、別々の関数で計算するより、
数行の計算は増えてしまいます。
増える時間は微々たるものなので、
プログラムを見やすく修正しやすくすることを選びます。

保険料の計算

具体的には次のとおりです。
養老保険を例としています。

endowment.py
# 保険料の計算
def PremE(sex, start_age, term):
    n = parse_term(term, start_age)
    # 予定事業費
    alpha = 0.025
    delta = 0.02
    gamma = 0.00215
    beta = 0.03
    # 営業保険料の計算
    An = Axn(sex, start_age, n)
    an = axn(sex, start_age, n)
    value = (An + alpha + gamma * an) / ((1 - beta - delta) * an)
    # 端数処理
    value = roundhu(value, 6)
    # 純保険料の計算
    netP = An / an
    return value, netP

営業保険料の計算式を基本として、
最後2行だけを修正して、戻り値を2種類にします。
ExcelVBAなどですと、基本的に戻り値は1つですが、
Pythonでは、複数の戻り値でも容易にできます。

この結果を確認してみます。
次のように、戻り値を受け取ります。

Premium, netPremium = PremE("M", 40, 10)
print(Premium)
print(netPremium)

結果は次のとおりです。

0.107553
0.09744073489861495

なお、戻り値が必要ない場合は_で受け取ります。

保険料積立金の計算

保険料積立金の計算では、
平準純保険料式以外に、
利源分析で使われる5年チルメル式保険料積立金と、
解約返戻金を一度に計算してみます。

保険料積立金のコードに
チルメル部分の計算と解約返戻金の計算を加えて、
次のようにします。

endowment.py
def ResE(sex, start_age, term, t):
    # 平準純保険料式
    n = parse_term(term, start_age)
    benefit = Axn(sex, start_age + t, n - t)
    _, netP = PremE(sex, start_age, n)
    income = netP * axn(sex, start_age + t, n - t)
    value = Decimal(str(benefit)) - Decimal(str(income))
    Vn = roundhu(value, 6)
    # 5年チルメル式
    if t < 5:
        alpha = 0.025 * axn(sex, start_age + t, 5 - t) / axn(sex, start_age, 5)
    else:
        alpha = 0
    Vz = roundhu(value - Decimal(str(alpha)), 6)
    # 解約返戻金
    if t <= 10:
        surrender_fact = 0.025 * (1 - t / min(n, 10))
    else:
        surrender_fact = 0
    W = roundhu(Vn - Decimal(str(surrender_fact)), 6)
    return Vn, Vz, W

5年チルメル式保険料積立金と解約返戻金は、
平準純保険料式保険料積立金の途中式や結果を使うので、
2重に計算式を作成しないようにできます。

同じように結果を確認します。

Vn, Vz, W = ResE("M", 40, 10, 3)
print(Vn)
print(Vz)
print(W)

結果は次のとおりです。

0.292719
0.282610
0.275219

保険収支の集計方法

続いて、保険収支を経過年数tだけではなく、
性別や年齢による集計を行ってみます。

前回までの保険収支の最後の部分は、
定期保険を例として、次のようにしていました。

term.py
result_df = pd.DataFrame(results)
grouped = result_df.groupby("t").sum()
summary = grouped.reset_index()
summary.to_excel("term_result.xlsx", index=False)

groupby("t").sum()tによる集計を意味しています。

この集計キーtを変更することで、
男女別や年齢別などで集計できます。
性別や年齢層による傾向を調べることができます。

例として定期保険の保険収支をあげます。
経過年数と性別をキーとして集計してみます。
少し前のresultsの部分から修正します。

term.py
        results.append({"t":t, "sex": sex,
                        "inprem":int(inprem[t]),
                        "interest":int(interest[t]),
                        "benefit":int(benefit[t]),
                        "surrender":int(surrender[t]), 
                        "expenses":int(expenses[t]),
                        "reserve":int(reserve[t]), 
                        "profit":int(profit[t])
        })

result_df = pd.DataFrame(results)
grouped = result_df.groupby(["sex", "t"]).sum()
summary = grouped.reset_index()
summary.to_excel("endowment_result.xlsx", index=False)

resultsには集計のキーとなる性別sexを加えます。
更に、groupby(["sex", "t"])として、
性別と経過年数をキーとして集計しています。

結果を確認してみます。
作成されたファイルを開くと次のようになっています。
image.png
性別ごとに収支が取りまとめられます。
こういったことを利用して、
性別ごとの分析や年齢層による分析などを行います。

まとめ

今回は、本筋とは異なりますが、
実務で使用できそうな内容を取り扱ってみました。
今後も、実務で使えそうだったり、
コードを効率化できたりしそうな内容があれば紹介します。

前の記事
pandasを使ったExcelとの連携

次の記事

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