'use client'; import React, { useState, useEffect, useMemo } from 'react'; import { LineChart, Line, ResponsiveContainer } from 'recharts'; import 'katex/dist/katex.min.css'; import MacroMathModal from './MacroMathModal'; import { TrendingUp, Landmark, AlertCircle, BookOpen, Percent, ArrowDownRight, ArrowUpRight, Minus, Activity, ShieldAlert, Coins } from 'lucide-react'; interface IndicatorDataPoint { date: string; value: number; } interface MacroIndicator { name: string; unit: string; category: string; current: number; previous: number; trend: 'UP' | 'DOWN' | 'FLAT'; data: IndicatorDataPoint[]; } interface MacroDataPayload { dates: string[]; indicators: Record; liveDataAvailable: boolean; timestamp: number; } export default function MacroIndicatorsDemo() { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [payload, setPayload] = useState(null); const [isMathModalOpen, setIsMathModalOpen] = useState(false); useEffect(() => { const fetchIndicators = async () => { setLoading(true); setError(null); try { const response = await fetch('/api/macro/indicators'); if (response.ok) { const data = await response.json(); setPayload(data); } else { setError('Fehler beim Abruf der makroökonomischen Indikatoren.'); } } catch (err) { console.error('Fetch macro indicators error:', err); setError('Netzwerkfehler beim Laden der Makroökonomischen Daten.'); } finally { setLoading(false); } }; fetchIndicators(); }, []); // Compute Fed Net Liquidity Proxy dynamically across the 24 months // Formula: Net Liquidity = Fed Assets (T$) - TGA (B$/1000) - RRP (B$/1000) const netLiquidityIndicator = useMemo(() => { if (!payload?.indicators?.fedBalanceSheet || !payload?.indicators?.tga || !payload?.indicators?.rrp) { return null; } const fedBalance = payload.indicators.fedBalanceSheet; const tga = payload.indicators.tga; const rrp = payload.indicators.rrp; const netLiquidityData: IndicatorDataPoint[] = fedBalance.data.map((point, idx) => { const assets = point.value; const tgaVal = tga.data[idx]?.value || 0; const rrpVal = rrp.data[idx]?.value || 0; // Convert B$ to T$ const liq = assets - (tgaVal + rrpVal) / 1000; return { date: point.date, value: parseFloat(liq.toFixed(3)) }; }); const len = netLiquidityData.length; const current = netLiquidityData[len - 1].value; const previous = netLiquidityData[len - 2].value; let trend: 'UP' | 'DOWN' | 'FLAT' = 'FLAT'; if (current > previous) trend = 'UP'; if (current < previous) trend = 'DOWN'; return { name: 'Federal Reserve Net Liquidity Proxy', unit: 'T$', category: 'Zentralbanken & Liquidität', current, previous, trend, data: netLiquidityData } as MacroIndicator; }, [payload]); if (loading) { return (
Lade makroökonomisches Datenarchiv...
); } if (error || !payload) { return (
{error || 'Fehler beim Laden.'}
); } const indicators = payload.indicators; // Helper to color trends/values based on macroeconomic threshold rules const getValHighlightClass = (key: string, val: number, trend: string) => { if (key === 'hySpread') { return val > 5.0 ? 'text-rose-400 font-bold animate-pulse' : 'text-slate-100'; } if (key === 'yieldSpread') { return val < 0.0 ? 'text-rose-500 font-bold' : 'text-emerald-400'; } if (key === 'cpiYoY' || key === 'coreCpi') { if (val <= 2.5) return 'text-emerald-400 font-semibold'; if (val >= 3.0) return 'text-amber-400'; } if (key === 'm2' && trend === 'DOWN') { return 'text-rose-400'; } if (key === 'rrp' && val < 400) { return 'text-rose-400'; } return 'text-slate-100'; }; // Helper for trend icons const renderTrendIcon = (trend: 'UP' | 'DOWN' | 'FLAT', key: string) => { const baseClass = "w-4 h-4 inline-block align-middle"; if (trend === 'UP') { const isBad = key === 'cpiYoY' || key === 'coreCpi' || key === 'ppi' || key === 'unemployment' || key === 'joblessClaims' || key === 'hySpread'; return ; } if (trend === 'DOWN') { const isBad = key === 'nfp' || key === 'fedFunds' || key === 'fedBalanceSheet' || key === 'm2' || key === 'rrp' || key === 'tga'; return ; } return ; }; return (
{/* ⚠️ Dynamic Rate-Limit Override Warning Banner */} {!payload.liveDataAvailable && (
[⚠️ API Limit - Historical Archive Active] Der Echtzeit-Datenabruf (Juni 2026) ist aufgrund von Ratenbeschränkungen (FMP HTTP 429) gedrosselt. Das System operiert im sicheren, gepufferten historischen Archiv-Modus.
)} {/* SECTION 1: Header & Control Bar */}
Macroeconomics Silo

Makroökonomische Indikatoren & Kredit-Silo

Analysiert Zyklen, Liquiditätsflüsse und Zinskurven über die letzten 24 Monate.

Letztes Update
{new Date(payload.timestamp).toLocaleTimeString()}
{/* SECTION 2: Economic Data 3-Grid Panels */}
{/* PANEL 1: Inflation & Wachstum */}

Inflation & Wachstum

Real-Data
{Object.entries(indicators) .filter(([_, ind]) => ind.category === 'Inflation & Wachstum') .map(([key, ind]) => (
{ind.name}
Vorherig: {ind.previous}{ind.unit}
{/* Micro Recharts Sparkline */}
{ind.current}{ind.unit}
{renderTrendIcon(ind.trend, key)} {ind.trend.toLowerCase()}
))}
{/* PANEL 2: Zentralbanken & Liquidität */}

Zentralbanken & Liquidität

M2 / RRP / TGA
{/* Fed Funds, ECB Refi, Fed Assets, M2, RRP, TGA */} {Object.entries(indicators) .filter(([_, ind]) => ind.category === 'Zentralbanken & Liquidität') .map(([key, ind]) => (
{ind.name}
Vorherig: {ind.previous}{ind.unit}
{/* Micro Recharts Sparkline */}
{ind.current}{ind.unit}
{renderTrendIcon(ind.trend, key)} {ind.trend.toLowerCase()}
))} {/* Dynamic Calculated Net Liquidity Proxy Row */} {netLiquidityIndicator && (
Net Fed Liquidity
Vorherig: {netLiquidityIndicator.previous}{netLiquidityIndicator.unit}
{/* Micro Recharts Sparkline */}
{netLiquidityIndicator.current}{netLiquidityIndicator.unit}
{renderTrendIcon(netLiquidityIndicator.trend, 'netLiquidity')} {netLiquidityIndicator.trend.toLowerCase()}
)}
{/* PANEL 3: Kredit- & Anleihemarkt */}

Kredit- & Anleihemarkt

Zinskurven & Spreads
{Object.entries(indicators) .filter(([_, ind]) => ind.category === 'Kredit- & Anleihemarkt') .map(([key, ind]) => (
{ind.name}
Vorherig: {ind.previous}{ind.unit}
{/* Micro Recharts Sparkline */}
{ind.current}{ind.unit}
{renderTrendIcon(ind.trend, key)} {ind.trend.toLowerCase()}
))}
{/* SECTION 3: Dynamic Macro analysis and explanation */}

Systemische Macro- & Kreditmarkt-Analyse

Zinskurveninversionen (z. B. wenn der 2S10S-Yield-Spread negativ ist) gelten historisch als zuverlässige Vorläufer ökonomischer Kontraktionen. Derzeit un-invertiert die Kurve (+{indicators.yieldSpread?.current.toFixed(2)}%), was oft kurz vor oder während einer konjunkturellen Anpassungsphase auftritt. Gleichzeitig zeigt der Kreditmarkt mit einem High-Yield Credit Spread von {indicators.hySpread?.current}% ein ruhiges, risikoarmes Bild. Monetäre Liquidität (Net Fed Liquidity Proxy: {netLiquidityIndicator?.current} T$) wirkt als zentraler Impulsgeber: Ein Anstieg des TGA-Volumens oder der RRP-Nutzung zieht freie Liquidität aus dem Bankensystem ab (Bremswirkung für Aktien/Krypto), während ein Abbau dieser Posten zusätzliche Liquidität freisetzt (Rückenwind für Risk Assets).

setIsMathModalOpen(false)} />
); }