Approximierte interne Rendite (IRR) in C

CCBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Labor lernen wir, wie man die interne Rendite (IRR) mit einem C-Programm approximiert. Wir beginnen mit der Eingabe der Cashflows, die das investierte oder erhaltene Geld zu verschiedenen Zeitpunkten einer Investition darstellen. Anschließend verwenden wir einen iterativen Ansatz, um den Zinssatz zu finden, bei dem der Nettobarwert (NPV) ungefähr Null ist, was uns die geschätzte IRR liefert. Schließlich geben wir die berechnete IRR aus. Das Labor behandelt wichtige finanzmathematische Konzepte und demonstriert deren Implementierung in der C-Programmierung.

Cashflows einlesen

In diesem Schritt lernen wir, wie man Cashflows liest und speichert, um die interne Rendite (IRR) in einem C-Programm zu berechnen. Cashflows repräsentieren das investierte oder erhaltene Geld zu verschiedenen Zeitpunkten einer Investition.

Erstellen wir zunächst eine C-Datei, um die Funktionalität zum Einlesen der Cashflows zu implementieren:

cd ~/project
nano irr_calculation.c

Schreiben wir nun den Anfangscode zum Einlesen der Cashflows:

#include <stdio.h>
#define MAX_CASH_FLOWS 10

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

    printf("Geben Sie die Anzahl der Cashflows ein (max %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    printf("Geben Sie die Cashflows ein (negativ für Investitionen, positiv für Erträge):\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Cashflow %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    // Ausgabe der eingegebenen Cashflows zur Überprüfung
    printf("\nEingabe der Cashflows:\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Cashflow %d: %.2f\n", i, cash_flows[i]);
    }

    return 0;
}

Kompilieren und ausführen des Programms:

gcc irr_calculation.c -o irr_calculation
./irr_calculation

Beispielausgabe:

Geben Sie die Anzahl der Cashflows ein (max 10): 4
Geben Sie die Cashflows ein (negativ für Investitionen, positiv für Erträge):
Cashflow 0: -1000
Cashflow 1: 300
Cashflow 2: 400
Cashflow 3: 500

Eingabe der Cashflows:
Cashflow 0: -1000.00
Cashflow 1: 300.00
Cashflow 2: 400.00
Cashflow 3: 500.00
Erklärung
  • Wir definieren eine maximale Anzahl von Cashflows (MAX_CASH_FLOWS), um einen übermäßigen Speicherverbrauch zu vermeiden.
  • Das Programm fragt den Benutzer zunächst nach der Anzahl der Cashflows ab.
  • Anschließend fordert es den Benutzer auf, jeden Cashflow-Wert einzugeben.
  • Negative Werte repräsentieren anfängliche Investitionen.
  • Positive Werte repräsentieren Erträge oder Einnahmen.
  • Das Programm gibt die eingegebenen Cashflows zur Überprüfung aus.

Verwendung von Iteration zur Bestimmung des Zinssatzes, bei dem der NPV ≈ 0 ist

In diesem Schritt erweitern wir unser vorheriges Cashflow-Programm, um die interne Rendite (IRR) mithilfe eines iterativen numerischen Verfahrens zu berechnen.

Ändern wir zunächst unsere bestehende C-Datei:

cd ~/project
nano irr_calculation.c

Implementieren wir nun die Logik zur Berechnung von NPV und IRR:

#include <stdio.h>
#include <math.h>
#define MAX_CASH_FLOWS 10
#define EPSILON 0.0001

double calculate_npv(double cash_flows[], int num_cash_flows, double rate) {
    double npv = 0.0;
    for (int i = 0; i < num_cash_flows; i++) {
        npv += cash_flows[i] / pow(1 + rate, i);
    }
    return npv;
}

double find_irr(double cash_flows[], int num_cash_flows) {
    double rate_low = -0.9;
    double rate_high = 10.0;
    double rate = 0.1;

    while ((rate_high - rate_low) > EPSILON) {
        double npv = calculate_npv(cash_flows, num_cash_flows, rate);

        if (fabs(npv) < EPSILON) {
            return rate;
        }

        if (npv > 0) {
            rate_low = rate;
        } else {
            rate_high = rate;
        }

        rate = (rate_low + rate_high) / 2.0;
    }

    return rate;
}

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

    printf("Geben Sie die Anzahl der Cashflows ein (max %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    printf("Geben Sie die Cashflows ein (negativ für Investitionen, positiv für Erträge):\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Cashflow %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    double irr = find_irr(cash_flows, num_cash_flows);
    printf("\nApproximierte interne Rendite (IRR): %.4f oder %.2f%%\n", irr, irr * 100);

    return 0;
}

Kompilieren Sie das Programm mit der Mathematikbibliothek:

gcc irr_calculation.c -o irr_calculation -lm

Führen Sie das Programm mit Beispiel-Cashflows aus:

./irr_calculation

Beispielausgabe:

Geben Sie die Anzahl der Cashflows ein (max 10): 4
Geben Sie die Cashflows ein (negativ für Investitionen, positiv für Erträge):
Cashflow 0: -1000
Cashflow 1: 300
Cashflow 2: 400
Cashflow 3: 500

Approximierte interne Rendite (IRR): 0.2154 oder 21.54%
Erklärung
  • calculate_npv() berechnet den Nettobarwert für einen gegebenen Zinssatz.
  • find_irr() verwendet die Bisektionsmethode, um den Zinssatz zu finden, bei dem der NPV ≈ 0 ist.
  • Wir verwenden EPSILON, um die Konvergenzgenauigkeit zu definieren.
  • Der Algorithmus verengt iterativ den IRR-Bereich.
  • Die endgültige IRR wird als Dezimalzahl und Prozentsatz ausgegeben.

Ausgabe der geschätzten IRR

In diesem letzten Schritt erweitern wir unser IRR-Berechnungsprogramm, um detailliertere Ausgaben zu liefern und verschiedene Investitionsszenarien zu demonstrieren.

Ändern wir unsere bestehende C-Datei, um eine umfassendere IRR-Analyse hinzuzufügen:

cd ~/project
nano irr_calculation.c

Aktualisieren Sie den Code mit zusätzlichen Ausgaben und Analysen:

#include <stdio.h>
#include <math.h>
#define MAX_CASH_FLOWS 10
#define EPSILON 0.0001

double calculate_npv(double cash_flows[], int num_cash_flows, double rate) {
    double npv = 0.0;
    for (int i = 0; i < num_cash_flows; i++) {
        npv += cash_flows[i] / pow(1 + rate, i);
    }
    return npv;
}

double find_irr(double cash_flows[], int num_cash_flows) {
    double rate_low = -0.9;
    double rate_high = 10.0;
    double rate = 0.1;

    while ((rate_high - rate_low) > EPSILON) {
        double npv = calculate_npv(cash_flows, num_cash_flows, rate);

        if (fabs(npv) < EPSILON) {
            return rate;
        }

        if (npv > 0) {
            rate_low = rate;
        } else {
            rate_high = rate;
        }

        rate = (rate_low + rate_high) / 2.0;
    }

    return rate;
}

void print_investment_analysis(double cash_flows[], int num_cash_flows, double irr) {
    double total_investment = 0;
    double total_returns = 0;

    printf("\n--- Investitionsanalyse ---\n");

    // Detaillierte Aufschlüsselung der Cashflows
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Periode %d: $%.2f\n", i, cash_flows[i]);

        if (cash_flows[i] < 0) {
            total_investment += fabs(cash_flows[i]);
        } else {
            total_returns += cash_flows[i];
        }
    }

    // Investitionsübersicht
    printf("\nGesamtinvestition: $%.2f\n", total_investment);
    printf("Gesamterträge: $%.2f\n", total_returns);
    printf("Nettogewinn: $%.2f\n", total_returns - total_investment);

    // IRR-Details
    printf("\nInterne Rendite (IRR):\n");
    printf("Dezimalwert: %.4f\n", irr);
    printf("Prozentwert: %.2f%%\n", irr * 100);

    // Interpretation der Investitionsleistung
    if (irr > 0.15) {
        printf("\nInvestitionsleistung: Ausgezeichnet\n");
    } else if (irr > 0.10) {
        printf("\nInvestitionsleistung: Gut\n");
    } else if (irr > 0) {
        printf("\nInvestitionsleistung: Mittel\n");
    } else {
        printf("\nInvestitionsleistung: Schlecht\n");
    }
}

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

    printf("Geben Sie die Anzahl der Cashflows ein (max %d): ", MAX_CASH_FLOWS);
    scanf("%d", &num_cash_flows);

    printf("Geben Sie die Cashflows ein (negativ für Investitionen, positiv für Erträge):\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Cashflow %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    double irr = find_irr(cash_flows, num_cash_flows);
    print_investment_analysis(cash_flows, num_cash_flows, irr);

    return 0;
}

Kompilieren Sie das Programm:

gcc irr_calculation.c -o irr_calculation -lm

Führen Sie das Programm mit einem Beispiel-Investitionsszenario aus:

./irr_calculation

Beispielausgabe:

Geben Sie die Anzahl der Cashflows ein (max 10): 4
Geben Sie die Cashflows ein (negativ für Investitionen, positiv für Erträge):
Cashflow 0: -1000
Cashflow 1: 300
Cashflow 2: 400
Cashflow 3: 500

--- Investitionsanalyse ---
Periode 0: $-1000.00
Periode 1: $300.00
Periode 2: $400.00
Periode 3: $500.00

Gesamtinvestition: $1000.00
Gesamterträge: $1200.00
Nettogewinn: $200.00

Interne Rendite (IRR):
Dezimalwert: 0.2154
Prozentwert: 21.54%

Investitionsleistung: Ausgezeichnet
Erklärung
  • Die Funktion print_investment_analysis() wurde hinzugefügt, um umfassendere Ausgaben zu liefern.
  • Berechnet Gesamtinvestition, Erträge und Nettogewinn.
  • Interpretiert die IRR-Leistung mit beschreibenden Kategorien.
  • Bietet eine detaillierte Aufschlüsselung der Cashflows und Investitionskennzahlen.

Zusammenfassung

In diesem Labor haben wir zunächst gelernt, wie man Cashflows liest und speichert, um die interne Rendite (IRR) in einem C-Programm zu berechnen. Cashflows repräsentieren das investierte oder erhaltene Geld in verschiedenen Zeiträumen einer Investition. Anschließend haben wir die Verwendung von Iteration erforscht, um den Zinssatz zu finden, bei dem der Nettobarwert (NPV) ungefähr Null ist, was die IRR darstellt. Schließlich haben wir gelernt, wie man die geschätzte IRR ausgibt. Die wichtigsten Lernpunkte sind das Verständnis von Cashflow-Datenstrukturen, die Implementierung iterativer Algorithmen zur Ermittlung der IRR und die Präsentation des Endergebnisses.