AI-Powered Global Sector Rotation Model

AI-Powered Global Sector Rotation Model

Leverage AI insights to optimize your investment portfolio through strategic sector rotation.

Current Economic & Market Conditions

Disclaimer: This tool provides a simulated AI analysis for educational and illustrative purposes only. It does not constitute financial or investment advice. Sector rotation strategies are complex and involve inherent risks. Always consult with qualified financial professionals before making any investment decisions.

Overall Market Outlook:

${marketOutlookSpan.textContent}

Recommended Sector Weighting:

`; pdfContentDiv.appendChild(analysisResultsSection); const pdfAllocationTable = document.createElement('table'); pdfAllocationTable.className = 'w-full rounded-lg overflow-hidden mt-4'; pdfAllocationTable.innerHTML = ` Sector Allocation (%) Rationale `; const pdfAllocationTableBody = pdfAllocationTable.querySelector('tbody'); analysisResultsSection.appendChild(pdfAllocationTable); // Copy rows from live allocation table const liveAllocationRows = sectorAllocationTableBody.querySelectorAll('tr'); if (liveAllocationRows.length > 0) { liveAllocationRows.forEach(liveRow => { const newRow = pdfAllocationTableBody.insertRow(); const cells = liveRow.querySelectorAll('td'); cells.forEach((cell, index) => { const newCell = newRow.insertCell(); newCell.className = 'py-2 px-4 border-b border-gray-200'; newCell.textContent = cell.textContent; }); }); } else { const noAllocRow = pdfAllocationTableBody.insertRow(); const noAllocCell = noAllocRow.insertCell(); noAllocCell.colSpan = 3; noAllocCell.className = 'py-2 px-4 text-center text-gray-500'; noAllocCell.textContent = 'No sector allocation generated. Please adjust inputs and run the model.'; } // --- Section: Strategic Insights --- const insightsSection = document.createElement('div'); insightsSection.className = 'mt-8 p-4 bg-blue-50 rounded-lg shadow-inner text-gray-700'; insightsSection.innerHTML = `

AI-Powered Strategic Insights:

    ${insightsContentList.innerHTML}
`; pdfContentDiv.appendChild(insightsSection); try { const canvas = await html2canvas(pdfContentDiv, { scale: 2, // Increase scale for better resolution in PDF useCORS: true // Required if you have external images/resources (though none here) }); const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'portrait', unit: 'px', format: 'a4' }); const imgWidth = pdf.internal.pageSize.getWidth() - 40; // Subtract margins (20px each side) const imgHeight = (canvas.height * imgWidth) / canvas.width; let position = 20; // Initial Y position with top margin pdf.addImage(imgData, 'PNG', 20, position, imgWidth, imgHeight); // Handle multi-page PDF for long content let heightLeft = imgHeight; heightLeft -= (pdf.internal.pageSize.getHeight() - 40); // Subtract current page usable height while (heightLeft >= -5) { // Adjusted condition to catch slightly overflowing content position = heightLeft - imgHeight + 20; // Calculate position for next page pdf.addPage(); pdf.addImage(imgData, 'PNG', 20, position, imgWidth, imgHeight); heightLeft -= (pdf.internal.pageSize.getHeight() - 40); } pdf.save('AI_Global_Sector_Rotation_Report.pdf'); } catch (error) { console.error("Error generating PDF:", error); // Provide user feedback without alert() const messageBox = document.createElement('div'); messageBox.textContent = "Failed to generate PDF. Please try again or check console for details."; messageBox.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: #f8d7da; color: #721c24; padding: 15px 25px; border-radius: 8px; border: 1px solid #f5c6cb; z-index: 1000; box-shadow: 0 4px 12px rgba(0,0,0,0.2); font-family: 'Inter', sans-serif; `; document.body.appendChild(messageBox); setTimeout(() => messageBox.remove(), 5000); // Remove after 5 seconds } finally { // Hide loading spinner and re-enable button pdfSpinner.classList.add('hidden'); downloadPdfBtn.disabled = false; // Remove the temporary PDF content div from the DOM if (pdfContentDiv.parentNode) { pdfContentDiv.parentNode.removeChild(pdfContentDiv); } } } });
Scroll to Top