【COBOL学習|初心者向け】COBOLの組込関数「PRESENT-VALUE」で期間ごとに異なる割引率を扱う方法

1. 導入:PRESENT-VALUE関数の限界と課題

COBOLの組込関数であるPRESENT-VALUEは、一定の割引率を使用して将来のキャッシュフローを現在価値に換算する際に非常に便利です。しかし、この関数には「割引率は単一の値でなければならない」という制約があります。実務では、期間ごとに金利が変動するケースや、リスクプレミアムを考慮して年ごとに異なる割引率を適用したい場面が多くあります。今回は、この制約を乗り越え、柔軟な現在価値計算を行うための実装テクニックを解説します。

2. 基礎知識:現在価値(PV)の考え方

現在価値(Present Value)とは、将来受け取る予定の金額を、特定の割引率で割り引いて「今の価値」に直したものです。計算式は「将来価値 ÷ (1 + 割引率)^期間」となります。
組込関数のPRESENT-VALUEは、この計算を簡略化してくれますが、引数に指定できる割引率は1つだけです。そのため、年ごとに割引率が変化する複雑なモデルを計算するには、「1年ごとの現在価値を計算して合計する」という、より原始的かつ確実なループ処理が必要になります。

3. 実装/解決策:ループによる逐次計算

解決策はシンプルです。配列(テーブル)に将来のキャッシュフローと、各期間に対応する割引率を格納しておき、PERFORM文で1年ずつ計算して合計値を累積させる方法です。これにより、組込関数の制約に縛られることなく、どんな複雑な金利変動モデルにも対応できます。

4. サンプルプログラム

以下のコードは、期間ごとの割引率(配列)を使用して現在価値を算出する実装例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. PV-CALC-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.

  • 将来のキャッシュフロー(5年分)

01 CF-TABLE.
05 CF PIC 9(9) OCCURS 5 TIMES VALUE 1000.

  • 期間ごとの割引率(例:1%から5%へ変動)

01 RATE-TABLE.
05 RATE PIC V9(4) OCCURS 5 TIMES VALUE 0.01, 0.02, 0.03, 0.04, 0.05.
01 I PIC 9 VALUE 1.
01 TOTAL-PV PIC 9(9)V99 VALUE 0.
01 WORK-PV PIC 9(9)V99.

PROCEDURE DIVISION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5

  • 計算式: 現在価値 = キャッシュフロー / (1 + 割引率)^期間
  • ※ここでは簡易的に単年ごとの割引を累積するロジックを想定

COMPUTE WORK-PV = CF(I) / ((1 + RATE(I)) I)
ADD WORK-PV TO TOTAL-PV
END-PERFORM.

DISPLAY “計算された現在価値: ” TOTAL-PV.
STOP RUN.

5. 応用・注意点:現場で陥りやすいバグの回避

実務でこの計算を行う際、特に注意すべきは「小数点以下の桁数(精度)」です。
COBOLのCOMPUTE文において、計算途中の数値が小数点以下を切り捨ててしまうと、最終的な合計値に大きな誤差が生じます。必ず、中間結果を保持する項目(WORK-PVなど)には、十分な小数点以下の桁数(PIC V9999など)を確保してください。

また、ビジネス計算では端数処理(ROUNDED)を指定するかどうかが重要になります。要件定義書を確認し、各計算ステップで四捨五入が必要か、あるいは合計後に端数処理を行うべきかを明確にしてから実装するようにしましょう。原始的なCOMPUTE式への書き換えは、一見手間ですが、仕様変更への耐性が高く、デバッグもしやすいという大きなメリットがあります。

コメント

タイトルとURLをコピーしました