Implicit Rate Calculation from Lease

Implicit Lease Rate Calculator

Determine the internal rate of return (IRR) embedded within a lease agreement based on the asset's fair value, lease payments, and residual value.

The current market price or cost of the asset.
The recurring amount paid per period.
Total number of payment cycles (e.g., months).
Value of asset at the end of the term.
End of Period (Arrears) Start of Period (Advance)
Calculated Implicit Rate (Annualized)
0.00%
Periodic Rate: 0.00%

What is the Implicit Rate in a Lease?

Under accounting standards like ASC 842 and IFRS 16, the rate implicit in the lease is the interest rate that causes the aggregate present value of (a) the lease payments and (b) the unguaranteed residual value to equal the sum of (i) the fair value of the underlying asset and (ii) any initial direct costs of the lessor.

Lessees are required to use this rate if it is "readily determinable." If not, they use their incremental borrowing rate (IBR).

The Calculation Logic

Because the rate is the unknown variable in a present value equation, it cannot be solved with simple algebra. This calculator uses the Newton-Raphson method, an iterative numerical algorithm, to find the exact rate where the Net Present Value (NPV) equals zero.

Practical Example

  • Asset Value: $50,000
  • Monthly Payment: $1,200
  • Term: 48 Months
  • Residual Value: $10,000
  • Timing: Payments at start of month

In this scenario, the implicit annual rate is approximately 8.85%.

function calculateImplicitRate() { var fairValue = parseFloat(document.getElementById('assetFairValue').value); var pmt = parseFloat(document.getElementById('leasePayment').value); var n = parseFloat(document.getElementById('leasePeriods').value); var rv = parseFloat(document.getElementById('residualValue').value); var timing = parseInt(document.getElementById('paymentTiming').value); if (isNaN(fairValue) || isNaN(pmt) || isNaN(n) || isNaN(rv) || fairValue <= 0) { alert("Please enter valid positive numbers for all fields."); return; } // Solve for rate 'r' such that: // FairValue = PV(Payments) + PV(Residual) // 0 = -FairValue + Pmt * [(1-(1+r)^-n)/r] * (1+r*timing) + RV * (1+r)^-n var r = 0.01; // Initial guess (1% per period) var precision = 0.0000001; var maxIterations = 100; var iteration = 0; function getNPV(rate) { if (rate === 0) { return (pmt * n) + rv – fairValue; } var pvFactor = (1 – Math.pow(1 + rate, -n)) / rate; var timingFactor = (1 + rate * timing); var pvPmt = pmt * pvFactor * timingFactor; var pvRv = rv * Math.pow(1 + rate, -n); return pvPmt + pvRv – fairValue; } function getDerivative(rate) { if (rate === 0) return 0; var eps = 0.00001; return (getNPV(rate + eps) – getNPV(rate)) / eps; } // Newton-Raphson Method while (iteration < maxIterations) { var npv = getNPV(r); var derivative = getDerivative(r); var nextR = r – (npv / derivative); if (Math.abs(nextR – r) < precision) { r = nextR; break; } r = nextR; iteration++; } var resultArea = document.getElementById('resultArea'); var finalRateEl = document.getElementById('finalRate'); var periodRateEl = document.getElementById('periodRate'); if (isNaN(r) || !isFinite(r)) { finalRateEl.innerText = "Error"; periodRateEl.innerText = "Check your inputs (e.g. payments too low for value)"; } else { var annualRate = r * 12 * 100; // Assuming monthly periods var periodicRate = r * 100; finalRateEl.innerText = annualRate.toFixed(3) + "%"; periodRateEl.innerText = "Periodic Rate: " + periodicRate.toFixed(4) + "%"; } resultArea.style.display = "block"; }

Leave a Comment