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-10

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

性別の引数を加えた給付現価

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

はじめに

前回は、男女別の死亡率を用いて、
計算基数表($D_x$, $N_x$, $C_x$, $M_x$)を性別ごとに
一括で作成しました。

今回は、その続きとして、

  • 給付現価、年金現価の関数を性別対応に修正
  • 年満期だけではなく、年齢満期を同じロジックで扱えるように整理

ということを行います。

前提条件

前回と同様に、

<対象商品>

  • 定期保険:保険期間10年、20年、30年
  • 養老保険:保険期間10年、20年、30年
  • 終身保険:払込満了60歳、65歳、70歳

<加入範囲>

  • 加入年齢:20~50歳
  • 性別:男女

としていきます。

給付現価の修正

給付現価、年金現価については基本的に同じです。
ただし、今回は

  • 性別ごとに計算基数表を持つ
  • 呼び出し時にsexを指定する

という点が加わっています。

また、終身保険を追加するので、
対象となる給付現価を増やしています。

# 養老給付現価の関数
def Axn(sex, start_age, n):
    # 給付現価の計算
    value = (Mx[sex][start_age] - Mx[sex][start_age + n] \
              + Dx[sex][start_age + n]) / Dx[sex][start_age]
    return value

# 定期給付現価の関数
def A1xn(sex, start_age, n):
    # 給付現価の計算
    value = (Mx[sex][start_age] - Mx[sex][start_age + n]) / Dx[sex][start_age]
    return value

# 終身給付現価の関数
def A1x(sex, start_age):
    # 給付現価の計算
    value = Mx[sex][start_age] / Dx[sex][start_age]
    return value

# 定期年金現価の関数
def axn(sex, start_age, n):
    # 年金現価の計算
    value = (Nx[sex][start_age] - Nx[sex][start_age + n]) / Dx[sex][start_age]
    return value

# 終身年金現価の関数
def ax(sex, start_age):
    # 年金現価の計算
    value = Nx[sex][start_age] / Dx[sex][start_age]
    return value

保険期間の変換

実務では、保険期間は必ずしも「10年」「20年」といった
年満期だけで指定されるわけではなく、

  • 65歳満期
  • 70歳満期

のように、満期年齢で保険期間が定義されることもあります。

ここでは、

  • 年満期:10,20など
  • 年齢満期:"A65"のように年齢に"A"を付けて指定

という形式を取り、
保険料の計算の際に、「保険期間n」に変換してから計算する
という設計にします。

この形にしておくと、年満期も年齢満期も、
同じ保険料計算ロジックで処理できます。

変換する関数のコードは次のとおりです。

# 保険期間の変換
def parse_term(period, age):
    # 数値の場合はそのまま保険期間
    if isinstance(period, int): # ←isinstanceは整数かどうかの判定
        return period

    # 文字列かつAではじまる場合は保険期間=満期年齢-加入年齢
    # startswithはAではじまっているかの判定
    if isinstance(period, str) and period.upper().startswith("A"): 
        maturity_age = int(period[1:])
        term = maturity_age - age
        # 保険期間が0以下ならエラー
        if term <= 0:
            raise ValueError("満期年齢が加入年齢以下です")
        return term

    raise ValueError(f"不正な期間指定: {period}")   
  • periodは先ほどの年または年齢Aの保険期間の引数とします
  • ageは加入年齢を引数とします
     
  • isinstance(period, int)は、periodが整数ならtrueとなります
  • isinstance(period, str)は、periodが文字ならtrueとなります
  • それ以外はraise ValueErrorで例外処理としてエラーを出力します
     
  • upper().startswith("A")Aで始まる場合はtrueとなります
  • upperをつけて、小文字のaでもtrueになるようにしています

この関数を次回に保険料を計算する関数へ組み込んでいきます。

まとめ

今回は、給付現価に性別を加えて修正しました。
また、年齢満期を保険期間へ変換する関数を作成しました。
これらを使って、次回は保険料の計算とレート表を作成します。


📚 ナビゲーション
前の記事
性別を加えた計算基数

次の記事
保険料レート表の作成

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