如何计算PHP的利率?

时间:2012-05-15 07:55:46

标签: php phpexcel financial rate

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

PHPExcel上的函数RATE不起作用(returning NaN),我尝试使用this 当你有:原始金额,最终金额,不变支付(一个月节省的金额)和投资期限(以月为单位)时,写下另一个给我投资利率的功能。

但它仍然无效。这是代码,如果它可以帮助。

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;
}

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

2 个答案:

答案 0 :(得分:1)

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

您必须考虑MS Excel查找RATE时使用的基础TVM equation。它有两个版本,如下所示

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的三个变量中至少有一个或最多两个为负时,这两个方程只能保持真正的含义

任何外向现金流都是由负数反映的借方金额,任何收入的现金流都是由正数反映的贷方金额<​​/ p>

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

ThinkAndDone.com的RATE计算器使用Newton Raphson method

的2个TVM方程式为您的投资产生以下结果
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

当利息被分散地复合而不是连续复利时,利率会有所不同。

答案 1 :(得分:0)

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

假设您的初始投资为 A ,您有 N 期间,在此期间您按固定金额 B 按每期利率投资 x ,你得到的结尾数量 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

相关问题