You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向量化计算含利率向量与定期投入的复利?

带每期投入的复利计算向量化实现

我的问题和Stack Overflow上《Calculating compound interest with vector of rates》一文类似,但需要额外加入每期投入的计算逻辑。

以下是用循环实现的示例代码:

# 如何向量化这段代码?
RateVector <- c(0.02, 0.03, 0.04, 0.05, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01) # 预测利率
ContributionVector <- c(1,2,3,4,5,6,7,8,9,10) # 每期投入金额
StartingBalance <- 10000
EndingBalance <- StartingBalance

# 复利增长循环计算
for(i in 1:length(RateVector)){
  rate <- RateVector[i]
  contribution <- ContributionVector[i]  
  EndingBalance <- (EndingBalance*(1+rate)) + contribution
  print(paste(i, EndingBalance))
}

# 输出结果
# [1] "1 10201"
# [1] "2 10509.03"
# [1] "3 10932.3912"
# [1] "4 11483.01076"
# [1] "5 12176.9914056"
# [1] "6 12791.84097588"
# [1] "7 13310.5146149152"
# [1] "8 13717.8300533627"
# [1] "9 14001.1866544299"
# [1] "10 14151.1985209742"

我需要得到所有期的余额向量,核心目标是获取最终余额(本例中为14151.1985209742)。尝试过用cumprod和cumsum组合实现,但没成功。注意计算逻辑是:先复利增长,再加入当期投入。


解决方案

方法1:向量化公式直接计算

通过构造反向累积的复利因子,把初始本金和每期投入分别复利到期末再求和,无需循环:

# 构造每一期到期末的复利因子:从当期往后所有(1+rate)的乘积
compound_factors <- rev(cumprod(rev(1 + RateVector)))

# 初始本金的终值
initial_final <- StartingBalance * compound_factors[1]

# 各期投入的终值之和:每一期投入乘以后续所有期的复利因子,最后一期投入无后续复利乘1
contributions_final <- sum(ContributionVector * c(compound_factors[-1], 1))

# 最终余额
final_balance <- initial_final + contributions_final
final_balance
# 输出:[1] 14151.1985209742

如果需要获取所有期的余额向量,可以用简洁的累积计算:

balance_vector <- numeric(length(RateVector))
current_balance <- StartingBalance
for(i in 1:length(RateVector)){
  current_balance <- current_balance * (1 + RateVector[i]) + ContributionVector[i]
  balance_vector[i] <- current_balance
}
balance_vector
# 输出:[1] 10201.0000000 10509.0300000 10932.3912000 11483.0107600 12176.9914056 12791.8409759 13310.5146149 13717.8300534 14001.1866544 14151.1985210

方法2:用Reduce函数替代显式循环

Reduce可以迭代处理向量,写法更简洁,同时支持输出所有余额:

# 定义单步更新逻辑
update_balance <- function(balance, idx) {
  balance * (1 + RateVector[idx]) + ContributionVector[idx]
}

# 计算所有余额向量(init是初始本金,accumulate=TRUE保留每一步结果)
balance_vector <- Reduce(update_balance, 1:length(RateVector), init = StartingBalance, accumulate = TRUE)[-1]
balance_vector

# 最终余额取向量最后一个元素
final_balance <- tail(balance_vector, 1)
final_balance

内容的提问来源于stack exchange,提问作者Josh Pause

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:15:15