On the wire · 14:57:11 UTC Live 119 · Prematch 8,510 · Markets 34,183 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Guida · CLV

Misura il tuo closing line value rispetto alla chiusura di Pinnacle

Aggiornato il · PinnFeed · 3 min di lettura

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.

Il piano WebSocket: Builder, 99 €/mese.

Quote Pinnacle in tempo reale su un unico WebSocket: tutti i 13 sport, tutti i mercati, quote eque senza margine e quote di chiusura. 3 giorni gratis, disdici con un clic.

Form K-1 · Free API key

Get your free API key.

No password. We email you a link; click it and your key is on screen.

One free key per email. Link valid for 20 minutes.