如果现金流量的总现值和未来时间序列在 Python 中已知,如何找到贴现率值

How to find discount rate value if total present value and future time series of cash flows is known in Python

在进行 article 时,我遇到了以下多项式方程的情况。

供参考,下面是等式。

15446 = 537.06/(1+r) + 612.25/(1+r)**2 + 697.86/(1+r)**3 + 795.67/(1+r)**4 + 907.07/(1+r)**5

这是贴现现金流量时间序列值,我们在金融中使用它来了解应用适当贴现率后未来现金流量的现值。

所以根据上面的等式,我需要在 python 编程环境中计算变量 r?。我希望一定有一些库可以用来求解这样的方程式?

我解决了这个问题,我想用numpy.npv API.

import numpy as np
presentValue = 15446
futureValueList = [537.06, 612.25, 697.86,795.67, 907.07]
// I know it is not possible to get r from below. Just put
// it like this to describe my intention.
presentValue = np.npv(r, futureValueList)
print(r)

您可以将 NPV 公式乘以最高次幂或 (1+r),然后用 polyroots 求多项式的根(只取唯一的实根,忽略复数):

import numpy as np

presentValue = 15446
futureValueList = [537.06, 612.25, 697.86,795.67, 907.07]

roots = np.polynomial.polynomial.polyroots(futureValueList[::-1]+[-presentValue])
r = roots[np.argwhere(roots.imag==0)].real[0,0] - 1
print(r)
#-0.3332398877886278

事实证明,给出的公式不完整,请参见第 2 页。链接文章的 14。可以使用标准优化程序求解正确的方程式,例如optimize.root 提供一个合理的初始猜测:

from scipy import optimize

def fun(r):
    r1 = 1 + r
    return 537.06/r1 +  612.25/r1**2 + 697.86/r1**3 + 795.67/r1**4 + 907.07/r1**5 * (1 + 1.0676/(r-.0676)) - 15446

roots = optimize.root(fun, [.1])
print(roots.x if roots.success else roots.message)
#[0.11177762]