Global Systemic Financial Risk Monitor
Global Macro-Financial Data
Risk Factor Weights & Stress Scenario
Weighting of Factors (Total should be 100%)
Warning: Total weights must add up to 100%.
Stress Test Scenario Parameters
Qualitative Factors
Global Systemic Risk Assessment Results
Please enter your data and parameters, then click "Analyze Risk" to see the results.
Error: Total weights must sum to 100%. Please check the "Risk Parameters" tab.
`; return; } // --- Normalize Scores (0-100, higher is worse/higher risk) --- // GDP Growth: Lower is riskier. Assume 5% growth is 0 risk, -5% is 100 risk. let scoreGdpGrowth = Math.max(0, Math.min(100, (5 - globalGdpGrowth) * 10)); // (5 - 3) * 10 = 20, (5 - (-5)) * 10 = 100 // Inflation: Higher is riskier. Assume 2% is 0 risk, 12% is 100 risk. let scoreInflation = Math.max(0, Math.min(100, (globalInflation - 2) * 10)); // (2.5 - 2) * 10 = 5, (12-2)*10=100 // Equity Market Volatility: Higher is riskier. Assume 10 points is 0 risk, 60 points is 100 risk. let scoreEquityVolatility = Math.max(0, Math.min(100, (equityMarketVolatility - 10) * 2)); // (18-10)*2 = 16, (60-10)*2=100 // Corporate Credit Spread: Higher is riskier. Assume 50 bps is 0 risk, 550 bps is 100 risk. let scoreCreditSpread = Math.max(0, Math.min(100, (corporateCreditSpread - 50) / 5)); // (150-50)/5=20, (550-50)/5=100 // Asset Valuation Index: Higher is riskier. (0-100 scale directly translates) let scoreAssetValuation = assetValuationIndex; // Bank CET1 Ratio: Lower is riskier. Assume 16% is 0 risk, 6% is 100 risk. let scoreBankCet1 = Math.max(0, Math.min(100, (16 - avgBankCet1) * 10)); // (16-14)*10=20, (16-6)*10=100 // Bank NPL Ratio: Higher is riskier. Assume 0% is 0 risk, 10% is 100 risk. let scoreBankNpl = Math.max(0, Math.min(100, avgBankNpl * 10)); // 2.0*10=20, 10*10=100 // Global Financial Leverage: Higher is riskier. (0-100 scale directly translates) let scoreFinancialLeverage = globalFinancialLeverage; // Systemic Interconnectedness (Qualitative 1-5, 5=Highly Interconnected). 5->100 risk, 1->0 risk. let scoreInterconnectedness = Math.max(0, Math.min(100, (systemicInterconnectedness - 1) * 25)); // Regulatory Effectiveness (Qualitative 1-5, 5=Very Effective). 1->100 risk, 5->0 risk. let scoreRegulatoryEffectiveness = Math.max(0, Math.min(100, (5 - regulatoryEffectiveness) * 25)); // --- Calculate Overall Systemic Risk Score --- let overallRiskScore = ( (scoreGdpGrowth * weightGdpGrowth) + (scoreInflation * weightInflation) + (scoreEquityVolatility * weightEquityVolatility) + (scoreCreditSpread * weightCreditSpread) + (scoreAssetValuation * weightAssetValuation) + (scoreBankCet1 * weightBankCet1) + (scoreBankNpl * weightBankNpl) + (scoreFinancialLeverage * weightFinancialLeverage) + (scoreInterconnectedness * weightInterconnectedness) + (scoreRegulatoryEffectiveness * weightRegulatoryEffectiveness) ); // Ensure score is within 0-100 range overallRiskScore = Math.max(0, Math.min(100, overallRiskScore)); // --- Stress Test Impact --- const stressedGdpGrowth = globalGdpGrowth - (stressGdpDrop * 100); // e.g., 3% - (2% * 100) -> 3 - 2 = 1% const stressedEquityVolatility = equityMarketVolatility * (1 + stressEquityDrop); // e.g., 18 * (1 + 0.25) = 22.5 const stressedCreditSpread = corporateCreditSpread + stressCreditSpreadWidening; // e.g., 150 + 100 = 250 // Recalculate relevant scores under stress let stressedScoreGdpGrowth = Math.max(0, Math.min(100, (5 - stressedGdpGrowth) * 10)); let stressedScoreEquityVolatility = Math.max(0, Math.min(100, (stressedEquityVolatility - 10) * 2)); let stressedScoreCreditSpread = Math.max(0, Math.min(100, (stressedCreditSpread - 50) / 5)); // Calculate stressed overall risk score let stressedOverallRiskScore = ( (stressedScoreGdpGrowth * weightGdpGrowth) + (scoreInflation * weightInflation) + // Inflation typically less direct shock in short-term (stressedScoreEquityVolatility * weightEquityVolatility) + (stressedScoreCreditSpread * weightCreditSpread) + (scoreAssetValuation * weightAssetValuation) + (scoreBankCet1 * weightBankCet1) + (scoreBankNpl * weightBankNpl) + (scoreFinancialLeverage * weightFinancialLeverage) + (scoreInterconnectedness * weightInterconnectedness) + (scoreRegulatoryEffectiveness * weightRegulatoryEffectiveness) ); stressedOverallRiskScore = Math.max(0, Math.min(100, stressedOverallRiskScore)); const riskIncrease = stressedOverallRiskScore - overallRiskScore; // --- Risk Interpretation and Recommendation --- let riskLevel = "Low"; let riskColorClass = "text-green-600"; let recommendation = "The global financial system appears to be in a period of low systemic risk. Continued vigilance and prudent policies are advised to maintain stability."; if (overallRiskScore >= 80) { riskLevel = "Critical"; riskColorClass = "text-red-700"; recommendation = "The model indicates critical systemic financial risk. The global financial system exhibits extreme vulnerabilities. Immediate and coordinated international policy interventions are likely necessary to avert a severe crisis. This may include significant liquidity injections, capital backstops, and regulatory actions to deleverage the system."; } else if (overallRiskScore >= 60) { riskLevel = "High"; riskColorClass = "text-red-600"; recommendation = "The global financial system is facing high systemic risk. Significant vulnerabilities are present across macro-financial indicators and financial sector health. Proactive and strong policy responses are crucial to mitigate the risk of financial instability and potential economic disruption."; } else if (overallRiskScore >= 30) { riskLevel = "Medium"; riskColorClass = "text-orange-600"; recommendation = "The global financial system has moderate systemic risk. While not immediately critical, underlying vulnerabilities warrant careful monitoring. Policymakers should consider macroprudential measures to build buffers, address imbalances, and strengthen financial sector resilience."; } // --- Display Results --- resultsOutput.innerHTML = `Current Macro-Financial Risk Indicators (Scores 0-100, Higher = Worse):
GDP Growth Risk Score: ${scoreGdpGrowth.toFixed(2)}
Inflation Risk Score: ${scoreInflation.toFixed(2)}
Equity Volatility Risk Score: ${scoreEquityVolatility.toFixed(2)}
Credit Spread Risk Score: ${scoreCreditSpread.toFixed(2)}
Asset Valuation Risk Score: ${scoreAssetValuation.toFixed(2)}
Bank CET1 Risk Score: ${scoreBankCet1.toFixed(2)}
Bank NPL Risk Score: ${scoreBankNpl.toFixed(2)}
Financial Leverage Risk Score: ${scoreFinancialLeverage.toFixed(2)}
Interconnectedness Risk Score: ${scoreInterconnectedness.toFixed(2)}
Regulatory Effectiveness Risk Score: ${scoreRegulatoryEffectiveness.toFixed(2)}
Overall Global Systemic Financial Risk Assessment:
${overallRiskScore.toFixed(2)} / 100
Risk Level: ${riskLevel}
${recommendation}
Stress Test Scenario Impact:
Stressed GDP Growth Rate: ${stressedGdpGrowth.toFixed(2)}%
Stressed Equity Market Volatility: ${stressedEquityVolatility.toFixed(2)} points
Stressed Corporate Credit Spread: ${stressedCreditSpread.toFixed(2)} basis points
Overall Risk Score Under Stress: ${stressedOverallRiskScore.toFixed(2)} / 100 (Increase of ${riskIncrease.toFixed(2)} points)
Note: This model provides a simplified, conceptual estimate of global systemic financial risk based on user inputs and assumed relationships. Actual systemic risk assessment is a highly complex process involving real-time, granular data from numerous institutions and markets, sophisticated quantitative models, and extensive qualitative expert judgment, often conducted by central banks and international financial institutions. This tool should be used for illustrative purposes only and not as a substitute for professional financial or economic analysis.
`; } // PDF Download Functionality downloadPdfBtn.addEventListener('click', function() { const { jsPDF } = window.jspdf; const doc = new jsPDF(); // Recalculate values for PDF to ensure consistency const globalGdpGrowth = getValidatedFloat(globalGdpGrowthInput); const globalInflation = getValidatedFloat(globalInflationInput); const globalInterestRate = getValidatedFloat(globalInterestRateInput); const equityMarketVolatility = getValidatedFloat(equityMarketVolatilityInput); const corporateCreditSpread = getValidatedFloat(corporateCreditSpreadInput); const assetValuationIndex = getValidatedFloat(assetValuationIndexInput); const avgBankCet1 = getValidatedFloat(avgBankCet1Input); const avgBankNpl = getValidatedFloat(avgBankNplInput); const globalFinancialLeverage = getValidatedFloat(globalFinancialLeverageInput); const weightGdpGrowth = getValidatedFloat(weightGdpGrowthInput) / 100; const weightInflation = getValidatedFloat(weightInflationInput) / 100; const weightEquityVolatility = getValidatedFloat(weightEquityVolatilityInput) / 100; const weightCreditSpread = getValidatedFloat(weightCreditSpreadInput) / 100; const weightAssetValuation = getValidatedFloat(weightAssetValuationInput) / 100; const weightBankCet1 = getValidatedFloat(weightBankCet1Input) / 100; const weightBankNpl = getValidatedFloat(weightBankNplInput) / 100; const weightFinancialLeverage = getValidatedFloat(weightFinancialLeverageInput) / 100; const weightInterconnectedness = getValidatedFloat(weightInterconnectednessInput) / 100; const weightRegulatoryEffectiveness = getValidatedFloat(weightRegulatoryEffectivenessInput) / 100; const stressGdpDrop = getValidatedFloat(stressGdpDropInput) / 100; const stressEquityDrop = getValidatedFloat(stressEquityDropInput) / 100; const stressCreditSpreadWidening = getValidatedFloat(stressCreditSpreadWideningInput); const systemicInterconnectedness = getValidatedFloat(systemicInterconnectednessInput); const regulatoryEffectiveness = getValidatedFloat(regulatoryEffectivenessInput); let scoreGdpGrowth = Math.max(0, Math.min(100, (5 - globalGdpGrowth) * 10)); let scoreInflation = Math.max(0, Math.min(100, (globalInflation - 2) * 10)); let scoreEquityVolatility = Math.max(0, Math.min(100, (equityMarketVolatility - 10) * 2)); let scoreCreditSpread = Math.max(0, Math.min(100, (corporateCreditSpread - 50) / 5)); let scoreAssetValuation = assetValuationIndex; let scoreBankCet1 = Math.max(0, Math.min(100, (16 - avgBankCet1) * 10)); if (avgBankCet1 >= 16) scoreBankCet1 = 0; else if (avgBankCet1 > 12) scoreBankCet1 = 20; // Refined score let scoreBankNpl = Math.max(0, Math.min(100, avgBankNpl * 10)); let scoreFinancialLeverage = globalFinancialLeverage; let scoreInterconnectedness = Math.max(0, Math.min(100, (systemicInterconnectedness - 1) * 25)); let scoreRegulatoryEffectiveness = Math.max(0, Math.min(100, (5 - regulatoryEffectiveness) * 25)); let overallRiskScore = ( (scoreGdpGrowth * weightGdpGrowth) + (scoreInflation * weightInflation) + (scoreEquityVolatility * weightEquityVolatility) + (scoreCreditSpread * weightCreditSpread) + (scoreAssetValuation * weightAssetValuation) + (scoreBankCet1 * weightBankCet1) + (scoreBankNpl * weightBankNpl) + (scoreFinancialLeverage * weightFinancialLeverage) + (scoreInterconnectedness * weightInterconnectedness) + (scoreRegulatoryEffectiveness * weightRegulatoryEffectiveness) ); overallRiskScore = Math.max(0, Math.min(100, overallRiskScore)); const stressedGdpGrowth = globalGdpGrowth - (stressGdpDrop * 100); const stressedEquityVolatility = equityMarketVolatility * (1 + stressEquityDrop); const stressedCreditSpread = corporateCreditSpread + stressCreditSpreadWidening; let stressedScoreGdpGrowth = Math.max(0, Math.min(100, (5 - stressedGdpGrowth) * 10)); let stressedScoreEquityVolatility = Math.max(0, Math.min(100, (stressedEquityVolatility - 10) * 2)); let stressedScoreCreditSpread = Math.max(0, Math.min(100, (stressedCreditSpread - 50) / 5)); let stressedOverallRiskScore = ( (stressedScoreGdpGrowth * weightGdpGrowth) + (scoreInflation * weightInflation) + (stressedScoreEquityVolatility * weightEquityVolatility) + (stressedScoreCreditSpread * weightCreditSpread) + (scoreAssetValuation * weightAssetValuation) + (scoreBankCet1 * weightBankCet1) + (scoreBankNpl * weightBankNpl) + (scoreFinancialLeverage * weightFinancialLeverage) + (scoreInterconnectedness * weightInterconnectedness) + (scoreRegulatoryEffectiveness * weightRegulatoryEffectiveness) ); stressedOverallRiskScore = Math.max(0, Math.min(100, stressedOverallRiskScore)); const riskIncrease = stressedOverallRiskScore - overallRiskScore; let riskLevel = "Low"; let recommendation = "The global financial system appears to be in a period of low systemic risk. Continued vigilance and prudent policies are advised to maintain stability."; if (overallRiskScore >= 80) { riskLevel = "Critical"; recommendation = "The model indicates critical systemic financial risk. The global financial system exhibits extreme vulnerabilities. Immediate and coordinated international policy interventions are likely necessary to avert a severe crisis. This may include significant liquidity injections, capital backstops, and regulatory actions to deleverage the system."; } else if (overallRiskScore >= 60) { riskLevel = "High"; recommendation = "The global financial system is facing high systemic risk. Significant vulnerabilities are present across macro-financial indicators and financial sector health. Proactive and strong policy responses are crucial to mitigate the risk of financial instability and potential economic disruption."; } else if (overallRiskScore >= 30) { riskLevel = "Medium"; recommendation = "The global financial system has moderate systemic risk. While not immediately critical, underlying vulnerabilities warrant careful monitoring. Policymakers should consider macroprudential measures to build buffers, address imbalances, and strengthen financial sector resilience."; } // PDF Content Setup doc.setFontSize(22); doc.setTextColor(30, 64, 138); // Dark Blue doc.text("Global Systemic Financial Risk Report", 105, 20, null, null, "center"); doc.setFontSize(12); doc.setTextColor(55, 65, 81); // Gray-700 let y = 30; // Macro-Financial Indicators Section doc.setFontSize(16); doc.setTextColor(30, 64, 138); // Dark Blue doc.text("1. Macro-Financial Indicators", 20, y += 15); doc.setFontSize(12); doc.setTextColor(55, 65, 81); // Gray-700 doc.autoTable({ startY: y + 5, head: [['Indicator', 'Value']], body: [ ['Global Real GDP Growth Rate', `${globalGdpGrowth.toFixed(2)}%`], ['Global Average Inflation Rate', `${globalInflation.toFixed(2)}%`], ['Global Benchmark Interest Rate', `${globalInterestRate.toFixed(2)}%`], ['Global Equity Market Volatility', `${equityMarketVolatility.toFixed(0)} points`], ['Global Corporate Credit Spread (IG)', `${corporateCreditSpread.toFixed(0)} basis points`], ['Global Asset Valuation Index', `${assetValuationIndex.toFixed(0)} / 100`], ['Global Average Bank CET1 Ratio', `${avgBankCet1.toFixed(2)}%`], ['Global Average Bank NPL Ratio', `${avgBankNpl.toFixed(2)}%`], ['Global Financial Leverage Index', `${globalFinancialLeverage.toFixed(0)} / 100`] ], theme: 'grid', styles: { fillColor: [243, 244, 246] }, headStyles: { fillColor: [59, 130, 246], textColor: [255, 255, 255] }, margin: { left: 20, right: 20 } }); y = doc.autoTable.previous.finalY; // Risk Factor Weights & Stress Scenario Parameters Section doc.setFontSize(16); doc.setTextColor(30, 64, 138); doc.text("2. Risk Parameters & Weights", 20, y += 15); doc.setFontSize(12); doc.setTextColor(55, 65, 81); doc.autoTable({ startY: y + 5, head: [['Factor', 'Weight (%)']], body: [ ['GDP Growth', (weightGdpGrowth * 100).toFixed(0)], ['Inflation', (weightInflation * 100).toFixed(0)], ['Equity Volatility', (weightEquityVolatility * 100).toFixed(0)], ['Credit Spread', (weightCreditSpread * 100).toFixed(0)], ['Asset Valuation', (weightAssetValuation * 100).toFixed(0)], ['Bank CET1', (weightBankCet1 * 100).toFixed(0)], ['Bank NPL', (weightBankNpl * 100).toFixed(0)], ['Financial Leverage', (weightFinancialLeverage * 100).toFixed(0)], ['Systemic Interconnectedness (Qualitative)', (weightInterconnectedness * 100).toFixed(0)], ['Regulatory Effectiveness (Qualitative)', (weightRegulatoryEffectiveness * 100).toFixed(0)] ], theme: 'grid', styles: { fillColor: [243, 244, 246] }, headStyles: { fillColor: [59, 130, 246], textColor: [255, 255, 255] }, margin: { left: 20, right: 20 } }); y = doc.autoTable.previous.finalY; doc.setFontSize(16); doc.setTextColor(30, 64, 138); doc.text("3. Stress Test Scenario Parameters", 20, y += 15); doc.setFontSize(12); doc.setTextColor(55, 65, 81); doc.autoTable({ startY: y + 5, head: [['Parameter', 'Value']], body: [ ['Hypothetical GDP Drop', `${(stressGdpDrop * 100).toFixed(1)}%`], ['Hypothetical Equity Market Drop', `${(stressEquityDrop * 100).toFixed(0)}%`], ['Hypothetical Credit Spread Widening', `${stressCreditSpreadWidening.toFixed(0)} basis points`] ], theme: 'grid', styles: { fillColor: [243, 244, 246] }, headStyles: { fillColor: [59, 130, 246], textColor: [255, 255, 255] }, margin: { left: 20, right: 20 } }); y = doc.autoTable.previous.finalY; // Risk Analysis Results Section doc.setFontSize(16); doc.setTextColor(30, 64, 138); doc.text("4. Risk Analysis Results", 20, y += 15); doc.setFontSize(12); doc.setTextColor(55, 65, 81); let pdfRiskColor; if (riskLevel === "Critical") { pdfRiskColor = [153, 27, 27]; // Dark Red } else if (riskLevel === "High") { pdfRiskColor = [220, 38, 38]; // Red } else if (riskLevel === "Medium") { pdfRiskColor = [234, 88, 12]; // Orange } else { pdfRiskColor = [22, 163, 74]; // Green } doc.setTextColor(pdfRiskColor[0], pdfRiskColor[1], pdfRiskColor[2]); doc.text(`Overall Global Systemic Financial Risk Score: ${overallRiskScore.toFixed(2)} / 100`, 20, y += 10); doc.text(`Risk Level: ${riskLevel}`, 20, y += 8); doc.setTextColor(55, 65, 81); doc.setFontSize(12); doc.text("Recommendation:", 20, y += 15); const splitRecommendation = doc.splitTextToSize(recommendation, 170); doc.text(splitRecommendation, 20, y += 7); y += (splitRecommendation.length * 5) + 5; // Stress Test Results doc.setFontSize(16); doc.setTextColor(30, 64, 138); doc.text("5. Stress Test Scenario Impact", 20, y += 15); doc.setFontSize(12); doc.setTextColor(55, 65, 81); doc.autoTable({ startY: y + 5, head: [['Metric', 'Value']], body: [ ['Stressed GDP Growth Rate', `${stressedGdpGrowth.toFixed(2)}%`], ['Stressed Equity Market Volatility', `${stressedEquityVolatility.toFixed(2)} points`], ['Stressed Corporate Credit Spread', `${stressedCreditSpread.toFixed(2)} basis points`], ['Overall Risk Score Under Stress', `${stressedOverallRiskScore.toFixed(2)} / 100 (Increase of ${riskIncrease.toFixed(2)} points)`] ], theme: 'grid', styles: { fillColor: [243, 244, 246] }, headStyles: { fillColor: [59, 130, 246], textColor: [255, 255, 255] }, margin: { left: 20, right: 20 } }); y = doc.autoTable.previous.finalY; doc.setFontSize(10); doc.setTextColor(107, 114, 128); const disclaimer = "Note: This model provides a simplified, conceptual estimate of global systemic financial risk based on user inputs and assumed relationships. Actual systemic risk assessment is a highly complex process involving real-time, granular data from numerous institutions and markets, sophisticated quantitative models, and extensive qualitative expert judgment, often conducted by central banks and international financial institutions. This tool should be used for illustrative purposes only and not as a substitute for professional financial or economic analysis."; const splitDisclaimer = doc.splitTextToSize(disclaimer, 170); doc.text(splitDisclaimer, 20, y += 15); doc.save('Global_Systemic_Risk_Report.pdf'); }); // Initialize the first tab as active on load activateTab(0); checkTotalWeights(); // Initial check for weights });