基于Javascript的内部收益率计算

基于Javascript的内部收益率计算,javascript,finance,irr,Javascript,Finance,Irr,我有这段代码来计算IRR(内部收益率),它的工作原理与Excel中的IRR函数类似(我们有现金流值和猜测率) 这是工作良好,我有相同的结果作为Excel函数,但当内部收益率税大于100%,这个函数不工作。我得到的最大值是100% 要使值大于100,我需要更改什么 // Credits: algorithm inspired by Apache OpenOffice // Calculates the resulting amount var irrResult = functi

我有这段代码来计算IRR(内部收益率),它的工作原理与Excel中的IRR函数类似(我们有现金流值和猜测率)

这是工作良好,我有相同的结果作为Excel函数,但当内部收益率税大于100%,这个函数不工作。我得到的最大值是100%

要使值大于100,我需要更改什么

  // Credits: algorithm inspired by Apache OpenOffice
  
  // Calculates the resulting amount
  var irrResult = function(values, dates, rate) {
    var r = rate + 1;
    var result = values[0];
    for (var i = 1; i < values.length; i++) {
      result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);
    }
    return result;
  }

  // Calculates the first derivation
  var irrResultDeriv = function(values, dates, rate) {

    var r = rate + 1;
    var result = 0;
    for (var i = 1; i < values.length; i++) {
      var frac = (dates[i] - dates[0]) / 365;
      result -= frac * values[i] / Math.pow(r, frac + 1);
    }
    return result;
  }

  // Initialize dates and check that values contains at least one positive value and one negative value
  var dates = [];
  var positive = false;
  var negative = false;
  for (var 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;
  }
  
  // Return error if values does not contain at least one positive value and one negative value
  if (!positive || !negative) return 0;

  // Initialize guess and resultRate
  var guess = (typeof guess === 'undefined') ? 0.1 : guess;
  var resultRate = guess;
  
  // Set maximum epsilon for end of iteration
  var epsMax = 1e-10;
  
  // Set maximum number of iterations
  var iterMax = 200;

  // Implement Newton's method
  var newRate, epsRate, resultValue;
  var iteration = 0;
  var 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 0;

  // Return internal rate of return
  return resultRate;
}
//积分:受Apache OpenOffice启发的算法
//计算结果金额
var irrResult=函数(值、日期、速率){
var r=利率+1;
var结果=值[0];
对于(变量i=1;i0)正=真;
如果(值[i]<0)为负=真;
}
//如果值不包含至少一个正值和一个负值,则返回错误
如果(!正| |!负)返回0;
//初始化猜测和结果
var guess=(typeof guess==‘未定义’)?0.1:猜测;
var结果=猜测;
//设置迭代结束时的最大ε
var epsMax=1e-10;
//设置最大迭代次数
var iterMax=200;
//实现牛顿法
var newRate、epsRate、resultValue;
var迭代=0;
var contLoop=true;
做{
结果值=irrResult(值、日期、结果);
newRate=resultate-resultValue/irrResultDeriv(值、日期、resultate);
epsRate=Math.abs(newRate-resultate);
结果率=新率;
contLoop=(epsRate>epsMax)&(Math.abs(resultValue)>epsMax);
}而(contLoop&(++迭代
var irrResult=函数(值、日期、速率){
var r=利率+1;
var结果=值[0];
对于(变量i=1;i
我试过了,但没有成功。这一变化的结果是0%
    var irrResult = function(values, dates, rate) {
    var r = rate + 1;
    var result = values[0];
    for (var i = 1; i < values.length; i++) {
      result += values[i]/ Math.pow(r, (dates[i] - dates[0]) );
    }
    return result  / 365;
  }