tt_IRR function

dynamic tt_IRR(
  1. List values
)

tt_IRR(values, guess): internal rate of return (Newton-Raphson iteration)

Implementation

dynamic tt_IRR(List<dynamic> values) {
  final n = values.length;
  if (n < 2) return 0.0;
  var rate = varToDouble(values.last); // guess
  final cashFlows = values.sublist(0, n - 1).map(varToDouble).toList();
  for (var iter = 0; iter < 100; iter++) {
    double npv = 0, dnpv = 0;
    for (var i = 0; i < cashFlows.length; i++) {
      final v = cashFlows[i];
      npv += v / pow(1 + rate, i);
      if (i > 0) dnpv -= i * v / pow(1 + rate, i + 1);
    }
    if (dnpv.abs() < 1e-10) break;
    rate -= npv / dnpv;
    if (npv.abs() < 1e-8) break;
  }
  return rate;
}