Skip to content

Instantly share code, notes, and snippets.

@bagaskarawg
Created June 18, 2020 03:00
Show Gist options
  • Save bagaskarawg/66c45f52df12bd692db6892408578c8b to your computer and use it in GitHub Desktop.
Save bagaskarawg/66c45f52df12bd692db6892408578c8b to your computer and use it in GitHub Desktop.
IRR(values, guess) {
let irrResult = function(values, dates, rate) {
let r = rate + 1;
let result = values[0];
for (let i = 1; i < values.length; i++) {
result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);
}
return result;
};
let irrResultDeriv = function(values, dates, rate) {
let r = rate + 1;
let result = 0;
for (let i = 1; i < values.length; i++) {
let frac = (dates[i] - dates[0]) / 365;
result -= (frac * values[i]) / Math.pow(r, frac + 1);
}
return result;
};
let dates = [];
let positive = false;
let negative = false;
for (let i = 0; i < values.length; i++) {
dates[i] = i === 0 ? 0 : dates[i - 1] + 365;
if (values[i] > 0) positive = true;
if (values[i] < 0) negative = true;
}
if (!positive || !negative) return "#NUM!";
guess = typeof guess === "undefined" ? 0.1 : guess;
let resultRate = guess;
let epsMax = 1e-10;
let iterMax = 10;
let newRate, epsRate, resultValue;
let iteration = 0;
let contLoop = true;
do {
resultValue = irrResult(values, dates, resultRate);
newRate =
resultRate - resultValue / irrResultDeriv(values, dates, resultRate);
epsRate = Math.abs(newRate - resultRate);
resultRate = newRate;
contLoop = epsRate > epsMax && Math.abs(resultValue) > epsMax;
} while (contLoop && ++iteration < iterMax);
if (contLoop) return "#NUM!";
return resultRate;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment