==================================================================== チュートリアル2 ==================================================================== 次に、養老保険の\ **キャッシュフロー計算を行いプロフィットマージンを計算するまでのモデル**\ について説明します。 (Web上でモデルを参照する場合は、\ :doc:`モデル2<9000_demo2>` をご覧下さい) モデルを開く --------------- :doc:`1100_tutorial` と同様に、PyCharmでサンプルモデルのdemo2を開き、 :ref:`コマンドウィンドウ ` を開いて下さい。 モデルのランを行う ------------------------------ :doc:`1100_tutorial` と同様に、ランを実行して下さい。 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) という流れで進んでいきます モジュール ........................................ :ref:`module` は計算クラスの意味的な区切りです。 以下の使い方や制約があります。 * | 出力対象の変数はモジュール単位で設定できます。 | そのため、あるモジュールの一部の変数のみ出力させたい場合は、出力変数のみを集めたモジュールを作ります。 * | モジュールごとにタイムステップを持つことができます。 | なので、レート計算では年齢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の変数 のような計算はできません。 関数 ........................................ | :ref:`function` は、やや複雑な計算ロジックを表すためのものです。 | 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の内容を理解していることになります! * :ref:`problem2`