Posted By: Anonymous
While going through an article, I encountered a situation where I encountered below polynomial equation.
For reference, below is the equation.
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
This is discount cash flow time series values which we use in finance to get the idea of present value of future cash flows after applying the appropriate discount rate.
So from above equation, I need to calculate the variable
r in python programming environment?. I do hope that there must be some library which can be used to solve such equations?.
I solve this, I thought to use the 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)
You can multiply your NPV formula with the highest power or
(1+r) and then find the roots of the polynomial with
polyroots (just take the only real root and disregard the complex ones):
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
As it turns out the formula given is incomplete, see p. 14 of the linked article. The correct equation can be solved with standard optimization procedures, e.g.
optimize.root providing a sensible initial guess:
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]