Fifty Shades of J/Chapter 49
Table of Contents ... Glossary ... Previous Chapter ... Next Chapter
Principal Topics
- IRR (Internal rate of return), income stream. NPV (net present value), APR (annualized percentage rate)
A common way of assessing the profitability or otherwise of an investment is through the rate of return. There are several ways in which ‘rate of return’ can be calculated, one of the most common being Internal Rate of Return (IRR). Computing IRRs for different income streams is a way of comparing different investment strategies, e.g. when a company makes choices about which of a variety of potential products to develop. Moreover IRR carries on increasing with length of input stream provided inflows are positive, and so it may make sense to abandon further product development when the IRR begins to tail off.
Growth
The phenomenon of 5% compound interest growth can be described equivalently by any one of four numbers namely 5, 0.05, 1.05 and (1.05)-1. These differences are expressible in J terms as :
p=.percentage rate (p>_100) r=.fractional rate so r=.0.01*p (r>_1) k=.multiplication factor so k=.>:r (k>0) d=.discount factor so d=.%k or %>:0.01*p (d>0)
All of these forms are equivalent ways of describing the same underlying phenomenon, so it is immaterial which value is quoted provided that the intend form is clear. Conversions between the various quantities are given by
ptod=.%@>:@(0.01&*) dtop=.100&*@<:@% ktop=.*&100@<: ptok=.>:@*&0.01
Negative growth, that is decay, is indicated by p<0, r<0, k<1 and d>1.
IRR
The significance of ‘internal’ is that the final worth of an income stream after discounting IRR is equal to zero. In other words ultimate worth is neither increased nor decreased so that IRR can be viewed as the continuous money decline which would need to occur to make the overall project do no more than break even in real terms. If the actual rate of money decline exceeds the IRR, then it would have been better not to have undertaken the project. IRRs should in general be used in a relative sense to compare alternatives, rather than as absolute measures - the higher the IRR of a project alternative, the more flexibility there is for its success compared with other proposals. For valid comparisons, project proposals should have approximately the same initial outlays and the same income stream lengths. If these conditions are not met further considerations concerning investment of surplus and realised funds need to be taken into account.
Computing IRRs
Obtaining values for IRRs means solving polynomial equations for which income streams provide the coefficients.
is=._100 20 50 70 80 NB. an income stream p.is ┌──┬────────────────────────────────────────────────────┐ │80│_1.21963 _0.20558j1.14621 _0.20558j_1.14621 0.755789│ └──┴────────────────────────────────────────────────────┘
A d value of 0.75579 is extracted and converted to p form by
dtop 0.75579 32.312
to obtain an IRR of 32.3%. In words IRR is calculated as ‘convert to p form the positive real root of the income stream regarded as polynomial coefficients’.
The final worth of the income stream can be obtained by using the d value as left input to the polynomial evaluator #. Notice that the coefficients in the argument for p. are in ascending power order, while those for are in descending order, so that the value of 0.75579 is confirmed by
0.75579 #.|.is 0.00046177 NB. effectively zero
It is always nice to have a simple case confirmed, so using the first example above
p. _100 0 0 200 ┌───┬─────────────────────────────────────────────┐ │200│0.793701 _0.39685j0.687365 _0.39685j_0.687365│ └───┴─────────────────────────────────────────────┘
from which 0.7937 leads to a compound interest growth of 26%
dtop 0.7937 25.99 1.26^3 2.00038
d values are obtained by opening the second box resulting from p. :
roots=.>@{:@p. NB. extract list of roots
and obtaining the single non-negative, non-complex value, the latter property being tested for by comparison with conjugates as provided by + applied to complex numbers. From tally it is one small step to #~ as shorthand for 'select', which leads to two further building blocks
real=.#~ (= +) NB. select real values pos=.#~ >&0 NB. select positive values
The process of obtaining the internal rate of return then consists of four steps in sequence :
irr=.dtop@pos@real@roots NB. internal rate of return for an is irr is 32.312
IRR calculations mirror those for fair loan repayment rates. The formula (rkn)/(kn-1) gives the fraction of an amount loaned which must be repaid in each of n periods when interest p% is paid on the declining balance. The words ‘declining balance’ reflect the fact that IRR calculations make an implicit assumption that the inflows are reinvested at the calculated compound interest rate, which can sometimes lead to a rosy-eyed picture of absolute IRR values. Using the input stream is as an illustration, if k = the IRR, the progress of each flow the residual capital value is
- -100k4 + 20k3 + 50k2 + 70k + 80.
which is evaluated as
(|.is) p.ptok irr is _5.684e_14
More generally the residual value of the stream following a given discount rate is defined by
resid=.dyad :'(|.y)p. ptok x' 0 resid is NB. equivalent to +/is 120 10 resid is NB. discounted by 10% 97.71
Define
Repay=.dyad : '(x*(1+x)^y)%_1+(1+x)^y' NB. Repayment Amounts
so that the consequent repayment amount for a loan of 10000 are given by
0.005 Repay 12 NB. factor for monthly rate of 0.5% 0.086066 10000*0.086066 NB. monthly repayments 860.66
A lender sees the transaction as an income stream of -10000 followed by 12 monthly payments of 860.66 whose IRR is therefore
irr _10000, 12#860.66 0.49992 NB. i.e. monthly rate of 0.5%
illustrating that IRR matches the fair rate of loan interest paid by equal installments on a declining balance. 'Thus irr and Repay are related by the equivalence :
- r -: irr _1,n#(r Repay n)
IRR is reduced if payments are deferred, whereas if a loan is paid off early using the same proportionate repayments, the IRR increases. These statements are confirmed by
irr _10000, (11#860.664),0,860.664 NB. last inflow delayed 0.49378 irr _10000,6#2*860.664 NB. inflow rate doubled 0.92988
The related term ized (Annual Percentage Rate) takes into account that the equivalent annual rate is not 12*0.005, corresponding to 6%, but rather this rate compounded over the 12 periods :
1.005^12 1.06168 NB. APR is 6.17%
To describe APR, use the conversions to and from p to k :
apr=.ktop@(ptok@irr ^ <:@#) apr _10000, 12#860.66 6.168
Note on computational practicalities
irr may fail if the income stream is too long, or if the data generates a pathological situation for p.'s underlying root solver. In such circumstances, alternative numerical methods must be employed such as the Newton Raphson method (see Numerical Problems analysed in J, which can be expressed in the adverb
Newton=.1 :']-x % x D.1'(^:_)("0)
Suppose that a loan of 1000 is repaid in 24 instalments of 45.27. The APR is worked out by
ms=.(24$45.27),_1000 NB. money stream reversed fn=.#.&ms NB. define a polynomial dtop fn Newton 0.9 NB. guess d=0.9 and apply N-R 0.67447 NB. monthly rate of return = 0.6745% 1.0067447^12 NB. convert to annual rate 1.084 NB. APR = 8.4%
Net Present Value and Sequential IRRs
After two periods the value of the IRR on the series is is
irr _100 20 50 _18.5857
The interpretation of this negative IRR is that the inflows must be inflated by (100-18.56)% = 0.814 to achieve the final overall zero outcome, that is
Sequential IRRs can be obtained by a verb
irrs=.;@:(irr every)@}.@(<\) NB. successive irr's irrs is _18.5857 15.6152 32.3121
When the IRR becomes positive in the third period the calculation becomes
+/_100 20 50 70%1.1561^i.4 0.010231
The concept of Net Present Value is that future values are discounted progressively by a given percentage. This is expressed in the verb
npv=.]*(ptod@[)^(i.@#@]) NB. net present value +/15.61 npv _100 20 50 70 0.010231
Assuming that the calculation is about money, and the periods are years, the combination of factors such as price inflation, deprciation, obsolsence, foregone returns on alternative investments, etc. are all bracketed under the heading ‘inflation’. A decision to proceed with investment should be based on whether inflation over the entire period of investment is expcted to be less than 32.3%. If future returns are promised as, say, interest payments at a rate of interest, say 10%, npv may be more appropriate than including this factor in IRR. The effect is naturally to reduce IRR :
irr 10 npv is 20.28 irr 25 npv is 5.85
Next consider an income stream such as
is1=._100 20 45 60 _10 55 70 20 10 10
where some items are negative, reflecting, for example, costs incurred in developing a second version of a software product. Since polynomials of even order must have an even number of positive roots, using p. means that spurious values of IRR will necessarily arise, as for example in
irr _100 20 45 60 _10 _85.04 6.67385
where the massive compound 85% decay is inadmissible. To deal with such circumstances it makes sense to insert a filter at the d level to exclude discount rates of greater than, say 3, or, at the other end of the scale, than 0.5, hence
filter=.#~ (<&3)*.(>&0.5) irr=.dtop@filter@:pos@real@roots irrs is1 0 _22.18 10.22 6.674 19.96 27.96 29.33 29.82 30.19
The initial value of -80 following the first inflow has been filtered to 0. Following the third inflow of 60 the IRR becomes positive at 10.2%, following which there is a dip to 6.67 due to the negative inflow of 10. Towards the end of the series subsequent increases in IRR tail off as a result of smaller inflows.
Now define another income stream is2 with the same values as is1 (total outflows = 110, total inflows =290), only in a different order with the higher values deferred :
is2=._100 20 45 60 _10 10 10 20 70 55 irrs is2 0 _22.18 10.22 6.674 9.919 12.37 15.81 22.4 25.22
which shows that the slower progress of the IRR.
Code Summary
ptod=: %@>:@(0.01&*) dtop=: 100&*@<:@% ktop=: *&100@<: ptok=: >:@*&0.01 irr=: dtop@filter@pos@real@roots NB. internal rate of return dtop=: 100&*@<:@% NB. discount factor to %age filter=: #~ (<&3)*.(>&0.5) pos=: #~ >&0 NB. select positive values real=: #~ (= +) NB. select real values roots=: >@{:@p. NB. extract list of roots irrs=: ;@:(irr every)@}.@(<\) NB. successive irr's resid=: dyad :'(|.y)p. ptok x' NB. residual value Repay=: dyad : '(x*(1+x)^y)%_1+(1+x)^y' NB. Repayment Amounts npv=: ]*(ptod@[)^(i.@#@]) NB. net present value apr=: ktop@(ptok@irr ^ <:@#) Newton=: 1 :']-x % x D.1'(^:_)("0)