速率函数计算达到 future 值所需的速率。
nper - 周期数(周期数) pmt - 付款(每月或每年) pv - 现值(初始金额) fv - future 值(value)(达到的金额)
我使用了 Rate 函数(下面的 PHP 代码),但遇到了一些问题。我将它与以下值一起使用:
Excel - RATE(228;-196,02;-49005;961546,464646;1;0,05) gives: 0,0119
Php - RATE(228,-196.02,-49005,961546.464646,1,0.05) gives: 0.0022
Excel - RATE(228;-196,02;-49005;161546,464646;1;0,05) gives:0,003
Php - RATE(228,-196.02,-49005,161546.464646,1,0.05) gives:0.003
当 $nper
、$pv
、$pmt
和 $fv
之间的区别时,看起来像这样变大代码出错。
有人知道问题出在哪里吗?提前致谢。
define('FINANCIAL_MAX_ITERATIONS', 128);
define('FINANCIAL_PRECISION', 1.0e-08);
function rate($nper, $pmt, $pv, $fv, $type, $guess)
{
$rate = $guess;
if (abs($rate) < FINANCIAL_PRECISION) {
$y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
} else {
$f = exp($nper * log(1 + $rate));
$y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
}
$y0 = $pv + $pmt * $nper + $fv;
$y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
// find root by secant method
$i = $x0 = 0.0;
$x1 = $rate;
while ((abs($y0 - $y1) > FINANCIAL_PRECISION) && ($i < FINANCIAL_MAX_ITERATIONS)) {
$rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);
$x0 = $x1;
$x1 = $rate;
if (abs($rate) < FINANCIAL_PRECISION) {
$y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
} else {
$f = exp($nper * log(1 + $rate));
$y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
}
$y0 = $y1;
$y1 = $y;
++$i;
}
return $rate;
}
最佳答案
代码使用正割法求 yield ,我不确定为什么代码不能正常工作,但实现 Excel RATE 函数的更好方法是使用 Newton Raphson 方法
我会给你 Excel 用于 TVM 函数的方程,你可以通过从这个方程中得到函数 f(x) 来实现 Newton Raphson 方法
从那里您需要获得 f(x) 的导数,即 f'(x) 并按照本页关于 IRR 的说明进行操作.该页面描述了使用 Newton Raphson 方法查找 IRR,但您可以将文章中的函数 f(x) 和 f'(x) 替换为以下函数
f(x) = PV (1+RATE)^NPER + PMT(1+RATE*TYPE)[{(1+RATE)^NPER-1}/RATE] + FV
现在由您找到 f'(x) 并使用牛顿拉夫森法的步骤概述
此 Excel RATE calculator使用 Newton Raphson 方法在 PHP 中实现,因此您可以使用测试数据来查看是否获得所需的结果。请注意,此计算器遵循美国和英国的数字表示法,句点用于表示小数点,这与欧洲使用的逗号不同
https://stackoverflow.com/questions/7064753/