我需要计算摊销(债务偿还)价值,以美元为债券,摊销的方式不规则。例如,我创建了以下摊销方案:
下面是适合上述例子的计算代码,考虑到1000美元的债务,使用for -循环。
# Vector with amortization values (in % of outstanding balance)
prc_amortization = c(0, 10, 30, 100)
# Value for initial balance
initial_balance = 1000
# Dataframe
df = data.frame(initial_balance = c(initial_balance, rep(NA, 3)),
prc_amortization = prc_amortization,
amortization = NA,
final_balance = NA)
# Calculation of amortization values in $, leading to updated balances
for (i in 1:4) {
df$amortization[i] = df$initial_balance[i]*df$prc_amortization[i]/100
df$final_balance[i] = df$initial_balance[i] - df$amortization[i]
if (i<4) {df$initial_balance[i+1] = df$final_balance[i]}
}
# Results
df
initial_balance prc_amortization amortization final_balance
1 1000 0 0 1000
2 1000 10 100 900
3 900 30 270 630
4 630 100 630 0由于这些计算将我做了很多次,我觉得有必要让这段代码尽快运行。
有没有办法让这些计算以矢量化的方式进行?
这里的棘手之处在于,对于任何给定的时期,我都需要知道初始余额,以便计算$中的摊销。
谢谢你的帮助!
发布于 2017-12-21 16:32:48
你的问题是,你的摊销时间表是相对于上一个时期。你需要找到一个有效的或绝对摊销相对于前期余额。
例如,第二个阶段的摊销是剩余余额的10%,这仍然是初始余额的100%。第三个时期是剩余余额的30%,即90% (扣除10%后),因此第一个余额的绝对摊销为90%×30%=27%。第四阶段也是如此。这可以以编程方式/逐字完成,如下所示:
effective_prc_amortization <- numeric(length(prc_amortization))
for (i in seq_along(effective_prc_amortization)) {
prevsum <- if (i == 1) 1 else 1 - sum(effective_prc_amortization[1:(i-1)])
effective_prc_amortization[i] <- prevsum * prc_amortization[i]/100
}
effective_prc_amortization
# [1] 0.00 0.10 0.27 0.63由此,您可以轻松地计算任意期间,只知道初始余额,而不需要前一期间的余额。
# amortization
effective_prc_amortization * initial_balance
# [1] 0 100 270 630
# final_balance
initial_balance - cumsum(effective_prc_amortization * initial_balance)
# [1] 1000 900 630 0其他意见:
# percentage remaining
cumprod(1 - c(0,10,30,100)/100)
# [1] 1.00 0.90 0.63 0.00
# value remaining
1000 * cumprod(1 - c(0,10,30,100)/100)
# [1] 1000 900 630 0https://stackoverflow.com/questions/47928641
复制相似问题