アクチュアリーのためのPython入門(第19回)
保険料積立金の計算と保険収支の分析
📚 アクチュアリーのためのPython入門
この記事は入門編の一部です。
▶ 目次はこちら
はじめに
今回はコードの追加修正ではなくて、
過去に取り扱った内容で、
実務ではこういうこともできるよという内容を紹介します。
- 平準純保険料式とチルメル式の保険料積立金を一度に計算する
- 保険収支を
tで集計はなく、年齢や性別で集計する
ことを取り上げます。
なお、今回の内容は次回以降には反映させません。
保険料と保険料積立金の計算
現在、保険料を計算している関数は、
純保険料と営業保険料を別々としています。
ですが、それぞれで同じ給付現価を使い、
途中まで同じ計算を異なる箇所で行っています。
これを1つにまとめた方が、
関数が減るので、プログラムは短くなります。
また、修正が必要なときは1カ所の修正で済みます。
ただ、別々の関数で計算するより、
数行の計算は増えてしまいます。
増える時間は微々たるものなので、
プログラムを見やすく修正しやすくすることを選びます。
保険料の計算
具体的には次のとおりです。
養老保険を例としています。
# 保険料の計算
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年チルメル式保険料積立金と、
解約返戻金を一度に計算してみます。
保険料積立金のコードに
チルメル部分の計算と解約返戻金の計算を加えて、
次のようにします。
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だけではなく、
性別や年齢による集計を行ってみます。
前回までの保険収支の最後の部分は、
定期保険を例として、次のようにしていました。
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の部分から修正します。
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"])として、
性別と経過年数をキーとして集計しています。
結果を確認してみます。
作成されたファイルを開くと次のようになっています。

性別ごとに収支が取りまとめられます。
こういったことを利用して、
性別ごとの分析や年齢層による分析などを行います。
まとめ
今回は、本筋とは異なりますが、
実務で使用できそうな内容を取り扱ってみました。
今後も、実務で使えそうだったり、
コードを効率化できたりしそうな内容があれば紹介します。
◀ 前の記事
pandasを使ったExcelとの連携
▶ 次の記事
📚 目次
アクチュアリーのためのPython入門