導入:なぜ今、COBOLで財務計算なのか
業務システムにおいて、将来の収益を現在の価値に換算する「純現在価値(NPV)」の算出は、投資判断やリース料の計算などで避けて通れない処理です。かつては複雑なループ処理や累乗計算を自前で実装していましたが、保守性の観点からバグの温床になりがちでした。COBOLの組込関数であるPRESENT-VALUE関数を活用すれば、複雑な数式をたった一行で、かつ正確に記述できます。
基礎知識:純現在価値(NPV)とは
純現在価値(Net Present Value)とは、将来得られるキャッシュフローを、一定の割引率を用いて現在の価値に割り引いた合計額のことです。「1年後の100万円」は、金利(割引率)を考慮すると「現在の100万円未満」の価値しかない、という金融の基本概念に基づいています。COBOLのこの関数は、指定されたテーブル内の全要素を自動的に累乗計算し、合計してくれる非常に強力なツールです。
実装:PRESENT-VALUE関数の仕組み
この関数は、第一引数に「割引率」、第二引数に「キャッシュフローのテーブル」を受け取ります。
関数は内部で以下の計算を自動的に行っています:
(キャッシュフロー1 / (1 + 割引率)^1) + (キャッシュフロー2 / (1 + 割引率)^2) + …
サンプルプログラム
以下は、5年間のキャッシュフローから現在の価値を求める実用的な例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. NPV-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 割引率(例:3%)
01 WS-RATE PIC S9V9(4) VALUE 0.03.
- キャッシュフローのテーブル(5年分)
01 WS-CASH-TABLE.
05 WS-CASH PIC S9(9) OCCURS 5 TIMES.
01 WS-NPV PIC S9(9)V99.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
- テーブルへのデータセット
MOVE 100000 TO WS-CASH(1)
MOVE 200000 TO WS-CASH(2)
MOVE 300000 TO WS-CASH(3)
MOVE 400000 TO WS-CASH(4)
MOVE 500000 TO WS-CASH(5)
- PRESENT-VALUE関数の実行
- (ALL)を指定することでテーブル全体を対象にします
COMPUTE WS-NPV = FUNCTION PRESENT-VALUE(WS-RATE, WS-CASH(ALL))
DISPLAY “算出された純現在価値は: ” WS-NPV
GOBACK.
応用・注意点:現場で陥りやすい罠
1. 割引率の単位:第一引数に渡す割引率はパーセンテージ(3%なら3)ではなく、小数(0.03)で指定する必要があります。ここを間違えると数値が激しく乖離します。
2. テーブルの初期化:OCCURS句で定義したテーブルに、計算対象外の領域(ゴミデータ)が含まれていないか注意してください。必ず「必要な要素数分」だけを対象にするか、事前にゼロクリアを行うのが鉄則です。
3. 精度の管理:金融計算では端数処理が重要です。COMPUTE文の結果を格納する変数の桁数は、計算結果がオーバーフローしないよう十分な余裕(PIC句)を持って定義してください。
この関数を使いこなせば、財務ロジックの可読性が格段に向上します。ぜひ次回の開発で活用してみてください。

コメント