在SQL中计算每月付款的利率



在SQL(Oracle(中,有没有一种方法可以在知道贷款金额、月供和期限的情况下计算利率?在知道利率的情况下,我可以很容易地计算付款,但相反的方法似乎要困难得多。

月供计算(利率=0.1(10%(,贷款规模=1000,期限=24(:

select (0.1/12 * 1000) / (1 - power(1 + 0.1/12, -24)) as mpayment 
from dual;
46.1449263375165

问题是如何从46.14美元的月供、1000美元的贷款规模、24个月的期限开始,并计算10%的利率。

例如,在MS Excel中,要使用的函数为RATE()

正如我在你的帖子下面的评论中所说:你想要的是所谓的"内部回报率"。事实上,你正在寻找一种非常特殊的情况——分期偿还的贷款,定期等额还款。Oracle在附加包中提供IRR功能;如果只想使用基本SQL和PL/SQL,则必须使用UDF(用户定义函数(。

这里有一种编码方法,使用牛顿方法。我同时演示了一些东西。请注意数字数据类型(它是PL/SQL特有的,不能在普通SQL中使用;但是,运行时会透明地将输入从NUMBER转换为PL/SQL数据类型,并将返回值转换回NUMBER(。在代码中使用这些数据类型可以使函数更快,尤其是如果您使用本机编译(如我在下面的第一行代码中所示(。

到目前为止,一切都应该在PL/SQL的旧版本中工作。由于只有12.1版本,并且只有当您主要从SQL调用函数时,才可以使用pragma udf声明,这将加快调用该函数的普通SQL代码的速度。

该函数返回"年化"抵押贷款利率(它计算月利率,然后简单地乘以12,没有复利,因为这就是抵押贷款利率的工作方式,至少在美国是这样(。利率以十进制数字返回,而不是乘以100;也就是说,不是百分比。如果函数返回的利率为0.038,则意味着3.8%(年度抵押贷款利率(。在最后的简短演示中,我将介绍如何将函数调用封装在其他SQL代码中,以美化答案。

最后的例子是,我取了20万本金,以6.5%的利率计算了30年(360个月(的月供;我每月得到1264.14英镑的付款。然后我根据其他值计算利率。

该函数需要本金金额和月供,两者都不是NULL,并且假定为正数。术语(以月为单位(也是需要的,但我将默认值编码为360。(也许最好不为此编写默认代码,并使其成为必需。(您可以选择输入所需的精度;我默认编码了一个非常高的精度,因为无论如何计算都非常快。

我没有编写任何类型的错误处理代码;显然,如果您选择将此功能(或类似功能(用于培训/学习之外的任何目的,则必须这样做。

alter session set plsql_code_type = native;
create or replace function mortgage_rate(
p_principal       simple_double
, p_monthly_payment simple_double
, p_term            simple_integer default 360
, p_precision       simple_double  default 0.00000001
)
return number
as 
pragma udf;     --  Comment out this line if Oracle version is < 12.1
z     simple_double  := p_monthly_payment/p_principal; 
u     simple_double  := 1 / (p_term * z);
v     simple_double  := 0;
delta simple_double  := 0;
begin
for i in 1 .. 100 loop
v     := power(u, p_term);
delta := ( z * u * ( v - 1) - u + 1 ) / ( z * (p_term + 1) * v - z - 1 );
u     := u - delta;
exit when abs(delta) < p_precision;
end loop;
return 12 * (1/u - 1);
end;
/

select to_char( 100 * mortgage_rate(200000, 1264.14, 360), 'fm990.000')
|| '%' as interest_rate
from   dual; 

INTEREST_RATE
----------------
6.500%

最新更新