チュートリアル2

次に、養老保険のキャッシュフロー計算を行いプロフィットマージンを計算するまでのモデルについて説明します。

(Web上でモデルを参照する場合は、モデル2 をご覧下さい)

モデルを開く

チュートリアル1 と同様に、PyCharmでサンプルモデルのdemo2を開き、 コマンドウィンドウ を開いて下さい。

モデルのランを行う

チュートリアル1 と同様に、ランを実行して下さい。

  1. コマンドウィンドウで delver と入力し、Enterを押して実行して下さい

  2. resultフォルダが作成され、その中に計算結果のファイルが作成されていれば成功です

    インフォース、デバッグ用計算結果の他に、

    • endow-bspl.txtでPL項目・BS項目をインフォースごとに出力しています
    • endow-profitability.txtでプロフィットマージンや保険料収入現価などをインフォースごとに出力しています

モデルを理解する

チュートリアル1では扱わなかった部分を中心に説明をしていきます。

モデル

このサンプルのモデルは、model\base.modelに記述されています。

モデルの内容

  • 計算クラスがBaseで、それはモジュールUtil, CT_P, CT_V, Rate, CashFlow, OutputProfitability, OutputBSPLを持ちます
  • Utilは他のモジュールで共通に使用する変数・関数のためのモジュールです
  • Rateはレート計算用のモジュールです
  • CT_P, CT_Vは基数を表します。P基礎とV基礎の基数がともに必要なため、ほぼ同じ算式で2つのモジュールを記述しています
  • CashFlowはキャッシュフロー計算用のモジュールです。前提、生命表、キャッシュフロー、収益性の計算などを行います。
  • OutputProfitability, OutputBSPLは出力用の変数を指定するためのモジュールです。
  • 計算は、基数(CT_P, CT_V) ⇒ レート(Rate) ⇒ キャッシュフロー(CashFlow) という流れで進んでいきます

モジュール

モジュール は計算クラスの意味的な区切りです。 以下の使い方や制約があります。

  • 出力対象の変数はモジュール単位で設定できます。
    そのため、あるモジュールの一部の変数のみ出力させたい場合は、出力変数のみを集めたモジュールを作ります。
  • モジュールごとにタイムステップを持つことができます。
    なので、レート計算では年齢x、キャッシュフローでは経過期間tでタイムステップを持つということができます。
  • モジュール間では、<モジュール名>.<変数名/関数名>という形で他のモジュールの変数・関数を使用することができます。
    例えば、保険料や給付現価を計算するときに、基数や年金現価を CT_P.Dx(x + n)CT_P.annuity_xn(x, n) として参照しています。
    // 月払保険料
    double baseP =
          ( benefit_P(0) + alpha + CT_P.annuity_xn(x, n) * gamma )
            / ( (1.0 - beta) * CT_P.annuity_xn_12(x, m) * 12.0 )
    
    // 経過t年での給付現価
    double[] benefit_P =
                     if (t > n)                     { 0.0 }
                     elseif (CT_P.Dx(x + t) <= 0.0) { 0.0 }
                     else   { (CT_P.Mx(x + t) - CT_P.Mx(x + n) + CT_P.Dx(x + n)) / CT_P.Dx(x + t) }
    
  • モジュール間で参照関係が循環していてはいけません。
    例えば、モジュールAの変数⇒モジュールBの変数⇒モジュールAの変数 のような計算はできません。

関数

関数 は、やや複雑な計算ロジックを表すためのものです。
0個以上の引数をとり、計算結果を返します。
  • このサンプルでは、基数による終身年金現価の関数を定義しています。 このようにすることで、その後の計算で必要なときに使用できます。

    function double annuity_x(int x) =
        if (Dx(x) <= 0) { 0.0 }
        else { Nx(x) / Dx(x) }
    
  • 関数はモジュール内・モジュール外どちらからも使用できます。

  • 関数そのものは出力されません。他の変数や関数に呼び出されることで意味を持ちます。

インプット

ラン定義

  • ラン定義のoutputでカンマ区切りで指定することによって、複数の出力定義を指定しています。

出力定義

  • デバッグ用のdebug, 収益性を表形式で表すためのprofitability, BSPLを確認するためのbsplを定義しています

  • profitabilityでは、pivotでvariableと指定することにより、モジュールOutputProfitabilityをインフォース・シナリオ・ショックを行のキー、変数を列のキーとした表形式で出力します。
    (なお、表形式にできないため、配列型の変数は出力されず、スカラー値の変数のみが出力されます)
    また、sc_st, sc_la, sh_st, sc_laに指定をしないことにより、すべてのシナリオ・ショックでの計算結果を出力します。
    どのように出力されるかはresultフォルダのendow-profitablitiy.txtをご覧下さい。

インフォース

  • チュートリアル1より実務での契約の情報に近くなっており、プランplan, 契約年齢x, 保険期間n, 払込期間m, 性別sex, 保険金額Sを設定しています。

練習問題

以下の練習問題が解ければ、十分にチュートリアル2の内容を理解していることになります!