【问题标题】:How can I calculate an interest rate in PHP?如何计算 PHP 的利率?
【发布时间】:2012-05-15 07:55:45
【问题描述】:

所以我到处搜索,但找不到合适的解决方案来解决我的问题。我需要用 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;
}

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

【问题讨论】:

  • 您是否尝试过自己编写函数?您要实施的公式是什么。尝试编写它,如果它不起作用,请在此处发布代码以便我们提供帮助。
  • 您是否尝试过使用我作为“修复”提供的 PHPExcel RATE() 函数的编辑版本来回答您链接到的问题?如果是这样,您能否向我提供导致其失败的数据集的详细信息。如果我不知道 RATE 函数有什么问题,我无法修复它,它适用于我用来测试它的数据集。
  • pastebin 中的代码是我自己编写的,遵循finance.thinkanddone.com/… 的说明,finance.thinkanddone.com/… 也发布在我链接的另一个 stackoverflow 主题中。是的,我试过你提供的编辑版本,马克。因此,数据集例如:nper = 6(以月为单位),pmt = 1000(以欧元为单位),pv = 100 000(以欧元为单位),fv = 126068(以欧元为单位),type = 0(默认情况下)。就我而言,这不是贷款而是投资......也许这就是它不起作用的原因?
  • 使用 MS Excel 和你的数字 =RATE(6,-1000,100000,-126068,0) 得到 4.847212728357280%(或 0.0484721272835728)的结果,我从修改后的 PHPExcel 中得到 0.048472127283573该函数的版本
  • 所以我必须添加负值?例如,是 MS Excel,我计算了投资的最终价值:pv = 100000,(年)利率 = 0.03,pmt = 1000,nper = 6(以月为单位)。我找到了 126068...所以我想当我尝试找到利率时应该找到 3%...

标签: php phpexcel financial rate


【解决方案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 三个变量中至少一个或最多两个为负数时才等于零

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

考虑到这一点,我认为 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 eni + PMT ei*type[eni-1]/[ei -1] + FV = 0

或同等的

FV e-ni + PMT ei*type[1-e-ni]/[ei sup>-1] + PV = 0

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

利率离散复利与连续复利不同。

【讨论】:

  • 嗨,Abe,您是否告诉日内瓦,税率是 3.03%?安倍,他好像在投资银行的储蓄账户?是的,迈克,我忽略了他投资的这方面。它看起来确实像是对银行账户的投资,初始存款后六次定期存款。所以安倍,告诉他他的实际利率是多少!好的,日内瓦,您的利率不是 3.03%,因为 Excel 的 RATE 函数假定利息是离散复利的,就像每期复利一样。对于您的示例投资,实际利率为 2.98%。这是因为大多数银行账户每 1 秒的时间都会赚取利息。
  • 是的,是为了投资银行。我没有得到你所有的解释,但我认为,利率的准确性对我来说并不那么重要。谢谢大家的回复,非常感谢! (实际上是“她”。^^)
  • 日内瓦!这不是我所指的精度。银行在储蓄账户上使用连续复利,而不是离散复利。在这种情况下,TVM 方程中的兴趣因素与我在回复中列出的因素不同。您可能想阅读本 IRR 教程的中间部分finance.thinkanddone.com/irr.html,以在利息连续复利时找到 2 个 TVM 方程。
  • 日内瓦!我修改了我的回复,以包含 2 个新的 TVM 方程,以应对利息连续复利的情况
  • 顺便说一句,与我的代码相比,您编写的代码更紧凑、更简洁。在您实现 RATE 函数时,您需要确保差异可能为零,从而导致除以零
【解决方案2】:

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

假设您的初始投资为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2023-04-09
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多