views:

1747

answers:

1

I need a very accurate calculator formula. Right now my formula works for monthly contributions with monthly compounding, but when you use weekly contributions with monthly compounding, I don't know how to adjust the formula. You can see my calculator in action by downloading and unzipping the attached files.

So far, this is the most accurate calculator I've found on the web. I'd be happy if I could get a Javascript formula to match the values generated by this calculator.

The problem with weekly contributions and monthly compounding is that while there are 52 weeks in a year, some months have 5 weeks and others have 4. I don't think their calculator takes this into account; I think they simply base their calculation on 52 weeks and every 4 weeks they compound the interest.

Here is the formula I'm using:

var P = startingAmount;
var Y = yearsOfInvesting;
var c = getAdditionalContributionsPerPeriod;
var t = getTermsPerPeriod;
var n = t * Y;
var r = interestRate / 100 / t; // interestRate [%]
var z = 1 + r;
total = P * Math.pow(z, n) + c * (Math.pow(z, n + 1) - z) / r;

Given a scenario of

  • $1000 principal,
  • $50 per week contribution,
  • 10 years,
  • monthly compounding,

the other calculator says total should be $30,007, rounding the decimals up. The closest I've come to this is using this formula is by weekly contributions and weekly compounding (But I want monthly compounding!):

var P = 1000;//startingAmount;
var Y = 0;//yearsOfInvesting;
var c = 50;//
var n = 520;//t * Y;
var r = .02/52;
var z = 1 + r;

mz = P * Math.pow(z, n) + c * (Math.pow(z, n + 1) - z) / r;
document.write(mz);

How can I make my formula work for weekly and daily contributions?

+1  A: 

Well... Both of these are slightly off from that calculator, but possibly more accurate to how things are actually done (not sure, however, because I don't know how it is actually done):

function calc( startingAmount, yearsOfInvesting, additionalContributionsPerPeriod, interestRate ) {
    var interestPerDay = ( interestRate / 365 );
    var total = startingAmount;
    var date = new Date( new Date().getFullYear() + new Date().getMonth() + 1, 1 );
    var endDate = new Date( date.getFullYear() + yearsOfInvesting, date.getMonth(), date.getDate() - 1 );
    var startingWeekday = date.getDay();
    var startingDate = date.getDate();
    var runningInterest = 0;
    while( Date.parse( date.toString() ) < Date.parse( endDate.toString() ) ) {
        date.setDate( date.getDate() + 1 );
        runningInterest = runningInterest + total * interestPerDay;
        if( date.getDay() == startingWeekday ) {
            total = total + additionalContributionsPerPeriod;
        }
        if( date.getDate() == startingDate ) {
            total = total + runningInterest;
            runningInterest = 0;
        }
    }
    total = total + runningInterest;
    return total;
}
function calc2( startingAmount, yearsOfInvesting, additionalContributionsPerPeriod, interestRate ) {
    var interestPerDay = ( interestRate / 365 );
    var total = startingAmount;
    var runningInterest = 0;
    for( var day = 1; day <= 365 * yearsOfInvesting; day++ ) {
        runningInterest = runningInterest + total * interestPerDay;
        if( day % 7 == 0 ) {
            total = total + additionalContributionsPerPeriod;
        }
        if( day % 30 == 0 ) {
            total = total + runningInterest;
            runningInterest = 0;
        }
    }
    total = total + runningInterest;
    return total;
}
document.write( 3647 + "<br>" + calc( 1000, 1, 50, 0.02 ) + "<br>" + calc2( 1000, 1, 50, 0.02 ) );
document.write( "<br><br>" );
document.write( 6347 + "<br>" + calc( 1000, 2, 50, 0.02 ) + "<br>" + calc2( 1000, 2, 50, 0.02 ) );
document.write( "<br><br>" );
document.write( 14779 + "<br>" + calc( 1000, 5, 50, 0.02 ) + "<br>" + calc2( 1000, 5, 50, 0.02 ) );
document.write( "<br><br>" );
document.write( 30007 + "<br>" + calc( 1000, 10, 50, 0.02 ) + "<br>" + calc2( 1000, 10, 50, 0.02 ) );
document.write( "<br><br>" );
document.write( 31673 + "<br>" + calc( 1000, 10, 50, 0.03 ) + "<br>" + calc2( 1000, 10, 50, 0.03 ) );
document.write( "<br><br>" );
document.write( 33460 + "<br>" + calc( 1000, 10, 50, 0.04 ) + "<br>" + calc2( 1000, 10, 50, 0.04 ) );
document.write( "<br><br>" );
document.write( 35378 + "<br>" + calc( 1000, 10, 50, 0.05 ) + "<br>" + calc2( 1000, 10, 50, 0.05 ) );
document.write( "<br><br>" );
document.write( 772849953 + "<br>" + calc( 1000, 55, 50, 0.20 ) + "<br>" + calc2( 1000, 55, 50, 0.20 ) );
Illandril