2017-04-07 73 views
0

我试图使用包FinCal中的discount.rate函数来计算回报率,但它似乎对我无效。无法获得discount.rate函数来计算回报率

discount.rate(n=360,pv=-100000,fv=0,pmt=500,type=0) 

n=360意味着有360个支付(换句话说,30年的贷款)

pv=现值(这意味着银行给借款人$ 100,000购买住房)

pmt =月付款

fv =未来价值(设为0,因为银行最初给予100,000美元,但30年后除了每月抵押付款人TS)

type = 0表示支付在每个周期

我得到以下错误的端部制成:

*Error in uniroot(function(r) fv.simple(r, n, pv) + fv.annuity(r, n, pmt, : 
f.upper = f(upper) is NA* 

我用于在SAS类似的金融函数相同的值和它工作得很好。谢谢你的帮助。

根据一位用户的建议,我在Excel中试过,它也可以正常工作。在SAS和Excel中可以正常工作,但不能在R.

+0

请在您的代码前添加四个空格。 – student

+0

您确定'FV = 0'甚至有可能是因为FV和PV关系,并且实际上哪家银行会提供贷款并且只满足于利息支付而不期望期末本金回报。在excel = = RATE(360,500,-100000,0,0)'和这[计算I/Y](http://www.calculator.net/finance-calculator.html?ctype=returnrate&ctargetamountv=0&cyearsv=360&cartartingprinciplev = 100000&cinterestratev = 6&ccontributeamountv = 500&ciadditionat1 = end&printit = 0&x = 84&y = 10) – OdeToMyFiddle

+0

我试过在Excel中,它对我有用。我得到.365559%。我乘以12得到年率,得到4.39%。每期500美元的付款包括利息和本金。 –

回答

0

FinCal软件包不允许您指定复合/折扣频率(本例中为每年12个)作为discount.rate()函数的参数,并且此操作似乎是造成问题。如果转换PMT为每年(6000 = 12 * 500),并设定N = 30的功能为您提供了4.31%,这是说年率:

discount.rate(n=30, pv= -100000, fv=0, pmt=6000, type=0) 

然后,您使用耳(R,M)从相同的封装,其中m = 12且r = 0.04306572函数来获得的4.39%实际年率(EAR):

ear(0.04306572,12) 

希望这有助于。

0

这是由uniroot造成的。 discount.rate()中的默认时间间隔是(1e-10,1e10),当我将其更改为(1e-4,1)时,我得到了0.003683461。

discount.rate(n=360,pv=-100000,fv=0,pmt=500,type=0,lower=0.0001, upper = 1)

[1] 0.003683461

我添加了两个新参数 '下' 和 '上' 到discount.rate(),所以你现在可以尝试不同的时间间隔。您需要重新安装FinCal软件包。

库(注明 “DevTools”)
install_github( “felixfan/FinCal”)#从GitHub,现在

install.packages( “FinCal”,依赖= TRUE)从CRAN#,几天后

+0

谢谢@felixfan。为什么较大的区间(1e-10,1e10)会导致错误,但较小的区间(1e-4,1)不会? –

+0

函数uniroot搜索从低到高的时间间隔的根。我猜想当间隔很大时,任何两个尝试过的根之间的差别很大,函数不会收敛。增加“tol”或“maxiter”可能适用于较大的时间间隔,但答案可能不准确,或者可能需要较长时间才能搜索正确的答案。请参阅https://www.rdocumentation.org/packages/stats/versions/3.3.3/topics/uniroot – felixfan