AI Resilience Score
${score} / 100
AI-Powered Recommendation
${recommendation}
Detailed Asset Breakdown
| Ticker |
Post-Shock Value |
Est. Liquidation Cost |
Est. Days to Liquidate |
${postShockMetrics.positions.map(p => `
| ${p.ticker} |
${formatCurrency(p.value)} |
${formatCurrency(p.liquidationCost)} |
${p.timeToLiquidate.toFixed(1)} days |
`).join('')}
| TOTALS |
${formatCurrency(postShockMetrics.value)} |
${formatCurrency(postShockMetrics.liquidationCost)} |
${postShockMetrics.timeToLiquidate.toFixed(1)} days |
`;
renderImpactChart(results);
}
function renderImpactChart(results) {
const ctx = document.getElementById('impactChart')?.getContext('2d');
if (!ctx) return;
if (chartInstance) chartInstance.destroy();
const { preShockMetrics, postShockMetrics } = results;
const finalValue = postShockMetrics.value - postShockMetrics.liquidationCost;
chartInstance = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Portfolio Value'],
datasets: [
{
label: 'Pre-Shock Value',
data: [preShockMetrics.value],
backgroundColor: '#6b7280', // gray-500
borderColor: '#4b5563',
borderWidth: 1
},
{
label: 'Post-Shock Value (Before Costs)',
data: [postShockMetrics.value],
backgroundColor: '#fca5a5', // red-300
borderColor: '#ef4444',
borderWidth: 1
},
{
label: 'Post-Shock Value (After Costs)',
data: [finalValue],
backgroundColor: '#93c5fd', // blue-300
borderColor: '#3b82f6',
borderWidth: 1
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
ticks: { callback: value => '$' + value.toLocaleString() }
}
},
plugins: {
title: { display: true, text: 'Portfolio Value Before and After Liquidity Shock' },
tooltip: { callbacks: { label: c => `${c.dataset.label}: $${c.raw.toLocaleString()}`}}
}
}
});
}
// --- PDF Download ---
function downloadPDF() {
const pdfElement = document.getElementById('pdf-output');
if (!pdfElement) return alert("Could not find content to download.");
const originalBg = pdfElement.style.backgroundColor;
pdfElement.style.backgroundColor = 'white';
const { jsPDF } = window.jspdf;
html2canvas(pdfElement, { scale: 2, useCORS: true, backgroundColor: '#ffffff' })
.then(canvas => {
pdfElement.style.backgroundColor = originalBg;
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'p', unit: 'px', format: [canvas.width, canvas.height] });
pdf.addImage(imgData, 'PNG', 0, 0, canvas.width, canvas.height);
pdf.save('Market-Liquidity-Resilience-Report.pdf');
}).catch(err => {
pdfElement.style.backgroundColor = originalBg;
console.error("PDF Generation Error:", err);
alert("An error occurred while generating the PDF.");
});
}