Misura il tuo closing line value rispetto alla chiusura di Pinnacle
Il closing line value (CLV) confronta il prezzo che hai preso con l'ultimo prezzo del mercato prima del calcio d'inizio. Battere con costanza la quota equa di chiusura di Pinnacle è il segnale precoce più solido che il tuo metodo ha un vantaggio, molto prima che il tuo bilancio possa dimostrarlo, anche se non è mai una garanzia di guadagno. PinnFeed salva il prezzo di chiusura di Pinnacle di ogni mercato quando inizia l'evento e lo serve da /v1/closing.
Passo 1 — La formula#
CLV = price_taken / closing_fair_price − 1
Usa il prezzo di chiusura senza margine, non quello grezzo: battere un prezzo che contiene ancora il margine di Pinnacle è più facile e gonfia il tuo vantaggio. Se hai preso 2.10 e il mercato ha chiuso a una quota equa di 1.95, il tuo CLV è +7,7%.
Passo 2 — Registra ogni scommessa#
Ogni scommessa richiede l'id dell'evento, la chiave del mercato e l'esito. Arrivano tutti e tre dall'API: l'id dell'evento, la key del mercato (s;0;m è il testa a testa della partita intera, s;0;ou;2.5 l'over/under 2,5 della partita) e il name dell'esito (home, away, draw, over, under).
Passo 3 — Esegui il tracker#
Installa requests, salva lo script come clv.py e registra le scommesse man mano che le fai:
# clv.py: registra le tue scommesse e misura il closing line value (CLV) rispetto alla chiusura senza margine di Pinnacle.
# pip install requests Uso:
# python clv.py bet <event_id> <market_key> <outcome> <price> es. 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 # non ancora chiuso (o mai acquisito)
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%
Lancia report da cron dopo i calci d'inizio; il prezzo di chiusura di ogni scommessa viene richiesto una volta e salvato.
Passo 4 — Interpreta il risultato#
- Su qualche centinaio di scommesse, un CLV medio di +2% o più è un indizio forte di un vantaggio reale.
- CLV negativo con profitto positivo di solito è fortuna. Tende a svanire.
- Dividi il CLV per sport, mercato e anticipo della giocata: ti dice da dove viene davvero il tuo vantaggio.
Passo 5 — Scarica una giornata intera#
Per ricerca o backtest, chiedi tutte le linee di chiusura di un giorno UTC:
curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/closing?date=2026-11-08&sport=soccer&main=true"
Domande frequenti#
Quale piano include le quote di chiusura?#
Lo storico delle quote di chiusura è incluso da Builder (99 €/mese) e in Pro ed Enterprise.
Quando viene acquisito il prezzo di chiusura?#
All'inizio dell'evento: per ogni mercato si salva l'ultimo prezzo pre-match con l'ora di acquisizione.
Fin dove arriva l'archivio?#
Parte dal giorno di lancio del servizio e cresce ogni giorno. I piani Enterprise possono esportarlo in blocco in CSV o Parquet.