R语言月度折现率与现值计算的逻辑及代码正确性验证
月度差异化利率下的现值计算代码逻辑验证
原代码存在的问题
- 变量名不一致:初始代码中定义了
interest向量,但后续计算却使用未定义的i,会直接触发报错。 - 向量长度不匹配:初始代码里
interest仅9个元素,而cash_flows有12个元素,直接相乘会触发R的向量循环机制,导致计算结果完全错误。 - 折现因子逻辑错误:差异化月度利率下,不能用
(1+i)^-(1:length(i)-1)计算折现因子——该公式仅适用于固定利率场景。对于每期利率不同的情况,折现因子需要是各期复利因子的累计乘积的倒数。
正确的折现逻辑
假设你的数据定义规则为:
- 利率向量
i的首元素i[1] = 0代表基准期(t=0),i[2]到i[n]依次对应t=1到t=n-1期的月度利率; - 现金流向量
cash_flows的第k个元素对应t=k-1期的现金流(即cash_flows[1]是基准期的现金流,无需折现;cash_flows[2]是t=1期的现金流,需用t=1期的利率折现,以此类推)。
正确的折现因子计算步骤:
- 提取t=1及以后的各期实际利率;
- 计算每期的复利因子(
1 + 当期利率); - 计算累计复利乘积(即从基准期到目标期的总复利倍数);
- 折现因子为累计复利乘积的倒数(基准期折现因子为1)。
修正后的R代码
# 定义利率向量(首元素0为基准期,共12个元素对应t0-t11期) i <- c(0,.0448,.0448,.0452,.0428,.0428,.0428,.0452,.0451,.0475,.0475,.04997) # 定义现金流向量(12个元素对应t0-t11期的现金流) cash_flows <- c(44273.81, 44176.68, 66849.14, 123792.30, 101141.25, 190894.12, 82724.14, 257075.63, 176920.29, 482068.00, 429030.01, 348291.50) # 计算折现因子向量 period_rates <- i[-1] # 提取t1-t11期的利率 compound_factors <- 1 + period_rates # 每期复利因子 cumulative_compound <- cumprod(compound_factors) # 累计复利乘积 discount_vector <- c(1, 1/cumulative_compound) # 构造折现因子(首元素为1) # 计算各期现金流的现值并求和得到总现值 present_values <- discount_vector * cash_flows total_pv <- sum(present_values) # 输出结果 print(total_pv)
验证说明
- 修正后的代码保证了利率向量与现金流向量长度完全匹配;
- 折现因子的计算符合差异化利率下的复利折现规则,每一期的现金流都用对应路径的累计利率进行折现;
- 最终求和得到的
total_pv即为所有现金流折现至基准期(首个期间)的总现值。
内容的提问来源于stack exchange,提问作者azinsera
相关产品推荐
相关产品推荐

