如何使用JavaScript类xirr公式

您好,我已经find了一些Excel类function的JavaScript类,但我不知道如何使用它。 我需要使用XIRR函数,但我不知道参数和语法的types和格式。

这里是代码:

/* Based on * - EGM Mathematical Finance class by Enrique Garcia M. <egarcia@egm.co> * - A Guide to the PMT, FV, IPMT and PPMT Functions by Kevin (aka MWVisa1) */ var ExcelFormulas = { PVIF: function(rate, nper) { return Math.pow(1 + rate, nper); }, FVIFA: function(rate, nper) { return rate == 0? nper: (this.PVIF(rate, nper) - 1) / rate; }, PMT: function(rate, nper, pv, fv, type) { if (!fv) fv = 0; if (!type) type = 0; if (rate == 0) return -(pv + fv)/nper; var pvif = Math.pow(1 + rate, nper); var pmt = rate / (pvif - 1) * -(pv * pvif + fv); if (type == 1) { pmt /= (1 + rate); }; return pmt; }, IPMT: function(pv, pmt, rate, per) { var tmp = Math.pow(1 + rate, per); return 0 - (pv * tmp * rate + pmt * (tmp - 1)); }, PPMT: function(rate, per, nper, pv, fv, type) { if (per < 1 || (per >= nper + 1)) return null; var pmt = this.PMT(rate, nper, pv, fv, type); var ipmt = this.IPMT(pv, pmt, rate, per - 1); return pmt - ipmt; }, DaysBetween: function(date1, date2) { var oneDay = 24*60*60*1000; return Math.round(Math.abs((date1.getTime() - date2.getTime())/oneDay)); }, // Change Date and Flow to date and value fields you use XNPV: function(rate, values) { var xnpv = 0.0; var firstDate = new Date(values[0].Date); for (var key in values) { var tmp = values[key]; var value = tmp.Flow; var date = new Date(tmp.Date); xnpv += value / Math.pow(1 + rate, this.DaysBetween(firstDate, date)/365); }; return xnpv; }, XIRR: function(values, guess) { if (!guess) guess = 0.1; var x1 = 0.0; var x2 = guess; var f1 = this.XNPV(x1, values); var f2 = this.XNPV(x2, values); for (var i = 0; i < 100; i++) { if ((f1 * f2) < 0.0) break; if (Math.abs(f1) < Math.abs(f2)) { f1 = this.XNPV(x1 += 1.6 * (x1 - x2), values); } else { f2 = this.XNPV(x2 += 1.6 * (x2 - x1), values); } }; if ((f1 * f2) > 0.0) return null; var f = this.XNPV(x1, values); if (f < 0.0) { var rtb = x1; var dx = x2 - x1; } else { var rtb = x2; var dx = x1 - x2; }; for (var i = 0; i < 100; i++) { dx *= 0.5; var x_mid = rtb + dx; var f_mid = this.XNPV(x_mid, values); if (f_mid <= 0.0) rtb = x_mid; if ((Math.abs(f_mid) < 1.0e-6) || (Math.abs(dx) < 1.0e-6)) return x_mid; }; return null; } }; 

你想使用XIRR,让我们看看它的签名:

 XIRR: function(values, guess) 

它对values什么影响?

 var f1 = this.XNPV(x1, values); 

所以values必须是XNPV所期待的。 它的核心是:

 for (var key in values) { var tmp = values[key]; var value = tmp.Flow; var date = new Date(tmp.Date); xnpv += value / Math.pow(1 + rate, this.DaysBetween(firstDate, date)/365); }; 

所以values是一个字典(关联数组),其中键值对的值部分包含成员.Date.Date 。 我假设DaysBetween是现金stream量,并从DaysBetween方法我可以看到.Date是一个javascriptdate。 关键是被忽略,所以它可以是一个数字,如果我们想。 所以让我们来做一个这样的:

 var myInstrument = { 0: {Flow: 5, Date: new Date(2015, 7, 6)}, 1: {Flow: 105, Date: new Date(2016, 7, 6)} }; 

(这是一个字典(或数组)声明)。

XIRR的另一个input是guess ,它将用来解决某些问题,但如果给出一个错误的input值,它将默认使用0.1 (10%!)。 所以我们可以用我们的myInstrument来调用它:

 var myInternalReturn = XIRR(myInstrument, false); 

注意:XIRRfunction正在实施年度付款频率的实际/ 365固定日计数惯例,这可能不适合您正在估价的工具。 也许不会有太大的差别,但是对于半年或30/360,在月末date附近有特殊问题,简单的兴趣工具等等