2

所以我到处搜索,但找不到合适的解决方案。我需要计算 PHP 的(年)利率。

PHPExcel 上的函数 RATE 不起作用(返回 NaN),我试图用 来编写另一个函数,当你有时给我投资利率:原始金额,最终金额,固定付款(一个月节省的金额)和投资期限(以月为单位)。

但它仍然不起作用。如果有帮助,这里是代码。

public function calculateRate($originalAmount, $finalAmount, $monthlySavings, $savingsPeriod) {
    define('FINANCIAL_MAX_ITERATIONS', 128);
    define('FINANCIAL_PRECISION', 1.0e-06);

    $rate = 0.05; // guess 
    $i = 0;

    do {
        $equ = $monthlySavings * (pow(1 + $rate, $savingsPeriod) - 1) / $rate + $originalAmount * pow(1 + $rate, $savingsPeriod) + $finalAmount;
        $derivative = ( $monthlySavings * ( $savingsPeriod * $rate * pow(1 + $rate, $savingsPeriod - 1 ) - pow(1 + $rate, $savingsPeriod) ) + 1 ) / ($rate * $rate) + $savingsPeriod * $originalAmount * pow(1 + $rate, $savingsPeriod - 1);
        $div = $equ / $derivative;
        $oldRate = $rate;
        $rate -= $div;
        ++$i;
        var_dump($i, $rate, $equ, $derivative, $div);
    } while (abs($div) > FINANCIAL_PRECISION && ($i < FINANCIAL_MAX_ITERATIONS));

    return $rate;
}

我需要一个可以计算利率的函数,但我找不到任何有用的东西......

4

2 回答 2

1

这是来自ThinkAndDone.com的亚伯拉罕,我注意到你从昨天开始已经多次访问我们。

您必须考虑用于通过 MS Excel 查找 RATE的基础TVM 方程。它有两个版本,如下所示

PV(1+i)^N + PMT(1+i*type)[{(1+i)^N}-1]/i + FV = 0

上面的第一个以利率 i 将现值和定期付款复合 n 个周期

FV(1+i)^-N + PMT(1+i*type)[1-{(1+i)^-N}]/i + PV = 0

上面的第二个以利率 i 贴现 n 期的未来价值和定期支付

这两个等式只有在 FV、PV 或 PMT 三个变量中的至少一个或最多两个为负时才会等于零

任何流出的现金流量是由负数反映的借方金额,任何流入的现金流量是由正数反映的贷方金额

考虑到这一点,我认为 PHPExcel RATE 函数也应该可以工作

ThinkAndDone.com 的 RATE 计算器使用 2 个 TVM 方程和Newton Raphson 方法中的任何一个为您的投资生成以下结果

PV = -100000
PMT = -1000
FV = 126068
NPER = 6
TYPE = 0
RATE = ?

Newton Raphson Method IRR Calculation with TVM equation = 0

TVM Eq. 1: PV(1+i)^N + PMT(1+i*type)[(1+i)^N -1]/i + FV = 0

f(i) = 126068 + -1000 * (1 + i * 0) [(1+i)^6 - 1)]/i + -100000 * (1+i)^6

f'(i) = (-1000 * ( 6 * i * (1 + i)^(5+0) - (1 + i)^6) + 1) / (i * i)) + 6 * -100000 * (1+0.1)^5

i0 = 0.1
f(i1) = -58803.71
f'(i1) = -985780.5
i1 = 0.1 - -58803.71/-985780.5 = 0.0403480693724
Error Bound = 0.0403480693724 - 0.1 = 0.059652 > 0.000001

i1 = 0.0403480693724
f(i2) = -7356.984
f'(i2) = -747902.9062
i2 = 0.0403480693724 - -7356.984/-747902.9062 = 0.0305112524399
Error Bound = 0.0305112524399 - 0.0403480693724 = 0.009837 > 0.000001

i2 = 0.0305112524399
f(i3) = -169.999
f'(i3) = -713555.4448
i3 = 0.0305112524399 - -169.999/-713555.4448 = 0.0302730102033
Error Bound = 0.0302730102033 - 0.0305112524399 = 0.000238 > 0.000001

i3 = 0.0302730102033
f(i4) = -0.0972
f'(i4) = -712739.5905
i4 = 0.0302730102033 - -0.0972/-712739.5905 = 0.0302728738276
Error Bound = 0.0302728738276 - 0.0302730102033 = 0 < 0.000001
IRR = 3.03%


Newton Raphson Method IRR Calculation with TVM equation = 0

TVM Eq. 2: PV + PMT(1+i*type)[1-{(1+i)^-N}]/i + FV(1+i)^-N = 0

f(i) = -100000 + -1000 * (1 + i * 0) [1 - (1+i)^-6)]/i + 126068 * (1+i)^-6

f'(i) = (--1000 * (1+i)^-6 * ((1+i)^6 - 6 * i - 1) /(i*i)) + (126068 * -6 * (1+i)^(-6-1))

i0 = 0.1
f(i1) = -33193.1613
f'(i1) = -378472.7347
i1 = 0.1 - -33193.1613/-378472.7347 = 0.0122970871033
Error Bound = 0.0122970871033 - 0.1 = 0.087703 > 0.000001

i1 = 0.0122970871033
f(i2) = 11403.9504
f'(i2) = -680214.7503
i2 = 0.0122970871033 - 11403.9504/-680214.7503 = 0.0290623077396
Error Bound = 0.0290623077396 - 0.0122970871033 = 0.016765 > 0.000001

i2 = 0.0290623077396
f(i3) = 724.4473
f'(i3) = -605831.2626
i3 = 0.0290623077396 - 724.4473/-605831.2626 = 0.0302580982453
Error Bound = 0.0302580982453 - 0.0290623077396 = 0.001196 > 0.000001

i3 = 0.0302580982453
f(i4) = 8.8061
f'(i4) = -600890.1339
i4 = 0.0302580982453 - 8.8061/-600890.1339 = 0.0302727533356
Error Bound = 0.0302727533356 - 0.0302580982453 = 1.5E-5 > 0.000001

i4 = 0.0302727533356
f(i5) = 0.0718
f'(i5) = -600829.8628
i5 = 0.0302727533356 - 0.0718/-600829.8628 = 0.0302728728509
Error Bound = 0.0302728728509 - 0.0302727533356 = 0 < 0.000001
IRR = 3.03%

我之前列出的两个 TVM 等式适用于离散复利的情况,例如按周期复利(每年、每季度、每月、每周、每天),因为大多数银行账户在利息连续复利时支付储蓄利息或收取贷款利息(无限复利)而不是离散复利

连续复利的 TVM 方程使用与离散复利版本不同的利息因子

这是利息连续复利时的 2 个 TVM 方程

PV e ni + PMT e i*type [e ni -1]/[e i -1] + FV = 0

或同等的

FV e -ni + PMT e i*type [1-e -ni ]/[e i -1] + PV = 0

这里 e 是数学常数,其值为 2.7182818284590452353602874713527

当利息是离散复利而不是连续复利时,利率会有所不同。

于 2012-05-15T09:32:22.313 回答
0

这不会给你最终的答案,但希望能给你指明正确的方向。我会尝试为它布置数学背景。

假设您的初始投资为A,您有N个周期,在此期间您以每周期x的利率投资固定金额B ,最终获得金额C。请注意,我说的是每个时期的费率。如果您每月投资并且您正在寻找年回报率X,那么x = X / 12。然后你可以把它变成这样的等式:

         N            N-1            N-2
A * (1+x)  + B * (1+x)    + B * (1+x)    + ... + B * (1+x) + B = C

使用几何级数公式,这可以简化为:

                           N-1
         N        1 - (1+x)
A * (1+x)  + B * ------------- = C
                   1 - (1+x)

继续基本代数,你可以把它变成

         N                N-1
A * (1+x)  * x + B * (1+x)   - C * x - B = 0

此时,您需要使用数值方法来求解这个方程 - 您可以在这里查看,例如:http ://en.wikibooks.org/wiki/Numerical_Methods/Equation_Solving

于 2012-05-15T08:37:36.883 回答