How Are Comparison Rates Calculated

Comparison Rate Calculator

Determine the "True Cost" of a loan inclusive of fees and charges.

Your Calculated Comparison Rate:
5.71%
Base Monthly Repayment: $920.84
Total Monthly Cost: $930.84

Understanding Comparison Rates

A comparison rate is a statutory tool used in finance to help consumers identify the true cost of a loan. While a "Nominal Rate" or "Advertised Rate" only accounts for the interest charged on the principal, the comparison rate bundles the interest rate, upfront fees, and ongoing maintenance charges into a single percentage figure.

How the Calculation Works

The math behind a comparison rate is essentially an Internal Rate of Return (IRR) calculation. It follows these logical steps:

  1. The Baseline: We calculate the standard monthly repayment based on the advertised nominal rate and the loan term.
  2. Adjusting Repayments: We add any ongoing monthly or annual fees to that repayment amount.
  3. Adjusting the Principal: We subtract any upfront fees (application fees, legal costs, etc.) from the total loan amount to find the "Net Amount Received."
  4. Solving for the Rate: We use an iterative mathematical process to find the interest rate that makes the present value of all future "Total Monthly Costs" equal to the "Net Amount Received."

Practical Example

Imagine a loan of $150,000 at 5.50% over 25 years with a $600 upfront fee and a $10 monthly service fee.

  • Nominal Rate: 5.50%
  • Monthly Payment (Interest Only): $920.84
  • Monthly Payment + Fees: $930.84
  • Effective Principal: $149,400 ($150k – $600)
  • Resulting Comparison Rate: 5.71%

Note: Comparison rates do not include government charges (like stamp duty) or fees that occur only under certain circumstances (like late payment fees or early exit fees).

function calculateComparisonRate() { var P = parseFloat(document.getElementById('calc_principal').value); var nominalRate = parseFloat(document.getElementById('calc_nominal_rate').value); var termYears = parseFloat(document.getElementById('calc_term').value); var upfrontFees = parseFloat(document.getElementById('calc_upfront').value); var monthlyFee = parseFloat(document.getElementById('calc_monthly_fee').value); if (isNaN(P) || isNaN(nominalRate) || isNaN(termYears) || P <= 0) { alert("Please enter valid positive numbers for Principal, Rate, and Term."); return; } var n = termYears * 12; var r_monthly = (nominalRate / 100) / 12; // Base monthly repayment (M) var basePayment = 0; if (r_monthly === 0) { basePayment = P / n; } else { basePayment = P * (r_monthly * Math.pow(1 + r_monthly, n)) / (Math.pow(1 + r_monthly, n) – 1); } var totalMonthlyPayment = basePayment + monthlyFee; var netPrincipal = P – upfrontFees; // Use Newton's method to find IRR (Comparison Rate) // Formula: P_net = M_total * [(1 – (1+i)^-n) / i] // We need to find i. var i = r_monthly; // Initial guess if (i <= 0) i = 0.0001; for (var iteration = 0; iteration < 20; iteration++) { var f_i = (totalMonthlyPayment / i) * (1 – Math.pow(1 + i, -n)) – netPrincipal; var df_i = totalMonthlyPayment * ( (n * Math.pow(1+i, -n-1) / i) – ( (1 – Math.pow(1+i, -n)) / (i * i) ) ); var next_i = i – (f_i / df_i); if (Math.abs(next_i – i) < 0.0000001) break; i = next_i; } var comparisonRateAnnual = i * 12 * 100; document.getElementById('calc_result_value').innerText = comparisonRateAnnual.toFixed(2) + "%"; document.getElementById('calc_base_payment').innerText = "$" + basePayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); document.getElementById('calc_total_payment').innerText = "$" + totalMonthlyPayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } // Run once on load window.onload = calculateComparisonRate;

Leave a Comment