[Numpy-discussion] add xirr to numpy financial functions?
josef.pktd at gmail.com
josef.pktd at gmail.com
Mon May 25 20:55:04 EDT 2009
On Mon, May 25, 2009 at 7:27 PM, <josef.pktd at gmail.com> wrote:
>> The advantage of Skippers implementation using actual dates instead of
>> just an array of numbers is that it is possible to directly calculate
>> the annual irr, since the time units are well specified. The only
>> problem is the need for an equation solver in numpy. Just using a date
>> tuple would remove the problem of string parsing, and it might be
>> possible to extend it later to a date array.
>>
>> So, I think it would be possible to include Skippers solution, with
>> some cleanup and testing, if an equation solver can be found or if
>> np.roots can handle high order (sparse) polynomials.
>>
>
> I looked a bit more: the current implementation of ``rate`` uses it's
> own iterative (Newton) solver, and in a similar way this could be done
> for a more general xirr.
>
> So with a bit of work this doesn't seem to be a problem and the only
> question that remains is the specification of the dates.
Here is a solver using the polynomial class, or is there something
like this already in numpy
Josef
'''
Newton solver for value of a polynomial equal to zero
works also for negative rate of return
'''
import numpy as np
nper = 30 #Number of periods
freq = 5 #frequency of payment
val = np.zeros(nper)
val[1:nper+1:freq] = 1 # periodic payment
val[0]=-4 # initial investment
p = np.poly1d(val[::-1])
#print p.roots # very slow for array with 1000 periods
pd1 = np.polyder(p)
#print p(0.95) # net present value
#print pd1(0.95) # derivative of polynomial
rv = np.linspace(0.9,1.05,16)
for v,i in zip(rv, p(rv)):print v,i
for v,i in zip(rv, pd1(rv)):print v,i
# Newton iteration
r = 0.95 # starting value, find polynomial root in neighborhood
for i in range(10):
r = r - p(r)/pd1(r)
print r, p(r)
print 'interest rate irr is', 1/r - 1
More information about the NumPy-Discussion
mailing list