001 package com.croftsoft.core.math;
002
003 import java.io.*;
004
005 /*********************************************************************
006 * Financial calculations.
007 *
008 * @version
009 * 2001-10-10
010 * @since
011 * 1999-08-15
012 * @author
013 * <a href="http://croftsoft.com/">David Wallace Croft</a>
014 *********************************************************************/
015
016 public final class FinanceLib
017 //////////////////////////////////////////////////////////////////////
018 //////////////////////////////////////////////////////////////////////
019 {
020
021 public static final void testRetire (
022 double desiredSavingsInterestIncome,
023 double savingsInterestRate,
024 double inflationRate,
025 double taxRate,
026 double investmentInterestRate,
027 double yearsOfSaving )
028 //////////////////////////////////////////////////////////////////////
029 {
030
031 // desiredSavingsInterestIncome
032 // = savings
033 // * ( savingsInterestRate * ( 1.0 - taxRate ) - inflationRate )
034 // / ( 1.0 + inflationRate );
035
036 double savings
037 = desiredSavingsInterestIncome * ( 1.0 + inflationRate )
038 / ( savingsInterestRate * ( 1.0 - taxRate ) - inflationRate );
039
040 double futureValueSavings
041 = savings * Math.pow ( 1.0 + inflationRate, yearsOfSaving );
042
043 double annualSavings = annualSavingsNeeded (
044 futureValueSavings, investmentInterestRate, yearsOfSaving );
045
046 System.out.println ( savings );
047 System.out.println ( futureValueSavings );
048 System.out.println ( annualSavings );
049 System.out.println ( futureValueAnnuity (
050 annualSavings, investmentInterestRate, yearsOfSaving ) );
051 System.out.println ( presentValueAnnuity (
052 annualSavings, investmentInterestRate, yearsOfSaving ) );
053 }
054
055 /*********************************************************************
056 * Test method. Prints the future value of an annuity followed by
057 * the present value calculated three different ways.
058 *
059 * @param c Annual cash income starting one year from today.
060 * @param r Annual interest earned on income.
061 * @param t Number of years of cash income.
062 *********************************************************************/
063 public static final void testAnnuity (
064 double C,
065 double r,
066 double T )
067 //////////////////////////////////////////////////////////////////////
068 {
069 double FV = futureValueAnnuity ( C, r, T );
070 System.out.println ( FV );
071 System.out.println ( presentValue ( FV, r, T ) );
072 System.out.println ( presentValueAnnuity ( C, r, T ) );
073 double [ ] c = new double [ ( int ) T ];
074 for ( int i = 0; i < T; i++ ) c [ i ] = C;
075 System.out.println ( presentValue ( c, r ) );
076 }
077
078 //////////////////////////////////////////////////////////////////////
079 //////////////////////////////////////////////////////////////////////
080
081 /*********************************************************************
082 * The future value of a cash flow received today.
083 *
084 * @param c Cash flow today.
085 * @param r Inflation rate.
086 * @param t Number of years from today when the value is evaluated.
087 *********************************************************************/
088 public static final double futureValue (
089 double c,
090 double r,
091 double t )
092 //////////////////////////////////////////////////////////////////////
093 {
094 return c * Math.pow ( 1.0 + r, t );
095 }
096
097 /*********************************************************************
098 * Calculates the future value of an annuity.
099 *
100 * @param c Annual cash income starting one year from today.
101 * @param r Annual interest earned on income.
102 * @param t Number of years of cash income.
103 *********************************************************************/
104 public static final double futureValueAnnuity (
105 double c,
106 double r,
107 double t )
108 //////////////////////////////////////////////////////////////////////
109 {
110 return c * ( ( Math.pow ( 1.0 + r, t ) - 1.0 ) / r );
111 }
112
113 /*********************************************************************
114 * The calculated discount rate where the net present value is 0.
115 *
116 * @param irrEstimate
117 *
118 * The initial estimated value for the IRR (e.g., 0.10 for 10%).
119 *
120 * @param cashFlows
121 *
122 * Array of cash flows received in the future, indexed from time = 0.
123 *********************************************************************/
124 public static final double internalRateOfReturn (
125 double irrEstimate,
126 double [ ] cashFlows )
127 //////////////////////////////////////////////////////////////////////
128 {
129 double irr = irrEstimate;
130
131 double delta = -irr * 0.1;
132
133 double oldNpv = 0.0;
134
135 while ( true )
136 {
137 double npv = netPresentValue ( irr, cashFlows );
138
139 if ( npv == 0.0 )
140 {
141 return irr;
142 }
143
144 if ( oldNpv < 0.0 )
145 {
146 if ( npv > 0.0 )
147 {
148 delta *= -0.9;
149 }
150 else if ( npv > oldNpv )
151 {
152 delta *= 1.1;
153 }
154 else if ( npv < oldNpv )
155 {
156 delta = -delta;
157 }
158 else
159 {
160 delta = 0.0;
161 }
162 }
163 else if ( oldNpv > 0.0 )
164 {
165 if ( npv < 0.0 )
166 {
167 delta *= -0.9;
168 }
169 else if ( npv < oldNpv )
170 {
171 delta *= 1.1;
172 }
173 else if ( npv > oldNpv )
174 {
175 delta = -delta;
176 }
177 else
178 {
179 delta = 0.0;
180 }
181 }
182
183 /*
184 System.out.println ( "irr = " + irr + ", oldNpv = " + oldNpv + ", npv = " + npv + ", delta = " + delta );
185
186 try{
187 new BufferedReader ( new InputStreamReader ( System.in ) ).readLine ( );
188 }catch (Exception x ) { }
189 */
190
191 if ( delta == 0.0 )
192 {
193 return irr;
194 }
195
196 irr += delta;
197
198 oldNpv = npv;
199 }
200 }
201
202 /*********************************************************************
203 * The discounted value of multiple cash flows received in the future.
204 *
205 * @param discountRate
206 *
207 * The discount rate or cost of capital (e.g., 0.10 for 10%).
208 *
209 * @param cashFlows
210 *
211 * Array of cash flows received in the future, indexed from time = 0.
212 *********************************************************************/
213 public static final double netPresentValue (
214 double discountRate,
215 double [ ] cashFlows )
216 //////////////////////////////////////////////////////////////////////
217 {
218 double npv = 0.0;
219
220 for ( int i = 0; i < cashFlows.length; i++ )
221 {
222 npv += cashFlows [ i ] / Math.pow ( 1.0 + discountRate, i );
223 }
224
225 return npv;
226 }
227
228 /*********************************************************************
229 * The discounted value of a single cash flow received in the future.
230 *
231 * @param c Cash flow received in the future
232 * @param r Inflation or annual interest.
233 * @param t Number of years from today when the cash flow is received.
234 *********************************************************************/
235 public static final double presentValue (
236 double c,
237 double r,
238 double t )
239 //////////////////////////////////////////////////////////////////////
240 {
241 return c / Math.pow ( 1.0 + r, t );
242 }
243
244 /*********************************************************************
245 * The discounted value of varying annual cash flows.
246 *
247 * @param c Array of annual cash income starting one year from today.
248 * @param r Annual interest earned on income.
249 *********************************************************************/
250 public static final double presentValue (
251 double [ ] c,
252 double r )
253 //////////////////////////////////////////////////////////////////////
254 {
255 double sum = 0.0;
256 for ( int i = 0; i < c.length; i++ )
257 {
258 sum += presentValue ( c [ i ], r, i + 1 );
259 }
260 return sum;
261 }
262
263 /*********************************************************************
264 * Calculates the present value of an annuity.
265 *
266 * @param c Annual cash income starting one year from today.
267 * @param r Inflation or annual interest.
268 * @param t Number of years of cash income.
269 *********************************************************************/
270 public static final double presentValueAnnuity (
271 double c,
272 double r,
273 double t )
274 //////////////////////////////////////////////////////////////////////
275 {
276 return c * ( 1.0 - 1.0 / Math.pow ( 1.0 + r, t ) ) / r;
277 }
278
279 /*********************************************************************
280 * Calculates the annual savings necessary to accumulate a specified
281 * value in the future.
282 *
283 * @param f Future value desired.
284 * @param r Annual interest.
285 * @param t Number of years of savings.
286 *********************************************************************/
287 public static final double annualSavingsNeeded (
288 double f,
289 double r,
290 double t )
291 //////////////////////////////////////////////////////////////////////
292 {
293 return f * r / ( Math.pow ( 1.0 + r, t ) - 1.0 );
294 }
295
296 //////////////////////////////////////////////////////////////////////
297 //////////////////////////////////////////////////////////////////////
298
299 private FinanceLib ( ) { }
300
301 //////////////////////////////////////////////////////////////////////
302 //////////////////////////////////////////////////////////////////////
303 }
304