Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate IRR (Internal Rate Return) and NPV programmatically in Objective-C

I am developing a financial app and require IRR (in-built functionality of Excel) calculation and found such great tutorials in C here and such answer in C# here.

I implemented code of the C language above, but it gives a perfect result when IRR is in positive. It is not returning a negative value when it should be. Whereas in Excel =IRR(values,guessrate) returns negative IRR as well for some values.

I have referred to code in above C# link too, and it seems that it follows good procedures and returns errors and also hope that it returns negative IRR too, the same as Excel. But I am not familiar with C#, so I am not able to implement the same code in Objective-C or C.

I am writing C code from the above link which I have implemented for helping you guys.

#define LOW_RATE 0.01
#define HIGH_RATE 0.5
#define MAX_ITERATION 1000
#define PRECISION_REQ 0.00000001
double computeIRR(double cf[], int numOfFlows)
{
    int i = 0, j = 0;
    double m = 0.0;
    double old = 0.00;
    double new = 0.00;
    double oldguessRate = LOW_RATE;
    double newguessRate = LOW_RATE;
    double guessRate = LOW_RATE;
    double lowGuessRate = LOW_RATE;
    double highGuessRate = HIGH_RATE;
    double npv = 0.0;
    double denom = 0.0;
    for (i=0; i<MAX_ITERATION; i++)
    {
        npv = 0.00;
        for (j=0; j<numOfFlows; j++)
        {
            denom = pow((1 + guessRate),j);
            npv = npv + (cf[j]/denom);
        }

        /* Stop checking once the required precision is achieved */
        if ((npv > 0) && (npv < PRECISION_REQ))
            break;
        if (old == 0)
            old = npv;
        else
            old = new;
        new = npv;
        if (i > 0)
        {
            if (old < new)
            {
                if (old < 0 && new < 0)
                    highGuessRate = newguessRate;
                else
                    lowGuessRate = newguessRate;
            }
            else
            {
                if (old > 0 && new > 0)
                    lowGuessRate = newguessRate;
                else
                    highGuessRate = newguessRate;
                }
        }
        oldguessRate = guessRate;
        guessRate = (lowGuessRate + highGuessRate) / 2;
        newguessRate = guessRate;
    }
    return guessRate;
}

I have attached the result for some value which are different in Excel and the above C language code.

 Values:             Output of Excel: -33.5%
 1 = -18.5,          Output of C code: 0.010 or say (1.0%)
 2 =  -18.5,
 3 = -18.5,
 4 = -18.5,
 5 = -18.5,
 6 =  32.0

Guess rate: 0.1
like image 387
Rahul Patel Avatar asked Jul 20 '13 06:07

Rahul Patel


Video Answer


1 Answers

Since low_rate and high_rate are both positive, you're not able to get a negative score. You have to change:

#define LOW_RATE 0.01

to, for example,

#define LOW_RATE -0.5
like image 81
Qiu Avatar answered Oct 16 '22 13:10

Qiu