【问题标题】:How to use Javascript class for xirr formula如何将 Javascript 类用于 xirr 公式
【发布时间】:2014-01-31 12:32:34
【问题描述】:

您好,我找到了一些 excel 函数的 javascript 类,但我不知道如何使用它。我需要使用 XIRR 函数,但我不知道参数的类型和格式以及语法。

代码如下:

/* 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;
    }

};

【问题讨论】:

标签: javascript excel math xirr


【解决方案1】:

你想使用 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 是一个字典(关联数组),其中键值对的值部分有成员.Flow.Date。我假设.Flow 是现金流,从DaysBetween 方法我可以看到.Date 是一个javascript 日期。该键被忽略,因此如果我们愿意,它可以是一个数字。所以让我们做一个:

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

(即字典(或数组)声明)。

XIRR 的另一个输入是guess,它将用来解决问题,但如果给定一个虚假的输入值,它将默认使用0.1(10% !)。所以我们可以用我们的myInstrument 来调用它:

var myInternalReturn = XIRR(myInstrument, false);

注意:XIRR 函数正在执行年度付款频率的实际/365 固定天数约定,这可能不适合您正在评估的工具。也许它不会有太大区别,但对于半年或 30/360 来说会是不正确的,尤其是在月末日期、单利工具等方面存在问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多