给定净现值(NPV)为零的方程,求解折现率Z
求解净现值方程中的折现率Z(内部收益率IRR)
嘿,这个方程本质上是在求内部收益率(Internal Rate of Return, IRR)——也就是让项目净现值(NPV)等于0的折现率Z。先明确下背景:
给定方程:$$ \sum_{t=0}^{N}\left ( \frac{B(t) -C(t)}{(1+Z)^t} \right )=0 $$
该方程出自Alston、Norton和Pardey的《稀缺条件下的科学:农业研究评估与优先级设定的原理与实践》,其中:
- $B(t)$ = t时刻的收益,$C(t)$ = t时刻的成本,两者的差值就是t时刻的净现金流
- t的范围0到N是研究覆盖的完整时间跨度
下面分情况说怎么求解Z:
1. 简单场景:低时间跨度(N≤4)
如果项目的时间跨度很小(比如最多4期),你可以把求和式展开成关于Z的多项式,然后用代数方法直接求解。举个例子,当N=1时:
$$ (B(0)-C(0)) + \frac{B(1)-C(1)}{1+Z} = 0 $$
化简后就能直接算出Z:
$$ Z = \frac{B(1)-C(1)}{C(0)-B(0)} - 1 $$
但要注意:当N≥5时,这会变成一个N次多项式——根据阿贝尔-鲁菲尼定理,这类方程没有通用的代数解析解,只能靠数值方法逼近。
2. 通用方案:数值解法
这是实际工作中最常用的方法,毕竟大多数项目的时间跨度都不小,现金流也可能不规则。推荐几种靠谱的方法:
- 牛顿-拉夫逊迭代法:收敛速度快,核心是通过不断迭代修正Z的估计值,公式如下:
$$ Z_{n+1} = Z_n - \frac{NPV(Z_n)}{NPV'(Z_n)} $$
其中$NPV'(Z)$是NPV对Z的导数:
$$ \sum_{t=0}^{N} \frac{-t(B(t)-C(t))}{(1+Z)^{t+1}} $$
注意要选一个合理的初始值(比如0或者当前市场利率),还要警惕现金流多次正负交替时可能出现的多重解。 - 二分法:如果能找到两个Z值(一个让NPV>0,一个让NPV<0),就可以不断缩小区间逼近真实解。这个方法比牛顿法更稳定,但收敛速度慢一些,适合对精度要求不高的场景。
- 试错法:手动或者用表格测试不同的Z值,直到NPV接近0——适合快速验证结果,或者没有工具辅助的简单场景。
3. 现成工具直接算
不用自己写代码的话,很多工具都内置了IRR计算功能:
- Excel/Google Sheets:用
IRR()函数,把净现金流序列(按时间顺序排列的$B(t)-C(t)$数组)传进去就行。 - Python:用
numpy.irr()或者scipy.optimize.root求解,示例代码:import numpy as np # 按t=0到t=N的顺序传入净现金流 cash_flows = [B0 - C0, B1 - C1, ..., BN - CN] z = np.irr(cash_flows) - R语言:可以用
irr包或者financetools中的相关函数来计算。
注意事项
- 如果现金流存在多次正负交替(比如先支出、再收入、再支出),可能会出现多重IRR,这时候要结合项目实际情况判断哪个解有经济意义。
- 如果所有净现金流都是同号的(比如只有初始支出,之后全是正收益),那么方程有且只有一个真实可行的解。
内容的提问来源于stack exchange,提问作者aldar123




