首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Php金融XIRR没有给出奇怪的结果

Php金融XIRR没有给出奇怪的结果
EN

Stack Overflow用户
提问于 2014-03-28 00:10:08
回答 3查看 1.5K关注 0票数 0

我正在使用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。代码如下:

代码语言:javascript
运行
复制
$f->XIRR(array(-400,18), array( 
    mktime(0,0,0,1,1,2014), 
    mktime(0,0,0,10,1,2014),
    ), 0.1);

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

EN

回答 3

Stack Overflow用户

发布于 2019-03-08 18:05:38

我已经从PHP Excel函数中编写了一个代码。我已经计算了XIRR和XNPV。下面是包含一些虚拟数据的代码示例。

的主要优点是,在此代码中不依赖于任何库。

代码语言:javascript
运行
复制
<?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; 
    }

 ?>
票数 1
EN

Stack Overflow用户

发布于 2014-03-28 09:25:31

正确的XIRR值是-98.417%,如下所示

代码语言:javascript
运行
复制
-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%
票数 0
EN

Stack Overflow用户

发布于 2014-07-20 15:44:04

使用美国的mm/dd/yyyy

代码语言:javascript
运行
复制
mktime(0,0,0,1,1,2014), 
mktime(0,0,0,1,10,2014)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22693191

复制
相关文章

相似问题

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