如果现金流量的总现值和未来时间序列在 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]
在进行 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]