Mortgage Rate Sensitivity Analyzer

Mortgage Rate Sensitivity Analyzer

Loan Details

Interest Rate Analysis

Enter your current or expected interest rate. The tool will analyze rates around this value.

Mortgage Rate Sensitivity Analysis

Enter loan details and click "Analyze Rates" on the previous tab.

Base Interest Rate: ${baseAnnualRate.toFixed(2)}%

`; const rateSteps = [-1.0, -0.5, -0.25, 0, 0.25, 0.5, 1.0]; // Percentage points from base rate let tableHTML = ``; let baseRateResults = null; const analysisResults = []; rateSteps.forEach(step => { let currentRate = baseAnnualRate + step; currentRate = Math.max(0.1, currentRate); // Ensure rate is at least minimally positive for calculation const results = calculateMonthlyPayment(loanAmount, currentRate, loanTermYears); analysisResults.push({ rate: currentRate, ...results }); if (step === 0) { baseRateResults = results; } }); analysisResults.forEach(res => { let monthlyPmtDiff = 0; let totalInterestDiff = 0; if (baseRateResults && res.rate !== baseAnnualRate) { monthlyPmtDiff = res.monthlyPayment - baseRateResults.monthlyPayment; totalInterestDiff = res.totalInterest - baseRateResults.totalInterest; } tableHTML += ``; }); tableHTML += `
Interest Rate (%) Monthly P&I ($) Total Interest Paid ($) Total Payments ($) Change in Monthly Pmt vs. Base ($) Change in Total Interest vs. Base ($)
${res.rate.toFixed(2)}% ${res.monthlyPayment.toLocaleString(undefined, {minimumFractionDigits:2, maximumFractionDigits:2})} ${res.totalInterest.toLocaleString(undefined, {minimumFractionDigits:2, maximumFractionDigits:2})} ${res.totalPayment.toLocaleString(undefined, {minimumFractionDigits:2, maximumFractionDigits:2})} ${monthlyPmtDiff.toLocaleString(undefined, {minimumFractionDigits:2, maximumFractionDigits:2, signDisplay: 'always'})} ${totalInterestDiff.toLocaleString(undefined, {minimumFractionDigits:2, maximumFractionDigits:2, signDisplay: 'always'})}
`; sensitivityTableContainerEl.innerHTML = tableHTML; notesContainerEl.style.display = 'block'; downloadPdfBtn.style.display = 'block'; } // --- PDF Download --- downloadPdfBtn?.addEventListener('click', function () { const { jsPDF } = window.jspdf; const pdfOutputArea = document.getElementById('mrsaPdfOutputArea'); if (!pdfOutputArea || sensitivityTableContainerEl.innerHTML.includes("Please enter loan details")) { alert('Please analyze rates first before downloading PDF.'); return; } // Ensure notes are visible for PDF capture document.getElementById('mrsaNotesContainer').style.display = 'block'; document.getElementById('mrsaInputSummaryForPdf').style.display = 'block'; // Ensure summary is visible html2canvas(pdfOutputArea, { scale: 1.2, useCORS: true, backgroundColor: '#ffffff', windowWidth: pdfOutputArea.scrollWidth }) .then(canvas => { const imgData = canvas.toDataURL('image/jpeg', 0.9); const pdf = new jsPDF({ orientation: 'landscape', unit: 'pt', format: 'a4' }); // Landscape for wider table const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const margin = 30; let contentWidth = pdfWidth - 2 * margin; const canvasWidth = canvas.width; const canvasHeight = canvas.height; const ratio = canvasWidth / canvasHeight; let imgWidth = contentWidth; let imgHeight = imgWidth / ratio; if (imgHeight > pdfHeight - 2 * margin) { imgHeight = pdfHeight - 2 * margin; imgWidth = imgHeight * ratio; if (imgWidth > contentWidth) { imgWidth = contentWidth; imgHeight = imgWidth / ratio; } } const x = (pdfWidth - imgWidth) / 2; pdf.addImage(imgData, 'JPEG', x, margin, imgWidth, imgHeight, undefined, 'MEDIUM'); pdf.save('Mortgage_Rate_Sensitivity_Analysis.pdf'); }) .catch(err => { console.error("Error generating PDF:", err); alert("Error generating PDF. See console for details."); }); }); // --- Initial Setup --- switchTab('inputsTab'); });
Scroll to Top