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
相关产品推荐
相关产品推荐

