@@ -557,10 +557,10 @@ export default function MacroIndicatorsDemo() {
{renderRow('yieldSpread', yieldSpread)}
{renderRow('hySpread', hySpread)}
- {/* Sub-section named "Immobilien- & Hypotheken-Kredite" */}
+ {/* Sub-section named "Real Estate & Mortgage Credit" */}
- Immobilien- & Hypotheken-Kredite
+ Real Estate & Mortgage Credit
@@ -578,10 +578,10 @@ export default function MacroIndicatorsDemo() {
{/* SECTION 3: Dynamic Macro analysis and explanation */}
-
Systemische Macro- & Kreditmarkt-Analyse
+
Systemic Macro & Credit Market Analysis
- Zinskurveninversionen (z. B. wenn der 2S10S-Yield-Spread negativ ist) gelten historisch als zuverlässige Vorläufer ökonomischer Kontraktionen. Derzeit beträgt der Spread {yieldSpread !== undefined ? (yieldSpread.current >= 0 ? '+' : '') + yieldSpread.current.toFixed(2) : '0.00'}% . Gleichzeitig signalisiert der Buffett-Indikator mit {buffett !== undefined ? buffett.current.toFixed(1) : '0.0'}% eine erhebliche Überbewertung des US-Aktienmarktes relativ zur Wirtschaftsleistung. Im Konsumsektor deutet die Kombination aus einer niedrigen Sparquote ({savingsRate !== undefined ? savingsRate.current.toFixed(1) : '0.0'}% ) und steigenden Kreditkartenausfällen ({ccDelinquency !== undefined ? ccDelinquency.current.toFixed(1) : '0.0'}% ) auf echten Stress hin, während der High-Yield Credit Spread ({hySpread !== undefined ? hySpread.current.toFixed(1) : '0.0'}% ) noch Stabilität anzeigt.
- Monetäre Liquidität (Net Fed Liquidity Proxy: {netLiquidityIndicator ? netLiquidityIndicator.current.toFixed(2) : '0.00'} 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).
+ Yield curve inversions (e.g. when the 2S10S Yield Spread is negative) are historically reliable leading indicators of economic contractions. Currently, the spread is {yieldSpread !== undefined ? (yieldSpread.current >= 0 ? '+' : '') + yieldSpread.current.toFixed(2) : '0.00'}% . At the same time, the Buffett Indicator indicates an overvaluation of the US stock market relative to economic output. In the consumer sector, the combination of a low savings rate ({savingsRate !== undefined ? savingsRate.current.toFixed(1) : '0.0'}% ) and rising credit card delinquencies ({ccDelinquency !== undefined ? ccDelinquency.current.toFixed(1) : '0.0'}% ) suggests genuine distress, while the High-Yield credit spread ({hySpread !== undefined ? hySpread.current.toFixed(1) : '0.0'}% ) still indicates stability.
+ Monetary liquidity (Net Fed Liquidity Proxy: {netLiquidityIndicator ? netLiquidityIndicator.current.toFixed(2) : '0.00'} T$ ) acts as a central impulse: an increase in TGA volume or RRP usage drains liquidity from the banking system (headwind for equities/crypto), while a decrease in these items releases additional liquidity (tailwind for risk assets).
diff --git a/components/modules/sandbox/PortfolioMathModal.tsx b/components/modules/sandbox/PortfolioMathModal.tsx
deleted file mode 100644
index 3bbddb0..0000000
--- a/components/modules/sandbox/PortfolioMathModal.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import React from 'react';
-import { BookOpen } from 'lucide-react';
-import 'katex/dist/katex.min.css';
-import { BlockMath, InlineMath } from 'react-katex';
-
-interface PortfolioMathModalProps {
- isOpen: boolean;
- onClose: () => void;
-}
-
-export default function PortfolioMathModal({ isOpen, onClose }: PortfolioMathModalProps) {
- React.useEffect(() => {
- const handleKeyDown = (e: KeyboardEvent) => {
- if (e.key === 'Escape') {
- onClose();
- }
- };
- if (isOpen) {
- window.addEventListener('keydown', handleKeyDown);
- }
- return () => {
- window.removeEventListener('keydown', handleKeyDown);
- };
- }, [isOpen, onClose]);
-
- if (!isOpen) return null;
-
- return (
-
-
-
- {/* Modal Header */}
-
-
-
- Portfolio Sandbox - Math & Logic Specification
-
-
Institutional Specification Manual
-
-
- Schließen (ESC)
-
-
-
- {/* Modal Body */}
-
-
-
-
5. Portfolio Sandbox & Rebalancing Engine
-
Estimates aggregate portfolio drawdowns and controls covariance drift boundaries.
-
-
-
-
A. Synthetic Portfolio Model & Asset Weightings
-
- Constructs a continuous synthetic asset representing your active weight allocations and its daily return track:
-
-
-
-
Active Percentage Weighting ( ) Calculation:
-
-
-
-
Synthetic Portfolio Log Return ( ):
-
-
-
-
-
-
-
B. Linear Mixed Effects Panel Regression (LMM)
-
- Solves the system-wide macro response model across all historical event instances using a Swamy-Arora GLS estimator:
-
-
-
-
Panel Model Specification with VIX Controls:
-
-
- where:
-
- - is the relative day offset from event date .
-
- - and are relative phase indicators.
-
- - is the background market-wide volatility covariate.
-
- - is the random group intercept (event instance shock).
-
- - is the residual error.
-
-
-
-
Optimal Kelly Criterion Position Sizing:
-
-
-
-
-
-
-
C. Reinvestment & Optimization Generation
-
- Integrates signals across three engines: Scanner (underpriced value), Econometrics (macro event post-event betas), and Insiders (corporate buying).
- Ranks candidates and suggests target reallocations.
-
-
-
-
-
-
- );
-}
diff --git a/components/modules/sandbox/SandboxDemo.tsx b/components/modules/sandbox/SandboxDemo.tsx
index 36c8c8b..b0cd866 100644
--- a/components/modules/sandbox/SandboxDemo.tsx
+++ b/components/modules/sandbox/SandboxDemo.tsx
@@ -6,7 +6,7 @@ import { calculateEWMA, calculateKellyFraction, calculateAssetCovariance } from
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend, ReferenceLine, AreaChart, Area } from 'recharts';
import 'katex/dist/katex.min.css';
import { BlockMath, InlineMath } from 'react-katex';
-import PortfolioMathModal from './PortfolioMathModal';
+import SandboxMathModal from './SandboxMathModal';
import {
TrendingUp, Wallet, ArrowDownRight, ArrowUpRight, Percent, Plus, FolderSync,
HelpCircle, Settings, Calendar, DollarSign, Tag, Check, AlertCircle, ChevronDown, ChevronUp, Sparkles,
@@ -53,7 +53,7 @@ export default function SandboxDemo() {
const [simulateFees, setSimulateFees] = useState(true);
const [isBackfill, setIsBackfill] = useState(false);
const [backfillDate, setBackfillDate] = useState('2026-05-20');
- const [hypothesisTag, setHypothesisTag] = useState('Fokus auf KI-Infrastruktur');
+ const [hypothesisTag, setHypothesisTag] = useState('Focus on AI Infrastructure');
const [orderError, setOrderError] = useState
(null);
const [orderSuccess, setOrderSuccess] = useState(false);
@@ -89,11 +89,11 @@ export default function SandboxDemo() {
const data = await response.json();
setStressData(data);
} else {
- setStressError("Fehler beim Laden der Stresstest-Daten.");
+ setStressError("Error loading stress test data.");
}
} catch (err) {
console.error("Stress test fetch error:", err);
- setStressError("Netzwerkfehler beim Laden des Stresstests.");
+ setStressError("Network error loading stress test.");
} finally {
setStressLoading(false);
}
@@ -174,7 +174,7 @@ export default function SandboxDemo() {
const shares = Number(newAssetShares);
const price = Number(newAssetPrice);
if (isNaN(shares) || shares <= 0 || isNaN(price) || price <= 0) {
- alert("Bitte geben Sie eine gültige Stückzahl und einen Einstandskurs an.");
+ alert("Please enter a valid number of shares and entry price.");
return;
}
updatePortfolioAsset(ticker, shares, price);
@@ -307,7 +307,7 @@ export default function SandboxDemo() {
if (!mounted) {
return (
-
Lade Sandbox-Modul...
+
Loading Sandbox Module...
);
}
@@ -331,7 +331,7 @@ export default function SandboxDemo() {
setOrderSuccess(false);
if (tradeShares <= 0 || tradePrice <= 0) {
- setOrderError('Bitte geben Sie eine gültige Stückzahl und einen Kurs an.');
+ setOrderError('Please enter a valid number of shares and price.');
return;
}
@@ -354,8 +354,8 @@ export default function SandboxDemo() {
} else {
setOrderError(
tradeType === 'BUY'
- ? 'Unzureichendes Barguthaben (inklusive allfälliger Transaktionsgebühren).'
- : 'Unzureichende Anteile im Depot für den Verkauf.'
+ ? 'Insufficient cash balance (including transaction fees).'
+ : 'Insufficient shares in portfolio for sale.'
);
}
};
@@ -367,7 +367,7 @@ export default function SandboxDemo() {
- Kritische Klumpenrisiken (Kovarianz RED): {activePortfolio.riskProfile.message}
+ Critical Concentration Risks (Covariance RED): {activePortfolio.riskProfile.message}
)}
@@ -395,7 +395,7 @@ export default function SandboxDemo() {
setShowNewPortfolioModal(true)}
className="p-2 rounded-xl bg-slate-800 hover:bg-slate-700 text-emerald-400 hover:text-emerald-300 transition-colors border border-slate-700"
- title="Neues Sandbox-Portfolio erstellen"
+ title="Create new Sandbox Portfolio"
>
@@ -408,12 +408,12 @@ export default function SandboxDemo() {
className="flex items-center gap-1.5 px-4 py-3 rounded-xl bg-slate-950/80 hover:bg-slate-900 border border-slate-800 hover:border-slate-700 transition-all font-semibold text-xs tracking-wider text-emerald-400 justify-center h-[58px] shrink-0"
>
- 📖 Modulerklärung
+ 📖 Quantitative Handbook
{/* Net Worth Card */}
-
Gesamtwert
+
Total Value
${netWorth.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -421,7 +421,7 @@ export default function SandboxDemo() {
{/* Performance Card */}
-
GuV (Gesamt)
+
PnL (Total)
{isPositiveOverall ?
:
}
{isPositiveOverall ? '+' : ''}{totalGainLossPct.toFixed(2)}%
@@ -431,8 +431,8 @@ export default function SandboxDemo() {
{/* Live EWMA Vol Card */}
- EWMA Volatilität
-
+ EWMA Volatility
+
@@ -444,8 +444,8 @@ export default function SandboxDemo() {
{/* Covariance Risk Traffic Light Card */}
- Kovarianz-Ampel
-
+ Covariance Traffic Light
+
@@ -471,21 +471,21 @@ export default function SandboxDemo() {
{showNewPortfolioModal && (
-
Neues Sandbox-Portfolio
+
New Sandbox Portfolio
@@ -521,53 +521,53 @@ export default function SandboxDemo() {
className="flex items-center gap-1.5 text-xs text-slate-400 hover:text-emerald-400 transition-colors focus:outline-none"
>
{showMathAccordion ? : }
-
Mathematische Spezifikation & EWMA-Volatilitätsmodell
+
Mathematical Specification & EWMA Volatility Model
{showMathAccordion && (
-
1. EWMA Volatilitätsmodell
+
1. EWMA Volatility Model
- Die Volatilität wird mittels des Exponentially Weighted Moving Average (EWMA) -Modells ermittelt. Jüngere Renditen erhalten hierbei ein höheres Gewicht als weiter in der Vergangenheit liegende Renditen, gesteuert durch den Zerfallsparameter (Lambda).
+ Volatility is calculated using the Exponentially Weighted Moving Average (EWMA) model. Recent returns receive a higher weighting than returns further in the past, controlled by the decay parameter (Lambda).
- Die tägliche Volatilität wird auf ein ganzes Jahr hochgerechnet (Annualisierung) unter der Annahme von 252 Handelstagen:
+ The daily volatility is extrapolated to an entire year (annualization) assuming 252 trading days:
- RiskMetrics empfiehlt für tägliche Finanzdaten einen Lambda-Wert von .
+ RiskMetrics recommends a Lambda value of for daily financial data.
-
2. Kelly-Kriterium zur Positionsgrößenbestimmung
+
2. Kelly Criterion for Position Sizing
- Die Kelly-Formel bestimmt den optimalen Anteil des Kapitals ( ), der in ein Geschäft investiert werden soll, um das exponentielle Wachstum des Kapitals zu maximieren:
+ The Kelly formula determines the optimal fraction of capital ( ) to invest in a trade to maximize the exponential growth of wealth:
- Um Risiken durch ungenaue Schätzungen zu verringern, wenden wir das konservative Half-Kelly -Sizing an und begrenzen das Ergebnis auf (zusätzlich begrenzt auf ).
+ To mitigate risks from inaccurate estimations, we apply the conservative Half-Kelly sizing and limit the result to (additionally constrained to ).
-
3. Covariance & Cluster Risk (Kovarianz-Ampel)
+
3. Covariance & Cluster Risk (Covariance Traffic Light)
- Die Kovarianz zwischen Assets wird durch Multiplikation ihrer paarweisen Korrelation mit ihren jeweiligen Standardabweichungen (Volatilitäten) bestimmt:
+ The covariance between assets is determined by multiplying their pairwise correlation by their respective standard deviations (volatilities):
- Ein Klumpenrisiko (Risk RED) wird ausgelöst, wenn ein Asset eine Korrelation zu bestehenden Positionen aufweist und diese Positionen jeweils mehr als 15% des Portfolios ausmachen.
+ A concentration risk (Risk RED) is triggered when an asset exhibits a correlation to existing positions and these positions each exceed 15% of the portfolio.
@@ -575,14 +575,14 @@ export default function SandboxDemo() {
- {/* SECTION: Mein Portfolio Ingestion Cockpit */}
+ {/* SECTION: My Portfolio Ingestion Cockpit */}
- Mein Portfolio Cockpit
+ My Portfolio Cockpit
- Gesamt-Inventarwert: ${portfolioCalculated.totalValue.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
+ Total Inventory Value: ${portfolioCalculated.totalValue.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -591,20 +591,20 @@ export default function SandboxDemo() {
Asset / Ticker
- Stücke (Shares)
- Einstandspreis
- Aktueller Kurs
- Positionswert
+ Shares
+ Entry Price
+ Current Price
+ Position Value
Performance (PnL)
- Gewichtung (w_i)
- Aktionen
+ Weighting (w_i)
+ Actions
{portfolioCalculated.items.length === 0 ? (
- Bislang keine Assets im Ingestion-Cockpit. Fügen Sie unten ein Asset hinzu.
+ No assets in the Ingestion Cockpit yet. Add an asset below.
) : (
@@ -687,7 +687,7 @@ export default function SandboxDemo() {
removePortfolioAsset(item.ticker)}
className="p-1.5 rounded-lg bg-slate-950 hover:bg-rose-950/40 text-slate-500 hover:text-rose-400 transition-colors border border-slate-850 hover:border-rose-900/30 cursor-pointer"
- title="Asset löschen"
+ title="Delete asset"
>
@@ -703,7 +703,7 @@ export default function SandboxDemo() {
setNewAssetTicker(e.target.value)}
@@ -713,7 +713,7 @@ export default function SandboxDemo() {
setNewAssetShares(e.target.value === '' ? '' : Number(e.target.value))}
@@ -723,7 +723,7 @@ export default function SandboxDemo() {
setNewAssetPrice(e.target.value === '' ? '' : Number(e.target.value))}
@@ -736,9 +736,9 @@ export default function SandboxDemo() {
- Hinzufügen
+ Add
@@ -747,15 +747,15 @@ export default function SandboxDemo() {
- {/* SECTION: Systemischer Makro-Stresstest (Portfolio-LMM) */}
+ {/* SECTION: Systemic Macro Stress Test (Portfolio LMM) */}
- Systemischer Makro-Stresstest (Portfolio-LMM)
+ Systemic Macro Stress Test (Portfolio LMM)
- Analysiert die historische Sensitivität des Portfolios gegenüber Kern-Makro-Ereignissen über die letzten 36 Monate.
+ Analyzes the historical sensitivity of the portfolio to core macro events over the last 36 months.
{/* Event type tabs */}
@@ -779,18 +779,18 @@ export default function SandboxDemo() {
{stressLoading ? (
-
Kalkuliere Swamy-Arora GLS-Schätzer...
+
Calculating Swamy-Arora GLS estimators...
) : stressError || !stressData ? (
- {stressError || 'Keine Daten geladen.'}
+ {stressError || 'No data loaded.'}
) : (
{/* LMM Summary Statistics */}
-
Regressions-Koeffizienten (GLS)
+
Regression Coefficients (GLS)
{/* Fixed Effects list */}
@@ -803,13 +803,13 @@ export default function SandboxDemo() {
}`}>
- {fe.name === 'Intercept' ? 'Basisschnittstelle (Intercept)' :
+ {fe.name === 'Intercept' ? 'Baseline Intercept' :
fe.name === 'Pre-Event Drift' ? 'Pre-Event Trend (Drift)' :
- fe.name === 'Post-Event Impact' ? 'Systemisches Portfolio Beta' :
- 'VIX-Volatilitäts-Sensitivität'}
+ fe.name === 'Post-Event Impact' ? 'Systemic Portfolio Beta' :
+ 'VIX Volatility Sensitivity'}
- SE: {fe.se.toFixed(4)} | p-Wert: {fe.pVal.toFixed(4)}
+ SE: {fe.se.toFixed(4)} | p-value: {fe.pVal.toFixed(4)}
@@ -830,7 +830,7 @@ export default function SandboxDemo() {
{/* Model Fit metrics */}
- R-Quadrat (Bestimmtheitsmaß):
+ R-Squared:
{(stressData.regressionResults?.rSquared * 100).toFixed(1)}%
@@ -844,8 +844,8 @@ export default function SandboxDemo() {
{/* Recharts Area/Line Chart (2/3 width) */}
- Durchschnittlicher kumulierter Ertrag im Zeitfenster [-30, +30] Tage
- Akkumulierte Log-Renditen
+ Average cumulative return in the [-30, +30] days window
+ Accumulated log returns
@@ -875,7 +875,7 @@ export default function SandboxDemo() {
/>
`Relativer Tag: T${label >= 0 ? '+' : ''}${label}`}
+ labelFormatter={(label) => `Relative Day: T${label >= 0 ? '+' : ''}${label}`}
/>
@@ -911,7 +911,7 @@ export default function SandboxDemo() {
stroke="#ef4444"
strokeWidth={1.5}
strokeDasharray="3 3"
- label={{ value: 'Stichtag (T0)', fill: '#ef4444', fontSize: 9, position: 'top' }}
+ label={{ value: 'Event Date (T0)', fill: '#ef4444', fontSize: 9, position: 'top' }}
/>
@@ -925,7 +925,7 @@ export default function SandboxDemo() {
-
Quantitative Analyse-Auswertung
+
Quantitative Analysis Evaluation
{(() => {
const impactBeta = stressData.regressionResults?.fixedEffects.find((f: any) => f.name === 'Post-Event Impact')?.estimate || 0;
@@ -934,17 +934,17 @@ export default function SandboxDemo() {
const pVal = stressData.regressionResults?.fixedEffects.find((f: any) => f.name === 'Post-Event Impact')?.pVal || 0;
const isSignificant = pVal < 0.05;
- let eventNameText = activeStressTab === 'FOMC Rates' ? 'FOMC-Zinsentscheiden' :
- activeStressTab === 'CPI Inflation' ? 'CPI-Inflationsdaten' : 'Arbeitsmarktdaten';
+ let eventNameText = activeStressTab === 'FOMC Rates' ? 'FOMC rate decisions' :
+ activeStressTab === 'CPI Inflation' ? 'CPI inflation releases' : 'labor market updates';
let significanceText = isSignificant
- ? `Dieser Effekt ist mit einem p-Wert von ${pVal.toFixed(4)} statistisch signifikant.`
- : `Dieser Effekt ist mit einem p-Wert von ${pVal.toFixed(4)} statistisch nicht hochgradig signifikant (Rauscheinfluss möglich).`;
+ ? `This effect is statistically significant with a p-value of ${pVal.toFixed(4)}.`
+ : `This effect is not highly statistically significant (potential noise) with a p-value of ${pVal.toFixed(4)}.`;
if (isNegative) {
- return `Historische Reaktivität: Bei ${eventNameText} zeigt dein Depot ein negatives Beta von -${absBeta}. ${significanceText} Eine Absicherung über defensive Sektoren (z.B. Erhöhung der Bargeldquote oder defensive Consumer-Titel) senkt das Volatilitätsrisiko in dieser Post-Event-Phase um ca. ${Math.round(Math.abs(impactBeta) * 35)}%.`;
+ return `Historical reactivity: During ${eventNameText}, your portfolio exhibits a negative Beta of -${absBeta}. ${significanceText} Hedging via defensive sectors (e.g., increasing cash ratio or defensive consumer stocks) reduces volatility risk in this post-event phase by approx. ${Math.round(Math.abs(impactBeta) * 35)}%.`;
} else {
- return `Historische Reaktivität: Bei ${eventNameText} zeigt dein Depot ein positives Beta von +${absBeta}. ${significanceText} Dein Portfolio profitiert tendenziell von der anschließenden Marktdynamik. Sie können erwägen, die Hebelwirkung durch Zukäufe in Momentum-Aktien zu erhöhen.`;
+ return `Historical reactivity: During ${eventNameText}, your portfolio exhibits a positive Beta of +${absBeta}. ${significanceText} Your portfolio tends to benefit from the subsequent market momentum. You might consider increasing leverage via momentum additions.`;
}
})()}
@@ -960,7 +960,7 @@ export default function SandboxDemo() {
- Portfolio Wertentwicklung & Benchmark
+ Portfolio Performance & Benchmark
@@ -970,7 +970,7 @@ export default function SandboxDemo() {
onChange={(e) => setShowMsciBenchmark(e.target.checked)}
className="rounded border-slate-800 text-emerald-500 focus:ring-0 accent-emerald-500 w-4 h-4"
/>
- MSCI World (Benchmark) anzeigen
+ Show MSCI World (Benchmark)
@@ -985,7 +985,7 @@ export default function SandboxDemo() {
{showMsciBenchmark && (
-
+
)}
@@ -994,8 +994,8 @@ export default function SandboxDemo() {
{/* EWMA parameter tuner slider */}
-
Parameteranpassung EWMA Lambda (λ)
-
Zerfallsfaktor steuert die Schock-Sensitivität des Volatilitätsmodells.
+
Parameter Tuning EWMA Lambda (λ)
+
Decay factor controls the shock sensitivity of the volatility model.
- Stücke
+ Shares
- Kurs ($)
+ Price ($)
setTradeType('BUY')}
className={`flex-1 py-1.5 text-xs font-bold rounded-lg transition-all ${tradeType === 'BUY' ? 'bg-emerald-500 text-slate-950 shadow-md shadow-emerald-500/10' : 'text-slate-400 hover:text-slate-200'}`}
>
- Kauf (Long)
+ Buy (Long)
setTradeType('SELL')}
className={`flex-1 py-1.5 text-xs font-bold rounded-lg transition-all ${tradeType === 'SELL' ? 'bg-rose-500 text-white shadow-md shadow-rose-500/10' : 'text-slate-400 hover:text-slate-200'}`}
>
- Verkauf (Short)
+ Sell (Short)
@@ -1102,15 +1102,15 @@ export default function SandboxDemo() {
onChange={(e) => setKellySource(e.target.value as any)}
className="w-full bg-slate-900 border border-slate-800 rounded px-1.5 py-1 text-[10px] text-slate-200 focus:outline-none"
>
-
Manueller Regler
-
El. 2 Scanner-Score
-
El. 4 Bayes Posterior
-
El. 5 ROC Breakout
+
Manual Slider
+
Level 2 Scanner Score
+
Level 4 Bayes Posterior
+
Level 5 ROC Breakout
)}
@@ -1151,18 +1151,18 @@ export default function SandboxDemo() {
- Klumpenrisiko! Korrelation > 0.70 zu bestehenden Positionen. Kelly-Empfehlung wurde um 50% halbiert.
+ Concentration Risk! Correlation > 0.70 to existing positions. Kelly recommendation halved by 50%.
)}
- Kelly-Anteil:
- {(kellyFraction * 100).toFixed(1)}% des Cashs
+ Kelly Fraction:
+ {(kellyFraction * 100).toFixed(1)}% of Cash
- Kaufvolumen:
+ Buy Volume:
${Math.round(recommendedKellyCash).toLocaleString()}
@@ -1173,11 +1173,11 @@ export default function SandboxDemo() {
- Hypothese / What-if Notiz
+ Hypothesis / What-if Note
setHypothesisTag(e.target.value)}
@@ -1187,7 +1187,7 @@ export default function SandboxDemo() {
{/* Fees Toggle */}
@@ -1254,10 +1254,10 @@ export default function SandboxDemo() {
- Depotbestände ({activePortfolio.holdings.length})
+ Portfolio Holdings ({activePortfolio.holdings.length})
- Barguthaben: ${activePortfolio.cash.toLocaleString()}
+ Cash Balance: ${activePortfolio.cash.toLocaleString()}
@@ -1266,18 +1266,18 @@ export default function SandboxDemo() {
Asset
- Stücke
- Einstand
- Kurs
- Hypothese
- GuV
+ Shares
+ Avg Price
+ Price
+ Hypothesis
+ PnL
{activePortfolio.holdings.length === 0 ? (
- Keine Bestände in diesem Sandbox-Portfolio. Nutzen Sie die Order-Maske, um Werte hinzuzufügen.
+ No holdings in this Sandbox portfolio. Use the order mask to add assets.
) : (
@@ -1313,13 +1313,13 @@ export default function SandboxDemo() {
- Letzte Orderbuch-Einträge
+ Recent Order Book Entries
{activePortfolio.transactions.length === 0 ? (
-
Bislang keine Transaktionen in diesem Portfolio.
+
No transactions in this portfolio yet.
) : (
activePortfolio.transactions.map((tx) => {
const isBuy = tx.type === 'BUY';
@@ -1328,7 +1328,7 @@ export default function SandboxDemo() {
- {isBuy ? 'KAUF' : 'VERKAUF'}
+ {isBuy ? 'BUY' : 'SELL'}
{tx.symbol}
@@ -1336,8 +1336,8 @@ export default function SandboxDemo() {
- {tx.shares} Stk @ ${tx.price.toFixed(2)}
- Gebühr: ${tx.feeApplied.toFixed(2)}
+ {tx.shares} shares @ ${tx.price.toFixed(2)}
+ Fee: ${tx.feeApplied.toFixed(2)}
{tx.hypothesisTag && (
@@ -1355,7 +1355,7 @@ export default function SandboxDemo() {
-
setIsMathModalOpen(false)} />
+ setIsMathModalOpen(false)} />
);
}
diff --git a/components/modules/sandbox/SandboxMathModal.tsx b/components/modules/sandbox/SandboxMathModal.tsx
new file mode 100644
index 0000000..481cdf3
--- /dev/null
+++ b/components/modules/sandbox/SandboxMathModal.tsx
@@ -0,0 +1,135 @@
+import React from 'react';
+import { BookOpen, X, TrendingUp, BarChart2, ShieldAlert } from 'lucide-react';
+import 'katex/dist/katex.min.css';
+import { BlockMath, InlineMath } from 'react-katex';
+
+interface SandboxMathModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+}
+
+export default function SandboxMathModal({ isOpen, onClose }: SandboxMathModalProps) {
+ React.useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (e.key === 'Escape') {
+ onClose();
+ }
+ };
+ if (isOpen) {
+ window.addEventListener('keydown', handleKeyDown);
+ }
+ return () => {
+ window.removeEventListener('keydown', handleKeyDown);
+ };
+ }, [isOpen, onClose]);
+
+ if (!isOpen) return null;
+
+ return (
+
+
+
+ {/* Modal Header */}
+
+
+
+ Portfolio Sandbox - Math & Sizing Handbook
+
+
Institutional Portfolio Construction & Allocation Spec
+
+
+
+
+
+
+ {/* Modal Body */}
+
+
+ {/* Section A: Synthetic Portfolio Model & Asset Weightings */}
+
+
+ A. Synthetic Portfolio Model & Asset Weightings
+
+
+ The sandbox constructs a continuous synthetic asset representing your active weight allocations and its daily return track:
+
+
+
+
Active Percentage Weighting ( ) Calculation:
+
+
+
+
Synthetic Portfolio Log Return ( ):
+
+
+
+
+
+ {/* Section B: Linear Mixed Effects Panel Regression (LMM) */}
+
+
+ B. Linear Mixed Effects Panel Regression (LMM)
+
+
+ Solves the system-wide macro response model across all historical event instances using a Swamy-Arora GLS estimator:
+
+
+
+
Panel Model Specification with VIX Controls:
+
+
+ where:
+
+ - is the relative day offset from event date .
+
+ - and are relative phase indicators.
+
+ - is the background market-wide volatility covariate.
+
+ - is the random group intercept (event instance shock).
+
+ - is the residual error.
+
+
+
+
+
+ {/* Section C: Kelly Criterion & Fractional Betting Sizing */}
+
+
+ C. Kelly Criterion & Fractional Betting Sizing
+
+
+ The Kelly Criterion optimizes allocation sizing to maximize the expected value of the logarithm of wealth, balancing capital preservation with growth:
+
+
+
+
Theoretical Kelly Fraction ( ) Equation:
+
+
+ where:
+
+ - is the probability of a positive outcome (rebound or trade success).
+
+ - is the payout odds ratio (average win size divided by average loss size).
+
+
+
+
Fractional Kelly (Half-Kelly) Safety Buffer:
+
+
+ To mitigate estimation variance and protect against catastrophic drawdown due to model error or fat-tailed market returns, the cockpit clips the suggested sizing to a **Half-Kelly** multiplier ($0.5$).
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/modules/scanner/ScannerDemo.tsx b/components/modules/scanner/ScannerDemo.tsx
index a44e447..19be456 100644
--- a/components/modules/scanner/ScannerDemo.tsx
+++ b/components/modules/scanner/ScannerDemo.tsx
@@ -573,7 +573,7 @@ export default function ScannerDemo() {
)}
- Isoliert Kursstürze > 5% bei relativem Gesamtmarkt-Stopp (S&P 500 driftet seitwärts oder steigt). Misst die Asymmetrie mittels GJR-GARCH, um Panik von strukturellen Risiken zu separieren.
+ Isolates price crashes > 5% under relative market stability (S&P 500 drifting sideways or rising). Measures asymmetry using GJR-GARCH to separate panic from structural risks.
@@ -583,7 +583,7 @@ export default function ScannerDemo() {
className="flex items-center gap-1.5 px-4 py-3 rounded-xl bg-slate-950/80 hover:bg-slate-900 border border-slate-800 hover:border-slate-700 transition-all font-semibold text-xs tracking-wider text-amber-400 justify-center"
>
- 📖 Modulerklärung
+ 📖 Quantitative Handbook
- {scanning ? 'Scanne Markt...' : 'Markt scannen'}
+ {scanning ? 'Scanning Market...' : 'Scan Market'}
{scanning && (
{scanProgress}
@@ -604,11 +604,11 @@ export default function ScannerDemo() {
{/* Mode Toggles */}
-
Screener-Modus
+
Screener Mode
{[
- { id: 'day_crash', label: 'Day-Crashs' },
- { id: 'ma_drop', label: 'MA-Drop (SMA50)' },
+ { id: 'day_crash', label: 'Day Crashes' },
+ { id: 'ma_drop', label: 'MA Drop (SMA50)' },
{ id: '52w_dist', label: '52W-Distance' },
{ id: 'rsi_oversold', label: 'RSI-Oversold' }
].map((m) => (
@@ -629,7 +629,7 @@ export default function ScannerDemo() {
{/* Region Toggles */}
-
Markt-Region
+
Market Region
{[
{ id: 'us', label: 'US Markets' },
diff --git a/components/modules/scanner/ScannerMathModal.tsx b/components/modules/scanner/ScannerMathModal.tsx
index fdef3bf..8021557 100644
--- a/components/modules/scanner/ScannerMathModal.tsx
+++ b/components/modules/scanner/ScannerMathModal.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { BookOpen } from 'lucide-react';
+import { BookOpen, X } from 'lucide-react';
import 'katex/dist/katex.min.css';
import { BlockMath, InlineMath } from 'react-katex';
@@ -26,8 +26,8 @@ export default function ScannerMathModal({ isOpen, onClose }: ScannerMathModalPr
if (!isOpen) return null;
return (
-
-
+
+
{/* Modal Header */}
@@ -39,9 +39,10 @@ export default function ScannerMathModal({ isOpen, onClose }: ScannerMathModalPr
- Schließen (ESC)
+
@@ -59,15 +60,15 @@ export default function ScannerMathModal({ isOpen, onClose }: ScannerMathModalPr
Scans the entire corporate equity universe daily, segmenting equities into three distinct market capitalization classes to identify localized overreactions:
-
+
Mega Caps
> $100B
-
+
Mid Caps
$10B - $100B
-
+
Small Caps
< $10B
@@ -79,20 +80,20 @@ export default function ScannerMathModal({ isOpen, onClose }: ScannerMathModalPr
Calculates price distance ratios relative to support levels:
-
+
1. 52-Week High Deviation:
-
+
2. 50-Day Moving Average Drop:
-
+
3. Relative Strength Index (RSI-14) with smoothing:
-
-
-
+
+
+
where smoothed elements use Welles Wilder alpha = 1/14. Deep oversold signals trigger at RSI < 30.
@@ -104,19 +105,19 @@ export default function ScannerMathModal({ isOpen, onClose }: ScannerMathModalPr
To avoid value traps, technical drop factors are coupled with valuation metrics fetched in real-time from FMP:
-
+
- Trailing P/E (KGV) : Measures the price relative to trailing 12-month earnings.
- Price-to-Book (KBV) : Measures the asset backing relative to equity capital.
+ Trailing P/E : Measures the price relative to trailing 12-month earnings.
+ Price-to-Book : Measures the asset backing relative to equity capital.
Dividend Yield (%) : Tangible dividend payouts to measure cash backflow support.
PEG Ratio : Relates PE multiple to annual earnings growth:
-
+
Implicit Forward P/E calculation from PEG relationship:
-
-
+
+
If PEG is unavailable, a default growth rate of 10% is assumed as a conservative fallback baseline.
diff --git a/components/modules/tech/AiSpecialSilo.tsx b/components/modules/tech/AiSpecialSilo.tsx
index bbffd82..ba30953 100644
--- a/components/modules/tech/AiSpecialSilo.tsx
+++ b/components/modules/tech/AiSpecialSilo.tsx
@@ -213,12 +213,12 @@ export default function AiSpecialSilo() {
{isShieldActive ? (
- DEV-ARCHIV AKTIV (0 CALLS)
+ DEV ARCHIVE ACTIVE (0 CALLS)
) : (
- LIVE-API ENDPUNKT (FMP CORPO)
+ LIVE API ENDPOINT (FMP CORPO)
)}
@@ -233,7 +233,7 @@ export default function AiSpecialSilo() {
className="flex items-center gap-1.5 px-4 py-2.5 rounded-xl bg-slate-955/80 hover:bg-slate-900 border border-slate-800 hover:border-slate-700 transition-all font-semibold text-xs tracking-wider text-teal-400 w-full md:w-auto justify-center h-11 cursor-pointer"
>
-
📖 Modulerklärung
+
📖 Quantitative Handbook
diff --git a/components/modules/tech/TechMathModal.tsx b/components/modules/tech/TechMathModal.tsx
index 338fb13..c663688 100644
--- a/components/modules/tech/TechMathModal.tsx
+++ b/components/modules/tech/TechMathModal.tsx
@@ -198,21 +198,21 @@ export default function TechMathModal({ isOpen, onClose }: TechMathModalProps) {
{"Formula for Accruals (\\(\\text{Accruals}\\)):"}
-
+
{"Formula for Sloan Ratio (\\(\\text{Sloan Ratio}\\)):"}
-
+
{"Where:"}
- {"- "} {" is the company's net income for the fiscal period."}
+ {"- "} {" is the company's net income for the fiscal period."}
- {"- "} {" is Cash Flow from Operations (operating cash flow)."}
+ {"- "} {" is Cash Flow from Operations (operating cash flow)."}
- {"- "} {" is Cash Flow from Investing activities."}
+ {"- "} {" is Cash Flow from Investing activities."}
- {"- "} {" is the total assets reported on the balance sheet at the end of the period."}
+ {"- "} {" is the total assets reported on the balance sheet at the end of the period."}
diff --git a/components/modules/whale/WhaleMathModal.tsx b/components/modules/whale/WhaleMathModal.tsx
index f6dcba6..4f59ac2 100644
--- a/components/modules/whale/WhaleMathModal.tsx
+++ b/components/modules/whale/WhaleMathModal.tsx
@@ -90,9 +90,9 @@ export default function WhaleMathModal({ isOpen, onClose }: WhaleMathModalProps)
Velocity of Conviction (VoC) Delta:
-
+
Asset Portfolio Weight Calculation:
-
+
Where:
@@ -102,7 +102,7 @@ export default function WhaleMathModal({ isOpen, onClose }: WhaleMathModalProps)
- is the market value of the position in asset \(i\) as reported in the 13F filing for quarter \(t\).
- - represents the total market value of all reported equity holdings in the filing for quarter \(t\) (AUM proxy).
+ - represents the total market value of all reported equity holdings in the filing for quarter \(t\) (AUM proxy).
diff --git a/components/modules/whale/WhaleScreener.tsx b/components/modules/whale/WhaleScreener.tsx
index 52ba062..ab9c234 100644
--- a/components/modules/whale/WhaleScreener.tsx
+++ b/components/modules/whale/WhaleScreener.tsx
@@ -106,12 +106,12 @@ export default function WhaleScreener() {
{isShieldActive ? (
- DEV-ARCHIV AKTIV (0 CALLS)
+ DEV ARCHIVE ACTIVE (0 CALLS)
) : (
- LIVE-API ENDPUNKT (FMP CORPO)
+ LIVE API ENDPOINT (FMP CORPO)
)}
@@ -123,7 +123,7 @@ export default function WhaleScreener() {
setRefreshKey(prev => prev + 1)}
- className="flex items-center justify-center p-2.5 rounded-xl bg-slate-950/80 hover:bg-slate-900 border border-slate-800 hover:border-slate-700 transition-all text-slate-400 hover:text-slate-200 h-11 w-11 cursor-pointer"
+ className="flex items-center justify-center p-2.5 rounded-xl bg-slate-955/80 hover:bg-slate-900 border border-slate-800 hover:border-slate-700 transition-all text-slate-400 hover:text-slate-200 h-11 w-11 cursor-pointer"
title="Refresh holdings"
>
@@ -133,7 +133,7 @@ export default function WhaleScreener() {
className="flex items-center gap-1.5 px-4 py-2.5 rounded-xl bg-slate-955/80 hover:bg-slate-900 border border-slate-800 hover:border-slate-700 transition-all font-semibold text-xs tracking-wider text-blue-400 w-full md:w-auto justify-center h-11 cursor-pointer"
>
- 📖 Modulerklärung
+ 📖 Quantitative Handbook