R 中系统投资的利息计算代码

rns*_*nso 0 r

假设我在 60 (n) 个月内每月在银行存入 1000 (P) 美元,银行每月向我支付 1 (R)% 作为利息。因此,我可以计算每笔存款的利息:

P=1000
n=60
rate=1

P*(rate/100)*(n:1)
[1] 600 590 580 570 560 550 540 530 520 510 500 490 480 470 460 450 440 430 420 410 400 390 380 370 360 350 340 330 320 310 300
[32] 290 280 270 260 250 240 230 220 210 200 190 180 170 160 150 140 130 120 110 100  90  80  70  60  50  40  30  20  10
Run Code Online (Sandbox Code Playgroud)

和总利息 (totalInt) 为

totalInt = sum(P*(rate/100)*(n:1))
totalInt
[1] 18300
Run Code Online (Sandbox Code Playgroud)

如果我知道 P、n 和 totalInt,如何计算“比率”?我尝试了以下公式,但它产生了一系列没有意义的值:

rate = totalInt * 100 / (P*(n:1))
> rate
 [1]   30.50000   31.01695   31.55172   32.10526   32.67857   33.27273   33.88889   34.52830   35.19231   35.88235   36.60000
[12]   37.34694   38.12500   38.93617   39.78261   40.66667   41.59091   42.55814   43.57143   44.63415   45.75000   46.92308
[23]   48.15789   49.45946   50.83333   52.28571   53.82353   55.45455   57.18750   59.03226   61.00000   63.10345   65.35714
[34]   67.77778   70.38462   73.20000   76.25000   79.56522   83.18182   87.14286   91.50000   96.31579  101.66667  107.64706
[45]  114.37500  122.00000  130.71429  140.76923  152.50000  166.36364  183.00000  203.33333  228.75000  261.42857  305.00000
[56]  366.00000  457.50000  610.00000  915.00000 1830.00000
> 


mean(rate)
[1] 142.736
Run Code Online (Sandbox Code Playgroud)

平均值也太高,没有意义。

jlh*_*ard 5

您似乎是 R 的新手,所以这里有几种方法可以做到这一点。

如果这是另一种编程语言,您可以这样计算复利:

# approach using loops - very inefficient in R
totalInt  <- 0
prin      <- P
for (i in 1:n) {
  totalInt  <- totalInt + prin*rate/100
  prin <- prin * (1+rate/100)
}
totalInt
# [1] 816.6967
Run Code Online (Sandbox Code Playgroud)

由于 R 是一种矢量化语言,这是 R 中的首选方式。

# vectorized approach - very efficient in R
prin <- P * (1+rate/100)^(0:(n-1))
int  <- prin * rate/100
totalInt <- sum(int)
totalInt
# [1] 816.6967
Run Code Online (Sandbox Code Playgroud)

这段代码创建了一个向量,prin在每个时期的开始都有原则,然后是一个int包含该时期赚取的利息的向量。下面的方法是同一事物的更紧凑版本。

# vectorized approach simplified
P * sum((1+rate/100)^(0:(n-1))*rate/100)
# [1] 816.6967
Run Code Online (Sandbox Code Playgroud)

因此,要进行相反的操作,例如计算给定 P、n 和 totalInt 的比率,我们使用uniroot(...)应用于函数 的函数f(...),如下所示。阅读 上的文档uniroot(...)

f <- function(rate,P,n,totalInt) {
  totalInt - P * sum((1+rate/100)^(0:(n-1))*rate/100)
}

result <- uniroot(f,P=1000,n=60,totalInt=816.7, lower=0, upper=100)$root
result
# [1] 1.000003
Run Code Online (Sandbox Code Playgroud)