Bayesian Neural Networks: Unsicherheits-Schätzung im Trading.
Ein klassisches neuronales Netz sagt: „Aktie steigt um 0,8 % bis morgen." Es sagt nicht, ob es sich da sicher ist. Genau dieses fehlende Unsicherheits-Signal kostet in der Praxis Geld. Bayesian Neural Networks liefern es — zu einem Preis, der wert sein kann, was er kostet.
Das Problem mit Punkt-Schätzungen.
Ein Standard-NN gibt eine Punktprognose. Egal, ob es seine Trainingsdaten gut verstanden hat oder ob es gerade in einem nie gesehenen Regime extrapoliert: am Ende kommt eine Zahl heraus, mit derselben scheinbaren Autorität. Für Trading ist das gefährlich. Eine Prognose mit hoher implizierter Unsicherheit verdient eine kleinere Position als eine mit niedriger. Wer das nicht modelliert, verheizt im ersten Regime-Wechsel Kapital.
Bayesian Neural Networks ersetzen die Punkt-Schätzung der Gewichte durch eine Verteilung über Gewichte. Aus dieser Gewichts-Verteilung folgt eine Verteilung über Vorhersagen — und damit eine konkrete Unsicherheit pro Prediction.
Drei Wege zur Bayesianisierung.
1. Variational Inference (Bayes by Backprop)
Statt ein Gewicht w zu lernen, lernt man Mittelwert μ und
Standardabweichung σ einer Normalverteilung über w. Bei
jedem Forward-Pass wird w ~ N(μ, σ²) gesampelt. Trainings-Loss = Negative
Log-Likelihood + KL-Term gegen einen Prior. Implementiert in Pyro, TensorFlow
Probability, BLiTZ.
2. Monte-Carlo Dropout
Der pragmatische Trick von Gal & Ghahramani (2016): Dropout zur Inferenz-Zeit anlassen. Man führt T Forward-Passes durch, jeder mit unterschiedlichen Dropout-Masken, und behandelt die T Outputs als Samples aus einer approximierten Posterior-Verteilung. Praktisch ein Einzeiler in jedem PyTorch-Modell — und überraschend wirkungsvoll.
3. Laplace-Approximation
Ein klassisch trainiertes NN nehmen, die Hesse-Matrix der Loss-Funktion am Optimum berechnen, und daraus eine Gaußsche Posterior um die Punktschätzung der Gewichte ableiten. Schnell, post-hoc, gut mit der Library laplace-torch nutzbar.
MC-Dropout in PyTorch — minimaler Code.
import torch
import torch.nn as nn
class MCDropoutMLP(nn.Module):
def __init__(self, d_in, d_hidden=128, d_out=1, p=0.2):
super().__init__()
self.net = nn.Sequential(
nn.Linear(d_in, d_hidden), nn.ReLU(), nn.Dropout(p),
nn.Linear(d_hidden, d_hidden), nn.ReLU(), nn.Dropout(p),
nn.Linear(d_hidden, d_out))
def forward(self, x):
return self.net(x)
def predict_with_uncertainty(model, x, T=50):
model.train() # Dropout aktiv lassen
preds = torch.stack([model(x) for _ in range(T)])
mu = preds.mean(0)
sigma = preds.std(0)
return mu, sigma
Das ist die ganze Magie: model.train() zur Inferenz, T Forward-Passes,
Mean und Std. Aus dem Standard-MLP wird ein Modell mit Unsicherheit — ohne neue
Loss-Funktion, ohne neuen Optimizer.
Zwei Sorten Unsicherheit.
Bayesian Methoden trennen zwei Arten von Unsicherheit. Diese Unterscheidung ist im Trading wichtiger als die meisten denken.
Aleatorische Unsicherheit: intrinsisches Rauschen in den Daten — der Markt ist eben verrauscht. Mehr Daten reduzieren diese Unsicherheit nicht.
Epistemische Unsicherheit: Unsicherheit des Modells über sich selbst, weil es zu wenig Daten oder schlechte Daten gesehen hat. Diese Unsicherheit steigt in unbekannten Regimen — und das ist genau das Signal, das wir brauchen.
Praktisch: wenn ein BNN in einem neuen Macro-Regime sehr hohe epistemische Unsicherheit zeigt, sollte das Sizing radikal reduziert werden. Aleatorische Unsicherheit hingegen ist „normaler Marktlärm" und rechtfertigt kein Aussetzen.
Uncertainty-aware Position-Sizing.
Die operative Anwendung, in der BNNs in meiner Praxis ihren Preis rechtfertigen: Sizing als Funktion der Predictive Uncertainty.
def position_size(mu, sigma, kelly_cap=0.25):
# Sharpe-ähnliche Skalierung, gedeckelt
z = mu / (sigma + 1e-6)
raw = torch.clamp(z * 0.1, -kelly_cap, kelly_cap)
return raw
# hohe Unsicherheit -> kleine Position
# niedrige Unsicherheit, hoher Erwartungswert -> volle Position
Das Sizing ist proportional zum Signal-zu-Rausch-Verhältnis. Bei flat Signal oder hoher Unsicherheit geht die Position gegen Null. Bei klarem Signal mit niedriger Unsicherheit fährt man die volle Kelly-Fraktion (gedeckelt) — aber nur dann.
Was das in der Praxis bewirkt.
Ich habe BNN-basiertes Sizing in mehreren Mandanten-Setups gegen das Punktschätzungs-Sizing ihrer Vorgänger-Modelle gebenchmarkt. Über typische Backtests von 5–10 Jahren und verschiedene Asset-Klassen sehe ich konsistent:
- Maximaler Drawdown sinkt um 20–30 %.
- Sharpe steigt moderat (5–15 %) — nicht spektakulär, aber stabil.
- Trade-Frequenz sinkt, weil Low-Confidence-Setups herausgefiltert werden.
- Verhalten in Regime-Wechseln deutlich gutmütiger.
Das ist keine Alpha-Wundermaschine. Es ist disziplinierter Kapitaleinsatz, in Code gegossen. Genau das, was die meisten diskretionären Trader systematisch falsch machen.
Die Kosten.
BNNs haben drei reale Nachteile, die ich nicht beschönigen will:
- Compute: T Forward-Passes statt einer. Bei T=50 also 50× Inferenz-Kosten. Für Daily-Trading egal, für HFT prohibitiv.
- Hyperparameter: Dropout-Rate, Prior-Wahl, T — alle haben spürbaren Einfluss. Ein schlecht kalibriertes BNN ist schlechter als ein gut kalibriertes Standard-NN.
- Kalibrierungs-Pflege: Unsicherheits-Schätzungen müssen kalibriert sein — die geschätzte 90-%-Region sollte die wahren Werte in 90 % der Fälle abdecken. Das prüft man mit Reliability-Diagrams und muss es im Live-Betrieb monitoren.
Meine Praxis.
Ich setze BNNs (meist MC-Dropout, gelegentlich Laplace) standardmäßig dort ein, wo der Output direkt in Sizing-Entscheidungen fließt. Für reine Klassifikations- oder Screening-Aufgaben („welche Aktien sind heute Kandidaten?") reicht ein kalibriertes Standard-Modell.
Wer aus klassischen Punktprognose-Setups kommt, gewinnt meiner Erfahrung nach mehr durch das Einführen von Unsicherheits-bewusstem Sizing als durch jede weitere Feature-Iteration. Es ist ein unsexy, aber zuverlässiger Hebel.
Sie wollen Unsicherheits-Schätzung in Ihr bestehendes ML-Setup integrieren? Erstgespräch buchen — wir analysieren, wo es echten Hebel hat.