Taxa Interna de Retorno (TIR) Aproximada em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderemos a aproximar a Taxa Interna de Retorno (TIR) usando um programa em C. Começaremos lendo os fluxos de caixa, que representam o dinheiro investido ou recebido em diferentes períodos de tempo de um investimento. Em seguida, usaremos uma abordagem iterativa para encontrar a taxa em que o Valor Presente Líquido (VPL) é aproximadamente zero, o que nos dá a TIR estimada. Finalmente, imprimiremos a TIR calculada. O laboratório abrange conceitos-chave de matemática financeira e demonstra sua implementação na programação em C.

Leitura de Fluxos de Caixa

Neste passo, aprenderemos a ler e armazenar fluxos de caixa para calcular a Taxa Interna de Retorno (TIR) em um programa em C. Os fluxos de caixa representam o dinheiro investido ou recebido em diferentes períodos de tempo de um investimento.

Primeiro, vamos criar um arquivo C para implementar a funcionalidade de leitura de fluxos de caixa:

cd ~/project
nano irr_calculation.c

Agora, vamos escrever o código inicial para ler os fluxos de caixa:

#include <stdio.h>
#define MAX_FLUXOS_CAIXA 10

int main() {
    double fluxos_caixa[MAX_FLUXOS_CAIXA];
    int num_fluxos_caixa;

    printf("Digite o número de fluxos de caixa (máximo %d): ", MAX_FLUXOS_CAIXA);
    scanf("%d", &num_fluxos_caixa);

    printf("Digite os fluxos de caixa (negativo para investimentos, positivo para retornos):\n");
    for (int i = 0; i < num_fluxos_caixa; i++) {
        printf("Fluxo de caixa %d: ", i);
        scanf("%lf", &fluxos_caixa[i]);
    }

    // Imprimir os fluxos de caixa inseridos para verificação
    printf("\nFluxos de Caixa Digitados:\n");
    for (int i = 0; i < num_fluxos_caixa; i++) {
        printf("Fluxo de caixa %d: %.2f\n", i, fluxos_caixa[i]);
    }

    return 0;
}

Compile e execute o programa:

gcc irr_calculation.c -o irr_calculation
./irr_calculation

Exemplo de saída:

Digite o número de fluxos de caixa (máximo 10): 4
Digite os fluxos de caixa (negativo para investimentos, positivo para retornos):
Fluxo de caixa 0: -1000
Fluxo de caixa 1: 300
Fluxo de caixa 2: 400
Fluxo de caixa 3: 500

Fluxos de Caixa Digitados:
Fluxo de caixa 0: -1000.00
Fluxo de caixa 1: 300.00
Fluxo de caixa 2: 400.00
Fluxo de caixa 3: 500.00
Explicação
  • Definimos um número máximo de fluxos de caixa (MAX_FLUXOS_CAIXA) para evitar uso excessivo de memória.
  • O programa primeiro solicita ao usuário a entrada do número de fluxos de caixa.
  • Em seguida, solicita ao usuário que digite cada valor do fluxo de caixa.
  • Valores negativos representam investimentos iniciais.
  • Valores positivos representam retornos ou receitas.
  • O programa imprime os fluxos de caixa inseridos para verificação.

Usando Iteração para Encontrar a Taxa Onde o VPL ≈ 0

Neste passo, estenderemos nosso programa anterior de fluxo de caixa para calcular a Taxa Interna de Retorno (TIR) usando um método numérico iterativo.

Primeiro, vamos modificar nosso arquivo C existente:

cd ~/project
nano irr_calculation.c

Agora, implemente a lógica de cálculo do VPL e da TIR:

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

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

double find_irr(double cash_flows[], int num_cash_flows) {
    double taxa_baixa = -0.9;
    double taxa_alta = 10.0;
    double taxa = 0.1;

    while ((taxa_alta - taxa_baixa) > EPSILON) {
        double vpl = calculate_npv(cash_flows, num_cash_flows, taxa);

        if (fabs(vpl) < EPSILON) {
            return taxa;
        }

        if (vpl > 0) {
            taxa_baixa = taxa;
        } else {
            taxa_alta = taxa;
        }

        taxa = (taxa_baixa + taxa_alta) / 2.0;
    }

    return taxa;
}

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

    printf("Digite o número de fluxos de caixa (máximo %d): ", MAX_FLUXOS_CAIXA);
    scanf("%d", &num_cash_flows);

    printf("Digite os fluxos de caixa (negativo para investimentos, positivo para retornos):\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Fluxo de caixa %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

    double tir = find_irr(cash_flows, num_cash_flows);
    printf("\nTaxa Interna de Retorno (TIR) Aproximada: %.4f ou %.2f%%\n", tir, tir * 100);

    return 0;
}

Compile o programa com a biblioteca matemática:

gcc irr_calculation.c -o irr_calculation -lm

Execute o programa com fluxos de caixa de exemplo:

./irr_calculation

Exemplo de saída:

Digite o número de fluxos de caixa (máximo 10): 4
Digite os fluxos de caixa (negativo para investimentos, positivo para retornos):
Fluxo de caixa 0: -1000
Fluxo de caixa 1: 300
Fluxo de caixa 2: 400
Fluxo de caixa 3: 500

Taxa Interna de Retorno (TIR) Aproximada: 0.2154 ou 21.54%
Explicação
  • calculate_npv() calcula o Valor Presente Líquido (VPL) para uma taxa de juros dada.
  • find_irr() usa o método da bissecção para encontrar a taxa onde o VPL ≈ 0.
  • Usamos EPSILON para definir a precisão de convergência.
  • O algoritmo reduz iterativamente o intervalo da TIR.
  • A TIR final é calculada e exibida como decimal e porcentagem.

Imprimir TIR Estimada

Neste passo final, aprimoraremos nosso programa de cálculo de TIR para fornecer uma saída mais detalhada e demonstrar diferentes cenários de investimento.

Vamos modificar nosso arquivo C existente para adicionar uma análise de TIR mais abrangente:

cd ~/project
nano irr_calculation.c

Atualize o código com saída e análise adicionais:

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

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

double find_irr(double cash_flows[], int num_cash_flows) {
    double taxa_baixa = -0.9;
    double taxa_alta = 10.0;
    double taxa = 0.1;

    while ((taxa_alta - taxa_baixa) > EPSILON) {
        double vpl = calculate_npv(cash_flows, num_cash_flows, taxa);

        if (fabs(vpl) < EPSILON) {
            return taxa;
        }

        if (vpl > 0) {
            taxa_baixa = taxa;
        } else {
            taxa_alta = taxa;
        }

        taxa = (taxa_baixa + taxa_alta) / 2.0;
    }

    return taxa;
}

void print_investment_analysis(double cash_flows[], int num_cash_flows, double tir) {
    double investimento_total = 0;
    double retorno_total = 0;

    printf("\n--- Análise de Investimento ---\n");

    // Detalhes dos fluxos de caixa
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Período %d: $%.2f\n", i, cash_flows[i]);

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

    // Resumo do investimento
    printf("\nInvestimento Total: $%.2f\n", investimento_total);
    printf("Retornos Totais: $%.2f\n", retorno_total);
    printf("Lucro Líquido: $%.2f\n", retorno_total - investimento_total);

    // Detalhes da TIR
    printf("\nTaxa Interna de Retorno (TIR):\n");
    printf("Decimal: %.4f\n", tir);
    printf("Porcentagem: %.2f%%\n", tir * 100);

    // Interpretação do desempenho do investimento
    if (tir > 0.15) {
        printf("\nDesempenho do Investimento: Excelente\n");
    } else if (tir > 0.10) {
        printf("\nDesempenho do Investimento: Bom\n");
    } else if (tir > 0) {
        printf("\nDesempenho do Investimento: Moderado\n");
    } else {
        printf("\nDesempenho do Investimento: Ruim\n");
    }
}

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

    printf("Digite o número de fluxos de caixa (máximo %d): ", MAX_FLUXOS_CAIXA);
    scanf("%d", &num_cash_flows);

    printf("Digite os fluxos de caixa (negativo para investimentos, positivo para retornos):\n");
    for (int i = 0; i < num_cash_flows; i++) {
        printf("Fluxo de caixa %d: ", i);
        scanf("%lf", &cash_flows[i]);
    }

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

    return 0;
}

Compile o programa:

gcc irr_calculation.c -o irr_calculation -lm

Execute o programa com o cenário de investimento de exemplo:

./irr_calculation

Exemplo de saída:

Digite o número de fluxos de caixa (máximo 10): 4
Digite os fluxos de caixa (negativo para investimentos, positivo para retornos):
Fluxo de caixa 0: -1000
Fluxo de caixa 1: 300
Fluxo de caixa 2: 400
Fluxo de caixa 3: 500

--- Análise de Investimento ---
Período 0: $-1000.00
Período 1: $300.00
Período 2: $400.00
Período 3: $500.00

Investimento Total: $1000.00
Retornos Totais: $1200.00
Lucro Líquido: $200.00

Taxa Interna de Retorno (TIR):
Decimal: 0.2154
Porcentagem: 21.54%

Desempenho do Investimento: Excelente
Explicação
  • Função print_investment_analysis() adicionada para fornecer saída abrangente.
  • Calcula o investimento total, retornos e lucro líquido.
  • Interpreta o desempenho da TIR com categorias descritivas.
  • Fornece uma quebra detalhada dos fluxos de caixa e métricas de investimento.

Resumo

Neste laboratório, aprendemos inicialmente como ler e armazenar fluxos de caixa para calcular a Taxa Interna de Retorno (TIR) em um programa C. Os fluxos de caixa representam o dinheiro investido ou recebido em diferentes períodos de tempo de um investimento. Em seguida, exploramos o uso de iteração para encontrar a taxa em que o Valor Presente Líquido (VPL) é aproximadamente zero, que é a TIR. Finalmente, aprendemos a imprimir a TIR estimada. Os principais pontos de aprendizado são a compreensão das estruturas de dados de fluxo de caixa, a implementação de algoritmos iterativos para encontrar a TIR e a apresentação do resultado final.