基于Javascript的内部收益率计算
我有这段代码来计算IRR(内部收益率),它的工作原理与Excel中的IRR函数类似(我们有现金流值和猜测率) 这是工作良好,我有相同的结果作为Excel函数,但当内部收益率税大于100%,这个函数不工作。我得到的最大值是100% 要使值大于100,我需要更改什么基于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
// 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;
}