首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP修改后的Dietz返回函数返回不正确的结果

PHP修改后的Dietz返回函数返回不正确的结果
EN

Stack Overflow用户
提问于 2013-05-29 17:07:55
回答 1查看 145关注 0票数 0

我编写了自己的modified dietz return函数来计算具有外部现金变动的投资组合的回报。与excel解决方案相比,它似乎工作正常,但我遇到了一个结果错误的情况。当正确的结果是0.30%时,我的函数返回0.23%。

下面是函数:

代码语言:javascript
复制
//Calculates the Modified-Dietz return given arrays of MIMO.
//MIMO is an associative array of dates to values
function modDietz($startDate, $endDate, $BMV, $EMV, $MIMO){
    if( strtotime($startDate) !== false ){
    //Date was passed as a string; convert it to php date
    $startDate = strtotime($startDate);
    }
    if( strtotime($endDate) !== false ){
    //Date was passed as a string; convert it to php date
    $endDate = strtotime($endDate);
    }

    //Convert seconds to days
    $CD = ($startDate - $endDate)/(60*60*24); 

    $i = 0;
    $SumWiFi = 0;
    $F = 0;
    foreach ($MIMO as $date=>$Fi){
        if( strtotime($date) !== false ){
          //Date was passed as a string; convert it to php date
          $date = strtotime($date);
        }
        //Only take into account the MIMO if it falls between the start and end dates.
        if ($date >= $startDate && $date <= $endDate){
            $Di = ($date - $startDate) / (60*60*24);
            $Wi = ($CD - $Di) / $CD;
            $SumWiFi += $Wi * $Fi;
            $F += $Fi;
        }
    }
    if ($BMV + $SumWiFi != 0) {
        return ($EMV - $BMV - $F)/($BMV + $SumWiFi);
    } else {
        return 0;
    }
}

下面是我提供给它的数据,它给出了错误的结果:

代码语言:javascript
复制
Dates:
Array
(
    [0] => 2013-04-30
    [1] => 2013-03-31
)

Values:
Array
(
    [2013-03-31] => 4990430.0
    [2013-04-30] => 5991710.1
)

MIMO:
Array
(
    [2013-04-19] => -600.0
    [2013-04-23] => 1000000.0
    [2013-04-29] => -13750
)

这是生成结果的代码行:

代码语言:javascript
复制
$mdReturn = modDietz($dates[1], $dates[0], $values[$dates[1]], $values[$dates[0]], $mimo);

我有一种感觉,29号的钱可能是原因-我不太确定在这个函数中处理日期的最佳方式。目前,我只对作为yyyy-mm-dd格式传递的字符串使用string-to-date,如上面的数组所示。

你知道我哪里错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-29 17:58:31

我认为Mark Baker是对的,试试这个:

代码语言:javascript
复制
function modDietz(DateTime $startDate, DateTime $endDate, $BMV, $EMV, $MIMO){
    $CD = $startDate->diff($endDate);
    $SumWiFi = 0;
    $F = 0;
    foreach ($MIMO as $date=>$Fi){
        $date = new DateTime($date);
        //Only take into account the MIMO if it falls between the start and end dates.
        if ($date >= $startDate && $date <= $endDate){
            $Di = $date->diff($startDate);
            $Wi = ($CD->d - $Di->d) / $CD->d;
            $SumWiFi += $Wi * $Fi;
            $F += $Fi;
        }
    }
    if ($BMV + $SumWiFi != 0) {
        return ($EMV - $BMV - $F)/($BMV + $SumWiFi);
    } else {
        return 0;
    }
}
$mimo = array(
    '2013-04-19' => -600.0,
    '2013-04-23' => 1000000.0,
    '2013-04-29' => -13750,
);
$startDate = new DateTime('2013-03-31');
$endDate = new DateTime('2013-04-30');
$result = modDietz($startDate, $endDate, 4990430.0, 5991710.1, $mimo);
// 0.0029925034725645
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16809785

复制
相关文章

相似问题

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