On the wire · 14:57:35 UTC Live 125 · Prematch 8,516 · Markets 34,152 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Guia · CLV

Meça seu closing line value contra o fechamento da Pinnacle

Atualizado em · PinnFeed · 3 min de leitura

O closing line value (CLV) compara o preço que você pegou com o último preço do mercado antes do início. Bater com consistência a odd justa de fechamento da Pinnacle é o sinal precoce mais sólido de que seu processo tem vantagem, muito antes de o lucro ou prejuízo conseguir provar algo, mas nunca é garantia de lucro. A PinnFeed guarda o preço de fechamento da Pinnacle de cada mercado quando o evento começa e serve em /v1/closing.

Passo 1 — A fórmula#

CLV = price_taken / closing_fair_price − 1

Use o preço de fechamento sem margem, não o bruto: bater um preço que ainda tem a margem da Pinnacle é mais fácil e exagera sua vantagem. Se você pegou 2.10 e o mercado fechou numa odd justa de 1.95, seu CLV é +7,7%.

Passo 2 — Registre cada aposta#

Cada aposta precisa do id do evento, da chave do mercado e do resultado. Os três vêm da API: o id do evento, a key do mercado (s;0;m é o moneyline do jogo inteiro, s;0;ou;2.5 o total 2.5 do jogo) e o name do resultado (home, away, draw, over, under).

Passo 3 — Rode o tracker#

Instale requests, salve o script como clv.py e registre as apostas conforme faz:

# clv.py: registra suas apostas e mede o closing line value (CLV) contra o fechamento sem margem da Pinnacle.
# pip install requests   Uso:
#   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                      # ainda sem fechamento (ou nunca capturado)
    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%

Rode report pelo cron depois dos inícios; o preço de fechamento de cada aposta é buscado uma vez e guardado.

Passo 4 — Interprete o resultado#

  • Em algumas centenas de apostas, um CLV médio de +2% ou mais é um indício forte de vantagem real.
  • CLV negativo com lucro positivo normalmente é sorte. O esperado é que passe.
  • Separe o CLV por esporte, mercado e antecedência da aposta: isso mostra de onde vem de verdade a sua vantagem.

Passo 5 — Baixe um dia inteiro#

Para pesquisa ou backtests, busque todas as linhas de fechamento de um dia UTC:

curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/closing?date=2026-11-08&sport=soccer&main=true"

Perguntas frequentes#

Qual plano inclui as odds de fechamento?#

O histórico de odds de fechamento está incluído a partir do Builder (€99/mês) e no Pro e no Enterprise.

Quando o preço de fechamento é capturado?#

Quando o evento começa: o último preço pré-jogo de cada mercado é guardado com o horário da captura.

Até quando vai o arquivo?#

Começa no dia em que o serviço foi lançado e cresce todo dia. Os planos Enterprise podem exportar tudo em CSV ou Parquet.

O plano WebSocket: Builder, €99/mês.

Odds da Pinnacle em tempo real por um único WebSocket: os 13 esportes, todos os mercados, odds justas sem margem e odds de fechamento. 3 dias grátis, cancele com um clique.

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.