首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中循环的向量化:债券的现金流

R中循环的向量化:债券的现金流
EN

Stack Overflow用户
提问于 2017-12-21 16:05:40
回答 1查看 116关注 0票数 0

我需要计算摊销(债务偿还)价值,以美元为债券,摊销的方式不规则。例如,我创建了以下摊销方案:

  • 第1期:未摊销
  • 第二期:摊销10%的债务
  • 第三期:摊销剩余债务的30%
  • 第4期:摊销剩余债务的100%

下面是适合上述例子的计算代码,考虑到1000美元的债务,使用for -循环。

代码语言:javascript
复制
# 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

由于这些计算将我做了很多次,我觉得有必要让这段代码尽快运行。

有没有办法让这些计算以矢量化的方式进行?

这里的棘手之处在于,对于任何给定的时期,我都需要知道初始余额,以便计算$中的摊销。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 16:32:48

你的问题是,你的摊销时间表是相对于上一个时期。你需要找到一个有效的或绝对摊销相对于前期余额。

例如,第二个阶段的摊销是剩余余额的10%,这仍然是初始余额的100%。第三个时期是剩余余额的30%,即90% (扣除10%后),因此第一个余额的绝对摊销为90%×30%=27%。第四阶段也是如此。这可以以编程方式/逐字完成,如下所示:

代码语言:javascript
复制
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

由此,您可以轻松地计算任意期间,只知道初始余额,而不需要前一期间的余额。

代码语言:javascript
复制
# 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

其他意见:

代码语言:javascript
复制
# 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    0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47928641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档