代码之家  ›  专栏  ›  技术社区  ›  Mantosh Kumar

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

  •  0
  • Mantosh Kumar  · 技术社区  · 5 年前

    在经历 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
    

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

    从上面的方程,我需要计算变量 r 在python编程环境中?。我真的希望一定有一些库可以用来解这些方程?。

    我解决了这个问题,我想用 numpy.npv 应用程序编程接口。

    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)
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   Stef    5 年前

    你可以将你的净现值公式乘以最高的幂或 (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
    

    由于给出的公式不完整,请参见链接文章的第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]