Mesurez votre closing line value face à la clôture de Pinnacle
Le closing line value (CLV) compare le prix que vous avez pris au dernier prix du marché avant le coup d'envoi. Battre régulièrement la cote juste de clôture de Pinnacle est le signal précoce le plus solide que votre méthode a un avantage, bien avant que vos gains et pertes puissent le montrer, même si ce n'est jamais une garantie de profit. PinnFeed enregistre la cote de clôture de Pinnacle de chaque marché au début de l'événement et la sert via /v1/closing.
Étape 1 — La formule#
CLV = price_taken / closing_fair_price − 1
Utilisez la cote de clôture sans marge, pas la cote brute : battre un prix qui contient encore la marge de Pinnacle est plus facile et exagère votre avantage. Si vous avez pris 2.10 et que le marché a clôturé à une cote juste de 1.95, votre CLV est de +7,7 %.
Étape 2 — Enregistrez chaque pari#
Chaque pari a besoin de l'id de l'événement, de la clé du marché et de l'issue. Les trois viennent de l'API : l'id de l'événement, la key du marché (s;0;m est le vainqueur du match complet, s;0;ou;2.5 le total 2.5 du match) et le name de l'issue (home, away, draw, over, under).
Étape 3 — Lancez le tracker#
Installez requests, enregistrez le script sous clv.py et enregistrez vos paris au fur et à mesure :
# clv.py : enregistre vos paris et mesure le closing line value (CLV) par rapport à la clôture sans marge de Pinnacle.
# pip install requests Utilisation :
# python clv.py bet <event_id> <market_key> <outcome> <price> ex. 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 # pas encore clôturé (ou jamais capturé)
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%
Lancez report via cron après les coups d'envoi ; la cote de clôture de chaque pari est demandée une seule fois puis conservée.
Étape 4 — Interprétez le résultat#
- Sur quelques centaines de paris, un CLV moyen de +2 % ou plus est un indice fort d'un avantage réel.
- Un CLV négatif avec un bénéfice positif relève généralement de la chance, qui tend à s'estomper.
- Ventilez le CLV par sport, marché et délai avant le match : vous verrez d'où vient vraiment votre avantage.
Étape 5 — Téléchargez une journée entière#
Pour la recherche ou les backtests, demandez toutes les cotes de clôture d'un jour UTC :
curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/closing?date=2026-11-08&sport=soccer&main=true"
Questions fréquentes#
Quel plan inclut les cotes de clôture ?#
L'historique des cotes de clôture est inclus à partir de Builder (99 €/mois), ainsi que dans Pro et Enterprise.
Quand la cote de clôture est-elle capturée ?#
Au début de l'événement : le dernier prix avant-match de chaque marché est enregistré avec l'heure de capture.
Jusqu'où remonte l'archive ?#
Elle commence au lancement du service et s'enrichit chaque jour. Les plans Enterprise peuvent l'exporter en bloc au format CSV ou Parquet.