Kaum war die Weltmeisterschaft eröffnet, bekamen wir eine kleine Mahnung vom Markt: Selbst starke Teams können scheitern, nur die Art und Weise ist oft kreativer, als wir es uns vorstellen.
Zum Beispiel Spanien 0:0 Kap Verde. Vor dem Spiel, wenn man nur auf Stärke, Platzierung und Kaderbreite schaut, würden die meisten instinktiv denken: „Spanien sollte das schon gewinnen.“ Aber das ist genau das, was Fußball so faszinierend und gleichzeitig so quälend für Trader macht. Man glaubt, man kauft einen „Sieg des starken Teams“, aber in Wirklichkeit kauft man eine ganze 90-minütige Schicksalsserie. Nach 15 Minuten kein Tor – die Quote bewegt sich. Nach einer halben Stunde immer noch 0:0 – der Markt runzelt die Stirn. Nach 70 Minuten immer noch nichts – der scheinbar sichere Sieg des starken Teams wird plötzlich wackelig.
An diesem Punkt stößt man auf einen klassischen Widerspruch: Arbitrage ist großartig, Prognose ist schwierig.
Echte Arbitrage ist theoretisch risikofrei. Man findet eine Gruppe sich gegenseitig ausschließender und vollständiger Kontrakte, so dass unabhängig vom Ausgang das Portfolio eingelöst werden kann, und die Kaufkosten geringer sind als der Einlösungsbetrag. Klingt wunderbar – wie ein Mittagsschlaf für Trader. Aber das Problem liegt auf der Hand: Solche Gelegenheiten sind selten, verschwinden schnell, und das Volumen reicht oft nicht.
Prognose ist eine andere Sache. Man kann einschätzen, dass das starke Team mit hoher Wahrscheinlichkeit gewinnt, man kann Aufstellung, Form, Spielplan und Verletzungen analysieren, man kann die impliziten Wahrscheinlichkeiten aus den Quoten ablesen – aber das Spiel spielt nicht mit, nur weil wir gründlich analysiert haben. Fußball ist besonders tückisch: Eine frühe rote Karte, ein Pfostenschuss, eine aberwitzige VAR-Entscheidung können eine gut klingende Logik in drei Sekunden Stille in der Nachbesprechung verwandeln.
Die Frage lautet also: Wenn reine Arbitrage zu rar und reine Prognose zu zufällig ist, können wir uns dann in der Mitte zwischen beiden positionieren? Der Markt selbst gibt uns bereits einige vorherige Wahrscheinlichkeiten: den Preis für den Sieg des starken Teams, den Preis für 0:0, den Preis für 0:1. Diese Preise entstehen nicht aus dem Nichts; sie spiegeln die kollektive Bewertung verschiedener Pfade durch den Markt wider. Können wir diese Vorwahrscheinlichkeiten nutzen und dazu noch ein eigenes mathematisches Modell einsetzen, um ein nicht perfektes, aber geschützteres Portfolio zu konstruieren, um ein Fenster für die „Konvergenz von Pfaden“ zu öffnen?
Das ist der Ausgangspunkt dieser Idee.
Es ist keine traditionelle risikofreie Arbitrage und auch keine reine Bauchgefühl-Prognose. Es ist eher ein Kompromiss: Zuerst erkennen wir an, dass die vom Markt gegebenen Hauptwahrscheinlichkeiten Referenzwert haben, dann schützen wir die verletzlichste Stelle der Hauptannahme mit Pfaden niedriger Wahrscheinlichkeit und prüfen gleichzeitig mit einem einfachen Modell, ob der Preis noch akzeptabel ist.
Nehmen wir an, ein Spiel, in dem Brasilien klar stärker als Haiti ist. Der Marktpreis für einen brasilianischen Sieg liegt bei 0,89, was zeigt, dass ein Sieg Brasiliens ein starker Hauptpfad ist. Aber wir kaufen nicht direkt nur den brasilianischen Sieg, sondern beobachten gleichzeitig zwei Schutzpfade: 0:0 und 0:1. Denn für die Annahme eines starken Sieges sind die schlimmsten frühen Szenarien oft nicht alle möglichen Ergebnisse, sondern dass das Spiel sich nicht öffnet oder das schwächere Team einen frühen Treffer erzielt.
Das anfängliche Portfolio wird also:
text
Brasilien-Sieg Yes
0:0 Yes
0:1 Yes
Angenommene Preise:
text
Brasilien-Sieg = 0.89
0:0 = 0.016
0:1 = 0.011
Gesamtkosten der drei Beine:
text
C = 0.89 + 0.016 + 0.011 = 0.917
Diese Zusammenstellung ist kein vollständiges Ereignis. Sie deckt nicht 1:1, 0:2, 2:2 ab, auch nicht alle seltsamen Szenarien. Wenn man sie bis zum Spielende hält, kann sie natürlich verlieren, und zwar direkt. Aber sie hat eine wichtige Eigenschaft: Sie fasst die drei vom Markt gegebenen Wahrscheinlichkeiten zusammen und bildet einen Korb von Pfaden um den Hauptsieg.
Wenn Brasilien am Ende gewinnt, zahlt das Portfolio 1 aus. Wenn das Spiel 0:0 oder 0:1 endet, zahlt es ebenfalls 1. Das bedeutet: Es kauft:
text
Brasilien-Sieg ∪ 0:0 ∪ 0:1
Wenn einer dieser Pfade eintritt, beträgt die Auszahlung bei Fälligkeit 1. Die Kosten sind 0,917, es bleibt eine Spanne von 0,083 innerhalb der abgedeckten Pfade. Aber der eigentliche Schlüssel liegt nicht im Endspiel, sondern zwischendurch.
Wenn Brasilien früh ein Tor schießt und es 1:0 steht, werden die beiden Schutzbeine 0:0 und 0:1 nahezu wertlos, aber der Preis für den brasilianischen Sieg steigt. Solange der verkaufbare Preis für den brasilianischen Sieg zu diesem Zeitpunkt über den ursprünglichen Gesamtkosten zuzüglich einer Zielgewinnspanne liegt, kann der Hauptsieg glattgestellt und das Portfolio vorzeitig geschlossen werden.
Die Formel ist einfach:
text
Gewinnmitnahme-Bedingung: Brasilien-Sieg Bid >= ursprüngliche Gesamtkosten C + Zielgewinn
Zielgewinn z.B. 0,02:
text
Auslösepreis = 0,917 + 0,02 = 0,937
Wenn bei 1:0 das Bid auf den brasilianischen Sieg bei 0,95 liegt, dann:
text
Fixierter Gewinn = 0,95 - 0,917 = 0,033
Hier verdienen wir nicht durch die Endauszahlung, sondern dadurch, dass das Spiel in einen günstigen Pfad eingetreten ist und wir das Portfolio vorzeitig verkaufen. Dieser Prozess ähnelt dem, dass der Markt ein kleines Fenster öffnet – man sollte nicht am Fenster Gedichte schreiben, sondern schnell hindurchkriechen.
Aber es gibt noch ein Problem: Nur weil die drei Beine billig aussehen, heißt das noch lange nicht, dass sie es wert sind. Marktpreise sind nur die erste Informationsebene. Wir brauchen auch einen eigenen Referenzmaßstab, auch wenn er noch so simpel ist.
Hier habe ich das einfachste Poisson-Tormodell verwendet.
Fußballergebnisse können grob als zufällige Prozesse der Tore zweier Mannschaften in 90 Minuten betrachtet werden. Angenommen, die erwartete Toranzahl der Heimmannschaft in 90 Minuten ist λ_home, die der Auswärtsmannschaft λ_away, dann ist die Wahrscheinlichkeit, dass die Heimmannschaft i Tore schießt und die Auswärtsmannschaft j Tore, gegeben durch:
text
P(i, j) = Pois(i; λ_home) × Pois(j; λ_away)
wobei:
text
Pois(k; λ) = e^(-λ) × λ^k / k!
Es ist natürlich sehr grob. Fußball sind keine zwei unabhängigen Ziehungsautomaten; nach einem Tor ändert sich die Taktik, rote Karten ändern sich, die Moral ändert sich. Aber der Vorteil ist Einfachheit und Transparenz – es verhindert zumindest, dass wir völlig aus dem Bauch heraus entscheiden.
Vor dem Spiel kann das Poisson-Modell uns einen ersten Anhaltspunkt geben. Wir können λ_home und λ_away manuell festlegen oder das Programm die genauen Ergebnisquoten des Marktes rückrechnen lassen. Zum Beispiel die Quoten für 0:0, 0:1, 1:0, 1:1, 2:0, 2:1, 3:0 – jede entspricht einem vom Markt gegebenen Wahrscheinlichkeitspunkt. Das Programm muss ein Paar λ_home und λ_away finden, sodass die vom Poisson-Modell berechneten Ergebniswahrscheinlichkeiten möglichst nahe an diesen Marktpreisen liegen.
Mit anderen Worten: Der Markt sagt: „Ich denke, diese Ergebnisse sind ungefähr so viel wert.“ Das Poisson-Modell flüstert leise dazwischen: „Dann versuche ich, mich anzupassen, um zu sehen, welche Torstärke hinter diesen Preisen steckt.“
In der Strategie kann man konfigurieren:
python
CALIBRATE_LAMBDA_FROM_MARKET = True
MODEL_SCORE_SAMPLES = "0-0,0-1,1-0,1-1,2-0,2-1,3-0"
Diese Ergebnisse werden nur zur Modellierung verwendet, nicht für den tatsächlichen Handel. Die wirklich gehandelten Beine bleiben:
text
Sieg des Zielfeams
0:0
0:1
Im Code wird eine Gittersuche zur Kalibrierung von λ verwendet. Es ist nicht kompliziert, aber intuitiv:
python
def fit_lambdas_from_score_markets(quotes, model_score_legs, event_state=None):
samples = []
live_score = event_state.get("score_tuple") if event_state else None
minute = event_state.get("elapsed") if event_state else None
is_live = bool(live_score and minute not in [None, ""])
for leg in model_score_legs:
q = quotes.get(leg["name"])
p_market = quote_probability(q)
if p_market is None:
continue
target_h, target_a = parse_score_text(leg["score"])
if is_live:
current_h, current_a = live_score
if current_h > target_h or current_a > target_a:
continue
samples.append((target_h - current_h, target_a - current_a, p_market, leg["score"]))
else:
samples.append((target_h, target_a, p_market, leg["score"]))
if len(samples) < 2:
return None
best = None
for ih in range(5, 501, 5):
lh = ih / 100.0
for ia in range(5, 501, 5):
la = ia / 100.0
err = 0.0
for add_h, add_a, p_market, _score in samples:
p_model = poisson_pmf(add_h, lh) * poisson_pmf(add_a, la)
err += (p_model - p_market) ** 2
if best is None or err < best["err"]:
best = {"lambda_home": lh, "lambda_away": la, "err": err, "samples": samples}
if is_live:
ratio = max(0.01, max(0.0, 90.0 - float(minute)) / 90.0)
best["lambda_home"] = best["lambda_home"] / ratio
best["lambda_away"] = best["lambda_away"] / ratio
best["source"] = "live_score_markets"
else:
best["source"] = "pre_match_score_markets"
return best
Vor dem Spiel ist dieser λ nur eine anfängliche Kalibrierung. Da das Spiel noch nicht begonnen hat und es keinen Live-Pfad gibt, der aktualisiert werden kann, ist der Spielstand standardmäßig 0:0, und die verbleibende Zeit beträgt 90 Minuten. In dieser Phase verwenden wir ihn als Einstiegsfilter:
text
Modellabdeckungswahrscheinlichkeit = P(Sieg Zielmannschaft) + P(0:0) + P(0:1)
Dann lautet die Bedingung:
text
Modellabdeckungswahrscheinlichkeit - Marktkosten >= Sicherheitsmarge
Nur wenn der Marktpreis günstig genug ist und das Modell einen leichten Vorteil für diesen Korb sieht, wird eine Eröffnungsposition zugelassen.
Wirklich interessant wird es nach Spielbeginn.
Sobald das Spiel läuft, ist das Poisson-Modell nicht mehr statisch. Angenommen, das Spiel ist in der 30. Minute, der aktuelle Spielstand ist immer noch 0:0, dann beträgt die verbleibende Zeit nur noch 60 Minuten, und die zukünftige Torintensität muss proportional zur verbleibenden Zeit skaliert werden:
text
λ_home_verbleibend = λ_home × (90 - t) / 90
λ_away_verbleibend = λ_away × (90 - t) / 90
Wenn der aktuelle Spielstand bereits 1:0 ist, können 0:0 und 0:1 nicht mehr eintreten. In diesem Fall muss das Modell vom aktuellen Spielstand ausgehen und nur noch berechnen, wie viele Tore in der verbleibenden Zeit fallen. Nur Ergebnisse wie 2:0, 2:1, 3:0, 1:1, die noch möglich sind, qualifizieren sich für die neue Schätzung.
Das ist der Kern des Live-Poisson-Updates: Nicht mechanisch jede Minute den Vorhersage-λ verkleinern, sondern basierend auf dem aktuellen Spielstand, der verbleibenden Zeit und den immer noch möglichen genauen Ergebnismärkten neu schätzen, wie sich das Spiel noch entwickeln könnte.
Die endgültige Strategie wird zu einer dreistufigen Prüfung.
Die erste Stufe sind die Marktkosten:
text
win_ask + 0:0_ask + 0:1_ask <= maximal zulässige Kosten
Die zweite Stufe ist der Poisson-Filter:
text
Modellabdeckungswahrscheinlichkeit - Marktkosten >= Sicherheitsmarge
Die dritte Stufe ist die Pfadkonvergenz:
text
Aktueller Bid-Wert des Portfolios >= Anfangskosten + Zielgewinn
Nur wenn die erste und zweite Stufe gleichzeitig erfüllt sind, wird ein Einstieg in Betracht gezogen. Nach dem Einstieg verlassen wir uns nicht mehr auf das Modell, um das Endergebnis zu phantasieren, sondern nutzen den echten Markt-Bid, um zu entscheiden, ob eine Position glattgestellt werden kann. Das Modell verbessert die Einstiegsqualität, der Markt entscheidet über die Realisierung der Gewinne.
Die Kontraktsuche wird ebenfalls so einfach wie möglich gehalten. Der Polymarket-Weltmeisterschafts-Slug ist sehr systematisch. Zum Beispiel lautet der Event-Slug für ein Spiel:
python
EVENT_SLUG = "fifwc-aut-jor-2026-06-17"
Wenn wir auf einen Sieg von Jordanien setzen, lautet das Suffix für den Sieg-Kontrakt:
python
WIN_SUFFIX = "jor"
Dann können die drei benötigten Kontrakte direkt zusammengesetzt werden:
python
def yes_symbol(slug):
return slug + "_USDC.Yes"
def build_legs():
legs = [
{
"name": "win",
"slug": EVENT_SLUG + "-" + WIN_SUFFIX,
"symbol": yes_symbol(EVENT_SLUG + "-" + WIN_SUFFIX),
"kind": "win",
}
]
for score in parse_scores(PROTECT_SCORES):
legs.append(
{
"name": "score_" + score.replace("-", "_"),
"slug": EVENT_SLUG + "-exact-score-" + score,
"symbol": yes_symbol(EVENT_SLUG + "-exact-score-" + score),
"kind": "score",
"score": score,
}
)
return legs
Hierbei sollte man möglichst vermeiden, mit Teamnamen unscharf zu suchen. Wenn man z. B. Jordan sucht, findet man schnell Michael B. Jordan, Jordan Pickford oder Jordan Spieth – und schon sitzt die Fußballstrategie mit einem Tisch aus Unterhaltungsbranche, englischem Torwart und Golfsport zusammen. Mit dem Event-Slug die Kontrakte zusammenzubauen, ist viel sauberer.
Während des Spiels wird auch ein Live-Spielstand benötigt. In der ersten Version kann dieser direkt aus dem Polymarket-Gamma-Event abgerufen werden:
python
def get_event_state():
data = get_json(GAMMA_BASE + "/events", slug=EVENT_SLUG)
e = data[0]
return {
"title": e.get("title"),
"score": e.get("score"),
"score_tuple": parse_score(e.get("score")),
"elapsed": e.get("elapsed"),
"period": e.get("period"),
"live": bool(e.get("live")),
"ended": bool(e.get("ended")),
"start_time": e.get("startTime"),
}
Kombinieren des aktuell verkaufbaren Werts mit echtem Markt-Bid:
python
def basket_bid_value(legs, quotes):
total = 0.0
for leg in legs:
pos = positions.get(leg["name"], {})
amount = float(pos.get("amount", 0))
if amount <= 0:
continue
q = quotes.get(leg["name"])
if not q or q["bid"] is None:
continue
total += amount * q["bid"]
return total
Take-Profit-Entscheidung:
python
cost = current_position_cost()
value = basket_bid_value(legs, quotes)
target = cost + TARGET_PROFIT * SHARES
if value >= target:
close_all()
Dies ist die minimale Version. Sie gibt nicht vor, das Problem der Fußballvorhersage bereits gelöst zu haben, noch behauptet sie, stabile Arbitrage zu ermöglichen. Sie versucht lediglich, die Grauzone zwischen „Arbitrage“ und „Vorhersage“ zu untersuchen.
Das Schöne an der Arbitrage ist ihre Bestimmtheit, aber Bestimmtheit ist selten. Der Reiz der Vorhersage liegt im großen Spielraum, aber auch in der großen Zufälligkeit. Diese Strategie verwendet die vom Markt gegebenen Vorhersagepreise als Material, nutzt eine Hauptentscheidung mit hoher Wahrscheinlichkeit, ergänzt durch zwei Schutzpfade mit niedriger Wahrscheinlichkeit, und filtert grob mit einem Poisson-Modell. Ziel ist es, ein Fenster zu konstruieren, das während des Spiels vorzeitig konvergieren kann.
Die Risiken müssen klar benannt werden. Dieses Portfolio ist kein vollständiges Ereignis, keine risikofreie Arbitrage. Es eignet sich für Spiele mit großem Stärkeunterschied, klarem Hauptpfad und ausreichend niedrigen Preisen für die Schutzpfade. Wenn das Spiel selbst ausgeglichen ist (50:50) oder die Schutzpfade bereits teuer sind, ist eine erzwungene Durchführung sinnlos. Noch problematischer ist, dass es nicht alle ungünstigen Pfade abdeckt – wie 1:1, 0:2, 2:2 – die alle zu deutlichen Verlusten führen können. Daher müssen Positionslimits, maximaler Verlust und Stop-Loss-Regeln festgelegt werden. Man darf die Strategie nicht allein deshalb als Arbitrage betrachten, weil sie „wie Arbitrage aussieht“.
Das Poisson-Modell ist auch kein Zaubermittel. Es ist nur eine sehr einfache mathematische Grundlage, um von „Ich glaube, dieser Preis ist gut“ einen Schritt weiterzugehen zu „Zumindest habe ich diesen Preis mit einem transparenten Modell überprüft“. Es kann falsch liegen, der Markt kann falsch liegen, und wir selbst können noch mehr falsch liegen. Der ehrlichste Teil des Handels besteht wahrscheinlich darin, zuzugeben, dass all dies falsch sein kann, und dann dafür zu sorgen, dass ein Fehler nicht gleich den ganzen Tisch umwirft.
Dieser Versuch ist sehr oberflächlich. Er ist eher eine Frage: Wenn die reinen Arbitragemöglichkeiten immer seltener werden und reine Vorhersagen zu schwierig sind, können wir dann die vom Markt bereits gegebenen Wahrscheinlichkeiten nutzen, um strukturiertere Trades zu konstruieren? Nicht die Illusion, Risiken zu eliminieren, sondern die Risiken aufzuteilen und klar zu erkennen, aus welchen Richtungen sie kommen.
Vielleicht ist das nicht die Antwort, aber es ist ein kleines Loch, das es wert ist, weiter gegraben zu werden. Die Vorhersage sagt uns, welcher Hauptweg wahrscheinlich breiter ist, die Arbitrage-Idee erinnert uns daran, nicht nur auf die Richtung, sondern auch auf die Portfolio-Struktur zu achten. Dazwischen gibt es vielleicht noch viel Raum zur Erkundung.
Strategie-Quellcode: Polymarket Fußball-Pfad-Konvergenzstrategie
- 1




