如何向量化计算含利率向量与定期投入的复利?
带每期投入的复利计算向量化实现
我的问题和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
相关产品推荐
相关产品推荐

