Offengelegt

Methodik

Zwei Modelle rechnen unabhängig voneinander. Beide Ergebnisse werden angezeigt, auch wenn sie sich widersprechen. Alle Parameter sind unten aufgeführt, inklusive der Frage, woher ihr Wert kommt.

Das Wichtigste zuerst Eine Aufstiegswahrscheinlichkeit lässt sich nicht allein aus historischen Punktzahlen berechnen. Historische Schwellen sagen, wie viele Punkte früher reichten – sie wissen nichts über die konkrete Konkurrenz dieser Saison. Deshalb gibt es Modell B, das die verbleibenden Spiele tatsächlich simuliert. Die historischen Daten sind die Einordnung, nicht die Rechnung.

Datenquelle

Alle Daten kommen von OpenLigaDB (api.openligadb.de), einer offenen, kostenlosen Schnittstelle ohne Zugangsschlüssel. Kein Scraping: Spiele, Ergebnisse und Tabellen werden als JSON geliefert.

Die abgeschlossenen Saisons werden einmal geholt und als Datei gespeichert – sie ändern sich nicht mehr. Nur die laufende Saison wird einmal täglich neu abgerufen. Besucher der Seite lösen keinen Abruf aus; sie sehen den gespeicherten Stand.

Hin- und Rückrundenpunkte sind nicht aus einer fertigen Statistik übernommen, sondern aus den Einzelspielen berechnet. Das DFB-Datencenter dient damit als Gegenprobe, nicht als Quelle.

Datenlage: was fehlt

Die Rekonstruktion wurde gegen die offizielle Tabelle jeder Saison geprüft (scripts/validate.ts). Dabei traten echte Lücken zutage:

  • 2022/23: OpenLigaDB liefert nur 211 von 380 Partien und keine Abschlusstabelle. Saison vollständig ausgeschlossen.
  • 2021/22: 6 Partien fehlen – auch in der offiziellen OpenLigaDB-Tabelle, lassen sich dort also nicht ausgleichen. Einzelne Teams haben ein bis zwei Punkte zu wenig.
  • Für Endplatzierungen wird immer die offizielle Tabelle verwendet, nicht die eigene Rechnung: Über den Aufstieg entscheidet der Tabellenplatz, der muss stimmen. In Saison 2024/25 hätte die Rekonstruktion Hansa Rostock drei Punkte zu wenig gegeben.
  • Verwendet werden 10 Saisons: 2015/16 bis 2025/26.

Modell A – historische Basisrate

Für jede der 10 Saisons wird der Tabellenstand nach jedem Spieltag aus den Einzelspielen rekonstruiert. Dann lautet die Frage:

Alle Teams, die nach gleich vielen Spielen eine ähnliche Punktquote hatten wie der MSV Duisburg heute – wie viele davon sind am Ende aufgestiegen?

Gerechnet wird mit Punkten pro Spiel, nicht mit absoluten Punkten, damit Nachholspiele das Bild nicht verzerren. Zweite Mannschaften werden als Vergleichsfälle ausgeschlossen – sie können nicht aufsteigen.

Die Unsicherheit wird als Wilson-Intervall angegeben. Bei typischerweise 15 bis 40 Vergleichsfällen ist dieses Intervall breit, und das ist korrekt: Mehr Genauigkeit gibt die Datenlage nicht her. Ein starker Saisonstart ist selten, deshalb wird das Vergleichsfenster automatisch geweitet, bis genug Fälle zusammenkommen; die verwendete Breite steht auf der Startseite.

Grenze des Modells: Es kennt die Gegner dieser Saison nicht. Ob der Zweite drei oder fünfzehn Punkte zurückliegt, macht für Modell A keinen Unterschied.

Modell B – Monte-Carlo-Simulation

Jedes Team erhält einen Angriffs- und einen Abwehrwert, dazu kommt ein ligaweiter Heimvorteil. Die erwarteten Tore einer Partie sind

λ_heim = exp(μ + angriff_heim − abwehr_gast + heimvorteil)
λ_gast = exp(μ + angriff_gast − abwehr_heim)

Die Werte werden per Maximum-Likelihood auf den tatsächlichen Ergebnissen geschätzt. Anschließend werden die 10.000 restlichen Saisonverläufe als Poisson-Ziehungen ausgewürfelt, die Tabelle fertiggerechnet und ausgezählt, wie oft welches Team wo landet.

Drei Dinge sind dabei entscheidend und waren im ersten Entwurf falsch:

  • Unsicherheit der Schätzung. Die Stärken aus acht Spielen sind keine Wahrheit. Das Modell wird 40 Mal auf zufällig umgewichteten Daten neu geschätzt (Bayes-Bootstrap); jede Schätzung tritt in einem Teil der Simulationen an.
  • Rückkehr zum Mittelwert. Ein Team, das acht Spiele stark war, ist in den folgenden dreißig näher am Ligadurchschnitt als seine Messwerte. Die gemessenen Stärken werden deshalb mit 0.3 multipliziert.
  • Formdrift. Über dreißig Spieltage ändern sich Kader und Form. Jeder Durchlauf verschiebt die Stärken zusätzlich zufällig.

Ohne diese drei Korrekturen war das Modell massiv zu selbstsicher: Prognosen über 80 % traten im Backtest in keinem einzigen Fall ein.

Aufstiegsregeln, korrekt abgebildet

  • Platz 1 und 2 steigen direkt auf. Platz 3 spielt Relegation gegen den 16. der 2. Bundesliga.
  • Zweite Mannschaften sind nicht aufstiegsberechtigt. Landet eine U23 in den Top 3, rückt der Aufstiegsplatz an das nächste berechtigte Team. Das ist kein Randfall: 2019/20 wurde Bayern München II Meister der 3. Liga.
  • Die Relegation wird mit der historischen Quote gewichtet: Der Drittligist hat 12 von 17 Duellen seit 2008/09 gewonnen, also 71 %. Platz 3 ist damit deutlich mehr wert als ein Münzwurf. Die Stichprobe ist klein, das Intervall wird mitgeführt.
  • Sortierkriterien: Punkte, Tordifferenz, erzielte Tore. Bleibt es gleich, entscheidet offiziell der direkte Vergleich – in der Simulation wird gewürfelt, damit kein Team systematisch bevorteilt wird.

Gütenachweis: Backtest

Das Modell rechnet für jede der zehn Saisons so, wie es damals gerechnet hätte – nur mit den Spielen, die zu diesem Zeitpunkt bekannt waren, und mit der Zeitgewichtung auf den damaligen Stichtag gesetzt. Danach wird mit dem tatsächlichen Ausgang verglichen. Das sind 200 Team-Prognosen.

Gemessen wird nicht „lag der Favorit richtig“ – das ist bei zwei Aufstiegsplätzen und zwanzig Teams zu stark vom Zufall bestimmt. Gemessen wird der Brier-Skill: Um wie viel schlägt das Modell die blanke Grundrate, die jedem Team immer 10 % gibt? 0 % hieße: nutzlos.

ParameterWertBegründung
Nach 8 Spieltagen13 %Brier-Skill gegenüber der Grundrate. Log-Score 0.272.
Nach 20 Spieltagen25 %Zur Winterpause ist deutlich mehr entschieden. Log-Score 0.223.

Die Kalibrierung wurde in Gruppen geprüft: Prognosen um 20 % traten in etwa 25 % der Fälle ein, Prognosen unter 5 % in etwa 3 %. Das Modell ist damit nicht mehr systematisch überzeugt von sich selbst. Nachrechnen: npx tsx scripts/calibrate.ts.

Der lehrreichste Einzelfall: Am 8. Spieltag der Saison 2025/26 gab dasselbe Modell dem MSV Duisburg 55 % – aufgestiegen sind VfL Osnabrück und Energie Cottbus.

Alle Parameter

ParameterWertBegründung
Simulationen10.000Genug, damit die Prozentzahlen stabil sind. Fester Startwert des Zufallsgenerators, damit dieselben Daten dieselbe Prognose ergeben.
Ridge-Stärke19Gemessen, nicht geraten: Die Streuung der Teamstärken über zehn vollständige Saisons beträgt σ = 0,161 in log-Toren, daraus folgt 1/(2σ²) ≈ 19. Skript: measure-spread.ts
Rückkehr zum Mittelwert0.3Aus dem Backtest. Am 8. und am 20. Spieltag liegt das Optimum zwischen 0,2 und 0,35; gewählt ist die Mitte dieses flachen Bereichs, nicht der exakte Bestwert — sonst wäre der Wert auf 200 Prognosen überfittet.
Formdrift0.1Streuung der Stärkeänderung je Team über die Restsaison, in log-Toren. Etwa 10 % Abweichung in der Torerwartung.
Bootstrap-Schätzungen40Anzahl der Neuschätzungen auf umgewichteten Daten, um die Unsicherheit der Stärkeschätzung weiterzugeben.
Halbwertszeit Form270 TageEin so altes Spiel zählt bei der Stärkeschätzung halb so viel. Dadurch dominiert die laufende Saison, die Vorsaison stabilisiert.
Vergleichsfenster (Modell A)± 0.25 bis ± 0.55Punkte pro Spiel. Wird geweitet, bis mindestens 15 Vergleichsfälle vorliegen.
Relegations-Quote71 %Empirisch: 12 von 17 Duellen seit 2008/09 gingen an den Drittligisten.

Was das Modell nicht kann

  • Es kennt keine Kaderinformationen: keine Verletzten, keine Sperren, keine Transfers, keine Trainerwechsel. Solche Veränderungen gehen nur pauschal über die Formdrift ein.
  • Es kennt keine Spielanteile jenseits von Toren – keine erwarteten Tore (xG), keine Chancenqualität. Ein Team, das viele Chancen vergibt, wird unterschätzt.
  • Es modelliert keine Abhängigkeit zwischen Partien eines Spieltags und keine Effekte wie Belastung durch Pokalspiele.
  • Die Kalibrierung ruht auf 200 Prognosen aus zehn Saisons. Das reicht, um grobe Fehlkalibrierung zu erkennen, aber nicht, um Parameter fein zu bestimmen.
  • Punkt-Abzüge durch Lizenzauflagen oder Insolvenzen werden nicht vorweggenommen – sie erscheinen erst, wenn sie in der Tabelle stehen.

Selbst nachrechnen

Alle Prüfungen laufen als Skripte im Projekt:

ParameterWertBegründung
npm run backfilleinmaligHolt die abgeschlossenen Saisons und legt sie als JSON ab.
npx tsx scripts/validate.tsDatenprüfungVergleicht die aus Einzelspielen gerechnete Tabelle mit der offiziellen. Findet fehlende Partien.
npm testPlausibilitätPrüft Torschnitt, Heimvorteil und ob die Summe der Aufstiegswahrscheinlichkeiten den Plätzen entspricht.
npx tsx scripts/calibrate.tsBacktestRechnet die Historie durch und misst Brier-Skill, Log-Score und Kalibrierung. Mit --sweep werden Parameter durchprobiert.
npx tsx scripts/measure-spread.tsMessungMisst die tatsächliche Streuung der Teamstärken, aus der die Ridge-Stärke folgt.

Zurück zur Prognose