Meça seu closing line value contra o fechamento da Pinnacle
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.