On the wire · 16:01:49 UTC Live 126 · Prematch 8,738 · Markets 36,236 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Guide · CLV

Mesurez votre closing line value face à la clôture de Pinnacle

Mis à jour le · PinnFeed · 3 min de lecture

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.

Le plan WebSocket : Builder, 99 €/mois.

Les cotes Pinnacle en temps réel sur un seul WebSocket : les 13 sports, tous les marchés, cotes justes sans marge et cotes de clôture. 3 jours gratuits, résiliable en 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.