C 言語で正味現在価値 (NPV) を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C 言語で正味現在価値 (NPV) を計算する方法を学びます。この実験では、一連のキャッシュフローと割引率を読み込み、各キャッシュフローを割引し、それらを合計して NPV を計算する手順を指導します。ユーザーに必要なデータを入力できるようにし、計算された NPV を表示する C プログラムを作成します。この実験では、金融数学の基本概念と、C プログラムを用いた利子計算について扱います。

キャッシュフローと割引率の入力

このステップでは、C 言語で正味現在価値 (NPV) を計算するために、一連のキャッシュフローと割引率を入力する方法を学びます。複数のキャッシュフローと割引率を入力できるようにするプログラムを作成します。

まず、NPV 計算用の新しい C ファイルを作成します。

cd ~/project
nano npv_calculator.c

次に、以下のコードをファイルに追加します。

#include <stdio.h>

#define MAX_CASH_FLOWS 10

int main() {
    double cash_flows[MAX_CASH_FLOWS];
    double discount_rate;
    int num_cash_flows;

    // キャッシュフローの数を入力
    printf("キャッシュフローの数を入力してください (最大 %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // キャッシュフロー数の検証
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("無効なキャッシュフロー数です。\n");
        return 1;
    }

    // キャッシュフローを入力
    for (int i = 0; i < num_cash_flows; i++) {
        printf("キャッシュフロー %d を入力してください:", i);
        scanf("%lf", &cash_flows[i]);
    }

    // 割引率を入力
    printf("割引率を入力してください (小数で): ");
    scanf("%lf", &discount_rate);

    // 入力内容の確認
    printf("\n入力内容の確認:\n");
    printf("キャッシュフローの数:%d\n", num_cash_flows);
    printf("割引率:%.2f%%\n", discount_rate * 100);

    printf("\nキャッシュフロー:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("キャッシュフロー %d: $%.2f\n", i, cash_flows[i]);
    }

    return 0;
}

プログラムをコンパイルします。

gcc -o npv_calculator npv_calculator.c

プログラムを実行して入力をテストします。

./npv_calculator

出力例:

キャッシュフローの数を入力してください (最大 10): 3
キャッシュフロー 0 を入力してください: -1000
キャッシュフロー 1 を入力してください: 500
キャッシュフロー 2 を入力してください: 600
割引率を入力してください (小数で): 0.1

入力内容の確認:
キャッシュフローの数: 3
割引率: 10.00%

キャッシュフロー:
キャッシュフロー 0: $-1000.00
キャッシュフロー 1: $500.00
キャッシュフロー 2: $600.00

このコードは、以下のことを示しています。

  1. キャッシュフローの最大数を定義する
  2. ユーザーからキャッシュフローの数を入力する
  3. 個々のキャッシュフローの値を入力する
  4. 割引率を入力する
  5. 入力内容を検証して表示する

このプログラムは、NPV 計算に必要な基本的な入力パラメータを取得することで、NPV 計算のための基礎を築きます。

各キャッシュフローの割引と合計

このステップでは、C 言語で各キャッシュフローを割引し、割引後のキャッシュフローを合計することで正味現在価値 (NPV) を計算する方法を学びます。

前の npv_calculator.c ファイルを修正して、NPV 計算を追加します。

cd ~/project
nano npv_calculator.c

以前のコードを以下の実装に置き換えます。

#include <stdio.h>
#include <math.h>

#define MAX_CASH_FLOWS 10

double calculate_npv(double cash_flows[], int num_cash_flows, double discount_rate) {
    double npv = 0.0;

    for (int i = 0; i < num_cash_flows; i++) {
        // 各キャッシュフローを割引する:CF / (1 + r)^t
        double discounted_cash_flow = cash_flows[i] / pow(1 + discount_rate, i);
        npv += discounted_cash_flow;
    }

    return npv;
}

int main() {
    double cash_flows[MAX_CASH_FLOWS];
    double discount_rate;
    int num_cash_flows;

    // キャッシュフローの数を入力
    printf("キャッシュフローの数を入力してください (最大 %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // キャッシュフロー数の検証
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("無効なキャッシュフロー数です。\n");
        return 1;
    }

    // キャッシュフローを入力
    for (int i = 0; i < num_cash_flows; i++) {
        printf("キャッシュフロー %d を入力してください:", i);
        scanf("%lf", &cash_flows[i]);
    }

    // 割引率を入力
    printf("割引率を入力してください (小数で): ");
    scanf("%lf", &discount_rate);

    // NPV を計算
    double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);

    // 結果を出力
    printf("\n入力内容の確認:\n");
    printf("キャッシュフローの数:%d\n", num_cash_flows);
    printf("割引率:%.2f%%\n", discount_rate * 100);

    printf("\nキャッシュフロー:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
        printf("キャッシュフロー %d: $%.2f (割引後:$%.2f)\n",
               i, cash_flows[i], discounted_cf);
    }

    printf("\n正味現在価値 (NPV): $%.2f\n", npv);

    return 0;
}

数学ライブラリを使用してプログラムをコンパイルします。

gcc -o npv_calculator npv_calculator.c -lm

プログラムを実行して NPV 計算をテストします。

./npv_calculator

出力例:

キャッシュフローの数を入力してください (最大 10): 3
キャッシュフロー 0 を入力してください: -1000
キャッシュフロー 1 を入力してください: 500
キャッシュフロー 2 を入力してください: 600
割引率を入力してください (小数で): 0.1

入力内容の確認:
キャッシュフローの数: 3
割引率: 10.00%

キャッシュフロー:
キャッシュフロー 0: $-1000.00 (割引後: $-1000.00)
キャッシュフロー 1: $500.00 (割引後: $454.55)
キャッシュフロー 2: $600.00 (割引後: $495.87)

正味現在価値 (NPV): $-49.58

この実装の重要な点は以下のとおりです。

  1. NPV を計算するcalculate_npv()関数を追加
  2. pow()関数を使用してキャッシュフローを割引
  3. 元のキャッシュフローと割引後のキャッシュフローの両方を表示
  4. 最終的な NPV を計算して表示

注意:-lm フラグは、pow() 関数のために数学ライブラリをリンクするために使用されます。

NPV の出力

この最終ステップでは、ユーザーフレンドリーな形式で正味現在価値 (NPV) 計算結果を解釈および提示する方法を学びます。

npv_calculator.c を修正して、出力表示を強化します。

cd ~/project
nano npv_calculator.c

改良された出力書式でコードを更新します。

#include <stdio.h>
#include <math.h>

#define MAX_CASH_FLOWS 10

double calculate_npv(double cash_flows[], int num_cash_flows, double discount_rate) {
    double npv = 0.0;

    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cash_flow = cash_flows[i] / pow(1 + discount_rate, i);
        npv += discounted_cash_flow;
    }

    return npv;
}

void print_npv_analysis(double cash_flows[], int num_cash_flows, double discount_rate, double npv) {
    printf("\n--- NPV 分析レポート ---\n");
    printf("割引率:%.2f%%\n", discount_rate * 100);

    printf("\nキャッシュフロー詳細:\n");
    printf("--------------------\n");
    for (int i = 0; i < num_cash_flows; i++) {
        double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
        printf("期間 %d: $%.2f (割引後:$%.2f)\n",
               i, cash_flows[i], discounted_cf);
    }

    printf("\n正味現在価値 (NPV): $%.2f\n", npv);

    // NPV 結果の解釈
    if (npv > 0) {
        printf("投資推奨:受諾\n");
        printf("このプロジェクトは価値を生み出すと予想されます。\n");
    } else if (npv < 0) {
        printf("投資推奨:拒否\n");
        printf("このプロジェクトは価値を破壊すると予想されます。\n");
    } else {
        printf("投資推奨:中立\n");
        printf("このプロジェクトは、与えられた割引率で収支分岐します。\n");
    }
}

int main() {
    double cash_flows[MAX_CASH_FLOWS];
    double discount_rate;
    int num_cash_flows;

    printf("正味現在価値 (NPV) 計算機\n");
    printf("========================\n");

    // キャッシュフローの数を入力
    printf("キャッシュフローの数を入力してください (最大 %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    // キャッシュフロー数の検証
    if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
        printf("無効なキャッシュフロー数です。\n");
        return 1;
    }

    // キャッシュフローを入力
    for (int i = 0; i < num_cash_flows; i++) {
        printf("期間 %d のキャッシュフローを入力してください:", i);
        scanf("%lf", &cash_flows[i]);
    }

    // 割引率を入力
    printf("割引率を入力してください (小数で): ");
    scanf("%lf", &discount_rate);

    // NPV を計算
    double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);

    // NPV 分析を出力
    print_npv_analysis(cash_flows, num_cash_flows, discount_rate, npv);

    return 0;
}

プログラムをコンパイルします。

gcc -o npv_calculator npv_calculator.c -lm

プログラムを実行して、強化された NPV 出力をテストします。

./npv_calculator

出力例:

正味現在価値 (NPV) 計算機
========================
キャッシュフローの数を入力してください (最大 10): 3
期間 0 のキャッシュフローを入力してください: -1000
期間 1 のキャッシュフローを入力してください: 500
期間 2 のキャッシュフローを入力してください: 600
割引率を入力してください (小数で): 0.1

--- NPV 分析レポート ---
割引率: 10.00%

キャッシュフロー詳細:
--------------------
期間 0: $-1000.00 (割引後: $-1000.00)
期間 1: $500.00 (割引後: $454.55)
期間 2: $600.00 (割引後: $495.87)

正味現在価値 (NPV): $-49.58
投資推奨: 拒否
このプロジェクトは価値を破壊すると予想されます。

このバージョンの主な改善点は以下のとおりです。

  1. 専用のprint_npv_analysis()関数を追加
  2. 出力書式を強化
  3. NPV に基づいた投資推奨を追加
  4. 見出しを明確にしてユーザーインターフェースを改善

まとめ

この実験では、一連のキャッシュフローと割引率を読み込み、C 言語で正味現在価値 (NPV) を計算する方法を学びました。複数のキャッシュフローと割引率を入力を受け付け、プログラムがそれらの入力を検証するために出力するプログラムを作成しました。

次に、各キャッシュフローを割引し、それらを合計して NPV を計算し、最終結果を出力する方法を学びます。