Deinen Closing Line Value gegen Pinnacles Schlussquote messen
Der Closing Line Value (CLV) vergleicht den Preis, den du bekommen hast, mit dem letzten Marktpreis vor dem Anpfiff. Pinnacles faire Schlussquote regelmäßig zu schlagen ist das stärkste frühe Signal, dass dein Prozess einen Vorteil hat, lange bevor deine Gewinn- und Verlustrechnung das zeigen kann, aber nie eine Gewinngarantie. PinnFeed speichert Pinnacles Schlussquote für jeden Markt beim Eventstart und liefert sie über /v1/closing.
Schritt 1 — Die Formel#
CLV = price_taken / closing_fair_price − 1
Nimm die Schlussquote ohne Marge, nicht die Rohquote: Einen Preis zu schlagen, der noch Pinnacles Marge enthält, ist leichter und übertreibt deinen Vorteil. Hast du 2.10 genommen und der Markt schloss bei einer fairen Quote von 1.95, liegt dein CLV bei +7,7 %.
Schritt 2 — Jede Wette protokollieren#
Jede Wette braucht Event-id, Marktschlüssel und Ausgang. Alle drei kommen aus der API: die id des Events, der key des Markts (s;0;m ist die Siegwette für das ganze Spiel, s;0;ou;2.5 Über/Unter 2,5 für das ganze Spiel) und der name des Ausgangs (home, away, draw, over, under).
Schritt 3 — Den Tracker ausführen#
Installiere requests, speichere das Skript als clv.py und protokolliere Wetten, sobald du sie platzierst:
# clv.py: protokolliert deine Wetten und misst den Closing Line Value (CLV) gegen Pinnacles Schlussquote ohne Marge.
# pip install requests Aufruf:
# python clv.py bet <event_id> <market_key> <outcome> <price> z. B. bet 1640141281 "s;0;m" home 2.10
# python clv.py report
import os, sqlite3, sys, requests
BASE = os.environ.get("PINNFEED_BASE", "https://pinnfeed.io")
KEY = os.environ["PINNFEED_KEY"]
db = sqlite3.connect(os.environ.get("CLV_DB", "bets.db"))
db.execute("CREATE TABLE IF NOT EXISTS bets (event_id INTEGER, market_key TEXT, outcome TEXT, price REAL, "
"close_fair REAL, placed_at TEXT DEFAULT CURRENT_TIMESTAMP)")
def closing_fair(event_id, market_key, outcome):
r = requests.get(f"{BASE}/v1/closing/{event_id}", headers={"x-api-key": KEY}, timeout=20)
if r.status_code == 404:
return None # noch keine Schlussquote (oder nie erfasst)
r.raise_for_status()
for rec in r.json()["markets"]:
if rec["market"]["key"] == market_key:
for o in rec["market"]["outcomes"]:
if o["name"] == outcome:
return o["fair"]
return None
if sys.argv[1:2] == ["bet"]:
_, _, event_id, market_key, outcome, price = sys.argv
db.execute("INSERT INTO bets (event_id, market_key, outcome, price) VALUES (?,?,?,?)",
(int(event_id), market_key, outcome, float(price)))
db.commit()
print("logged")
else:
rows = db.execute("SELECT rowid, event_id, market_key, outcome, price, close_fair FROM bets").fetchall()
clvs = []
for rowid, event_id, key, outcome, price, close in rows:
if close is None:
close = closing_fair(event_id, key, outcome)
if close:
db.execute("UPDATE bets SET close_fair=? WHERE rowid=?", (close, rowid))
if close:
clv = price / close - 1
clvs.append(clv)
print(f"{event_id} {key} {outcome}: took {price}, closed fair {close:.3f} -> CLV {clv:+.2%}")
else:
print(f"{event_id} {key} {outcome}: took {price}, waiting for close")
db.commit()
if clvs:
print(f"average CLV over {len(clvs)} bets: {sum(clvs) / len(clvs):+.2%}")
python clv.py bet 1640229582 "s;0;m" home 2.10
python clv.py report
1640229582 s;0;m home: took 2.1, closed fair 3.181 -> CLV -33.99%
999 s;0;m home: took 1.9, waiting for close
average CLV over 1 bets: -33.99%
Lass report nach den Anstoßzeiten per Cron laufen; die Schlussquote jeder Wette wird einmal abgefragt und gespeichert.
Schritt 4 — Das Ergebnis lesen#
- Über einige hundert Wetten ist ein durchschnittlicher CLV von +2 % oder mehr ein starkes Indiz für einen echten Vorteil.
- Negativer CLV bei positivem Gewinn ist meist Glück. Das verwässert sich in der Regel.
- Schlüssle den CLV nach Sportart, Markt und Vorlaufzeit auf: So siehst du, woher dein Vorteil wirklich kommt.
Schritt 5 — Einen ganzen Tag herunterladen#
Für Forschung oder Backtests ruf alle Schlusslinien eines UTC-Tages ab:
curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/closing?date=2026-11-08&sport=soccer&main=true"
Häufige Fragen#
Welcher Plan enthält die Schlussquoten?#
Die Historie der Schlussquoten ist ab Builder (99 €/Monat) sowie in Pro und Enterprise enthalten.
Wann wird die Schlussquote erfasst?#
Beim Eventstart: Für jeden Markt wird der letzte Pre-Match-Preis mit Erfassungszeit gespeichert.
Wie weit reicht das Archiv zurück?#
Es beginnt mit dem Starttag des Dienstes und wächst täglich. Enterprise-Pläne können es als CSV oder Parquet in großen Mengen exportieren.