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

Python实现逐期不同折现率的NPV计算函数(不可使用numpy)

逐期不同折现率的NPV计算代码修正

原有代码存在的问题

  • 两层嵌套循环逻辑错误,会导致现金流和折现率重复匹配计算
  • result初始化放在循环内部,每次循环都会被重置为0,最终返回值仅等于最后一次循环的计算结果,没有实现累加
  • 内外层循环变量重名(都用了t和r),会导致外层变量被覆盖,逻辑完全混乱
  • 你给出的示例参数不符合你描述的规则:你明确说明r的长度为len(cash_flows)-1,但你给出的cash_flows长度为3,r长度为3,这属于参数错误,调整后符合规则的示例参数为cash_flows = [1000, 5000, 3000],r = [0.05, 0.08]

实现逻辑说明

不同期折现率的NPV计算规则为:

  • 第0期(当前)的现金流无需折现,直接计入最终结果
  • 第n期的现金流折现因子为前n个时段折现率对应的(1+rate)的累乘值
  • 逐期累计折现因子,匹配对应时段的现金流计算现值累加即可

正确实现代码

方案1:用zip绑定对应现金流和折现率(更直观)

def npv(cash_flows, r):
    # 先校验参数合法性
    if len(r) != len(cash_flows) - 1:
        raise ValueError("折现率列表r的长度必须等于现金流列表cash_flows的长度减1")
    # 初始值为第0期现金流,无需折现
    npv_result = cash_flows[0]
    # 累计折现因子,初始值为1
    discount_factor = 1
    # 遍历第1期及之后的现金流,和对应时段的折现率
    for cf, rate in zip(cash_flows[1:], r):
        discount_factor *= (1 + rate)
        npv_result += cf / discount_factor
    return npv_result

方案2:用enumerate遍历(解决你提到的enumerate使用疑问)

如果你想要用enumerate实现,可以直接遍历折现率列表,通过索引匹配对应的现金流即可:

def npv(cash_flows, r):
    if len(r) != len(cash_flows) - 1:
        raise ValueError("折现率列表r的长度必须等于现金流列表cash_flows的长度减1")
    npv_result = cash_flows[0]
    discount_factor = 1
    # 用enumerate获取折现率的索引,索引+1对应现金流的位置
    for idx, rate in enumerate(r):
        discount_factor *= (1 + rate)
        npv_result += cash_flows[idx+1] / discount_factor
    return npv_result

测试示例

cash_flows = [1000, 5000, 3000]
r = [0.05, 0.08]
print(npv(cash_flows, r))
# 输出结果约为 8407.42

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:06:00