On Mon, May 25, 2009 at 7:27 PM, <josef.pktd@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