我无法计算内部 yield 。我使用Microsoft.VisualBasic来计算IRR。这是一个例子:

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,Double Guess))。
但是,如果我在Excel中进行计算,则不会显示任何错误。

最佳答案

您需要提供一个良好的Guess值作为此API的第二个参数。输入的默认值0.1失败。

试试这个:

double tmpIrr = Financial.IRR(ref tmpCashflows, 0.3);

然后您应该取回 IRR of -0.2987

看起来该API仅处理输入的特定情况,而在其他情况下由于任何猜测而失败。这是在此确认的Microsoft的IRR API错误。

如果Guess成为问题,则最好使用第三方可靠库来计算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 异​​常,是因为无法为默认的 Guess值0.1 计算IRR。注意,给定值满足一个负值(支付)和一个正值的条件。 (收据)

在内部,**Microsoft.VisualBasic.Financial.IRR**遍历输入值并尝试计算40次迭代中的IRR。它永远不会遇到有效IRR的破坏条件,因此最终会引发此错误。

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

同时,为类似的数组尝试IRR
tmpCashflows = new double[] { -100, 200, 300 };
double tmpIrr = Microsoft.VisualBasic.Financial.IRR(ref tmpCashflows);

得出内部 yield 为2.0或200%。 (通过代码和Excel)

10-08 12:45