首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Financial.IRR未在C#中计算

Financial.IRR未在C#中计算
EN

Stack Overflow用户
提问于 2014-04-04 08:36:31
回答 2查看 7.5K关注 0票数 6

我无法计算IRR。我是Microsoft.VisualBasic来计算IRR的。以下是一个案例:

代码语言:javascript
复制
using Microsoft.VisualBasic;

...

static void Main(string[] args)
        {
            double[] tmpCashflows = new double[] {
                -480117.0,
                4471.5158140594149,
                6841.5950239895265,
                6550.383550359461,
                6295.8611873818609,
                6074.6070899770129,
                5883.532880960287,
                6006.9907860976427,
                6133.1633945923877
                ,6262.1156759885489
                //,6393.9143799520116            
            };

            decimal irr = 0;
            try
            {
                double tmpIrr = Financial.IRR(ref tmpCashflows);                
                ...
            }
            catch (Exception ex)
            {
                irr = 0;
            }


        }

它给出了“参数无效”类型的例外(在Microsoft.VisualBasic.Financial.IRR(Double[]& ValueArray,双重猜测))。但是,如果我在Excel中进行计算,则不会显示任何错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-04 09:16:27

您需要提供一个很好的猜测值作为这个API的第二个参数。对于输入,默认值0.1失败。

试试这个:

代码语言:javascript
复制
double tmpIrr = Financial.IRR(ref tmpCashflows, 0.3);

你应该拿回一个IRR of -0.2987

它看起来像API只处理输入的特定情况,并且在其他情况下失败,无论猜测如何。这是微软承认的IRR。

如果猜测成为一个问题,最好使用第三方可靠库计算IRR。

http://connect.microsoft.com/VisualStudio/feedback/details/781299/microsoft-visualbasic-financial-irr-doesnt-solve-for-irr-correctly-in-certain-cases-with-any-guess

获得Argument is not valid异常的原因是无法计算默认猜测值0.1的IRR。请注意,给定的值满足一个负值(支付)和一个正值的条件。(收据)

在内部,**Microsoft.VisualBasic.Financial.IRR**遍历输入值并尝试计算超过40次迭代的IRR。它从未遇到有效IRR的破坏条件,因此最终抛出此错误。

请注意,Excel提供的值为-30%。

同时,为类似的数组尝试IRR

代码语言:javascript
复制
tmpCashflows = new double[] { -100, 200, 300 };
double tmpIrr = Microsoft.VisualBasic.Financial.IRR(ref tmpCashflows);

给出的IRR为2.0或200%。(通过代码和Excel)

票数 7
EN

Stack Overflow用户

发布于 2019-06-11 13:23:50

代码语言:javascript
复制
public static class Interpolation
{
    public static double IRR(this Dictionary<double, double> cashFlow)  //term in years, amount
    {
        int count = 0;
        double r1=0.1d, r2=0.05d, v1, v2, r = 0, v;
        v1 = cashFlow.DiscountedValue(r1);
        v2 = cashFlow.DiscountedValue(r2); 
        while (Math.Abs(v2 - v1) > .001 && count < 1000)
        {
            count++;
            r = (0 - v1) / (v1-v2) * (r1 - r2) + r1;
            v = cashFlow.DiscountedValue(r);
            v1 = v2;
            r1 = r2;
            v2 = v;
            r2 = r;
        }
        if (count == 1000) return -1;
        return r;
    }



    public static double DiscountedValue(this Dictionary<double, double> cashFlow, double rate)
    {
        double dv = 0d;
        for (int i = 0; i < cashFlow.Count; i++)
        {
            var element = cashFlow.ElementAt(i);
            dv += element.Value * Math.Pow(1 + rate, -(element.Key));
        }
        return dv;   
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22857597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档