【问题标题】:Php financial XIRR not giving strange resultsPHP金融XIRR没有给出奇怪的结果
【发布时间】:2014-03-27 16:10:07
【问题描述】:

我正在使用 php 金融库 (http://www.phpclasses.org/package/892-PHP-Financial-functions-with-the-Excel-function-names-.html) 中的 XIRR 函数,但这些值得到了奇怪的结果(日期为 d/m/y):

(01/01/2014, -400) , (01/10/2014, 18)

MS Excel 正确返回 0.98,而 XIRR 函数返回 -1.5714653207915E+40。代码如下:

$f->XIRR(array(-400,18), array( 
    mktime(0,0,0,1,1,2014), 
    mktime(0,0,0,10,1,2014),
    ), 0.1);

谁能解释我做错了什么?提前感谢您的帮助。

【问题讨论】:

  • 我发现错误是由于迭代中使用的索引获得的无限值造成的。有什么建议吗?
  • HI ...我面临同样的问题...任何解决方案?

标签: php excel financial xirr


【解决方案1】:

我从 PHP Excel 函数中编写了一段代码。 我计算了 XIRR 和 XNPV。 这是带有一些虚拟数据的代码示例。

主要优点是,不依赖任何库 代码。

<?php

$rate = 0.12;
$values = array(-5000,-3000,-8000,25000,-4000);
$dates = array('01-02-2015','05-05-2016','02-03-2018','03-03-2019','05-03-2019');


/** FINANCIAL_MAX_ITERATIONS */
define('FINANCIAL_MAX_ITERATIONS', 128);

/** FINANCIAL_PRECISION */
define('FINANCIAL_PRECISION', 1.0e-08);

$result = XIRR($values,$dates,0.1);
print_r($result);


 function XIRR($values, $dates, $guess = 0.1) { 
        $x1 = 0.0;
        $x2 = $guess;
        $f1 = XNPV($x1, $values, $dates);  
        $f2 = XNPV($x2, $values, $dates); 
        for ($i = 0; $i < 128; ++$i) {
            if (($f1 * $f2) < 0.0) break;
            if (abs($f1) < abs($f2)) {
                $f1 = XNPV($x1 += 1.6 * ($x1 - $x2), $values, $dates);
            } else {
                $f2 = XNPV($x2 += 1.6 * ($x2 - $x1), $values, $dates);
            }
        } 

        $f = XNPV($x1, $values, $dates);
        if ($f < 0.0) {
            $rtb = $x1;
            $dx = $x2 - $x1;
        } else {
            $rtb = $x2;
            $dx = $x1 - $x2;
        }

        for ($i = 0;  $i < FINANCIAL_MAX_ITERATIONS; ++$i) {
            $dx *= 0.5;
            $x_mid = $rtb + $dx;
            $f_mid = XNPV($x_mid, $values, $dates);
            if ($f_mid <= 0.0) $rtb = $x_mid;

            if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) return $x_mid;
        } 

    }



      function XNPV($rate, $values, $dates) {

        $valCount = count($values);  
        $xnpv = 0.0;
        for ($i = 0; $i < $valCount; ++$i) 
        { 

            $datediff = strtotime($dates[$i]) - strtotime($dates[0]);
            $datediff =  round($datediff / (60 * 60 * 24));  
            $xnpv += $values[$i] / pow(1 + $rate,$datediff / 365); 
        } 
        return $xnpv; 
    }

 ?>

【讨论】:

    【解决方案2】:

    正确的XIRR值是-98.417%如下图

    -400 + 18(1+i)^-(273/365) = 0
    18(1+i)^-(273/365) = 400
    (1+i)^-(273/365) = 400/18
    (1+i)^(273/365) = 18/400
    (1+i) = (18/400)^(365/273)
    1+i = (0.045)^(1.336996337)
    i = (0.045)^(1.336996337) - 1
    i = -0.984174769
    i = -98.417%
    

    【讨论】:

    • 是的,但我的问题是财务 XIRR 函数返回 -1.5714653207915E+40 而不是 0.98417
    【解决方案3】:

    使用美国人mm/dd/yyyy

    mktime(0,0,0,1,1,2014), 
    mktime(0,0,0,1,10,2014)
    

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2013-08-20
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多