我正在尝试在excel中复制IRR (内部收益率)函数。我在riaforge.com中找到了一个cfc,但它返回的值与excel的irr不同。
牛顿-拉普森方法使用导数,我不确定如何在coldfusion中计算导数。
year cash flow
---- --------
0 -4000
1 1200
2 1410
3 1875
4 1050 应该返回14.3% (来自维基百科的例子)
以前有人这么做过吗?谢谢
发布于 2011-08-19 21:23:45
<cffunction name="calcIRR">
<cfargument name="arrCashFlow" type="Array" required="true" hint="array of cashflow">
<cfscript>
var guess = 0.1;
var inc = 0.00001;
do {
guess += inc;
npv = 0; //net present value
for (var i=1; i<=arrayLen(arguments.arrCashFlow); i++) {
npv += arguments.arrCashFlow[i] / ((1 + guess) ^ i);
}
} while ( npv > 0 );
guess = guess * 100;
</cfscript>
<cfreturn guess>
</cffunction>
<cfscript>
cFlow = arrayNew(1);
cFlow[1] = -4000;
cFlow[2] = 1200;
cFlow[3] = 1410;
cFlow[4] = 1875;
cFlow[5] = 1050;
c = calcIRR(cFlow);
</cfscript>
<cfdump var="#cFlow#">
<cfdump var="#c#">发布于 2011-08-20 00:48:15
延伸到Jason所说的,你需要实现一个高效工作的代码,而不是依赖Falconeyes建议的蛮力算法。我第一次编写IRR作为服务器端脚本时,它使用暴力,一天后,我的web主机打电话给我,说他们要让我的网站离线,因为代码消耗了100%的系统资源
下面是使用Newton Raphson方法的一步一步的IRR calculation,您可以遵循它并在冷融合中实现这些思想
f(x) = -4000(1+i)^0 +1200(1+i)^-1 +1410(1+i)^-2 +1875(1+i)^-3 +1050(1+i)^-4
f'(x) = -1200(1+i)^-2 -2820(1+i)^-3 -5625(1+i)^-4 -4200(1+i)^-5
x0 = 0.1
f(x0) = 382.0777
f'(x0) = -9560.2616
x1 = 0.1 - 382.0777/-9560.2616 = 0.139965195884
Error Bound = 0.139965195884 - 0.1 = 0.039965 > 0.000001
x1 = 0.139965195884
f(x1) = 25.1269
f'(x1) = -8339.5497
x2 = 0.139965195884 - 25.1269/-8339.5497 = 0.142978177747
Error Bound = 0.142978177747 - 0.139965195884 = 0.003013 > 0.000001
x2 = 0.142978177747
f(x2) = 0.126
f'(x2) = -8256.0861
x3 = 0.142978177747 - 0.126/-8256.0861 = 0.142993440675
Error Bound = 0.142993440675 - 0.142978177747 = 1.5E-5 > 0.000001
x3 = 0.142993440675
f(x3) = 0
f'(x3) = -8255.6661
x4 = 0.142993440675 - 0/-8255.6661 = 0.142993441061
Error Bound = 0.142993441061 - 0.142993440675 = 0 < 0.000001
IRR = x4 = 0.142993441061 or 14.3%发布于 2011-08-19 03:34:36
我不知道ColdFusion是什么,但是找到IRR的想法很简单。
IRR是一个数字r,使得
sum i = 0 to N C_i * (1 + r)^(-t_i) = 0有N + 1现金流的地方,有时是C_0, C_1, ..., C_N。定义
f(r) = sum i = 0 to N C_i * (1 + r)^(-t_i).然后
f'(r) = sum i = 0 to N -C_i * (1 + r)^(-t_i - 1).选择初始猜测r_0并迭代通过
r_{n + 1} = r_n - f(r_n) / f'(r_n)在您的特定示例中,您有
t_0 = 0 C_0 = -4000
t_1 = 1 C_1 = 1200
t_2 = 2 C_2 = 1410
t_3 = 3 C_3 = 1875
t_4 = 4 C_4 = 1050试着猜测一下r_0 = 0.1。
再说一次,我不知道ColdFusion是什么,但它必须是一种编程语言,所以它应该允许计算基本的数学。
https://stackoverflow.com/questions/7112919
复制相似问题