On the wire · 14:57:19 UTC Live 117 · Prematch 8,509 · Markets 34,172 Vol. I · No. 1 · Monday 9 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Guía · CLV

Mide tu valor de la línea de cierre frente al cierre de Pinnacle

Actualizado el · PinnFeed · 3 min de lectura

El valor de la línea de cierre (CLV) compara el precio que cogiste con el último precio del mercado antes del inicio. Batir de forma constante la cuota justa de cierre de Pinnacle es la señal temprana más sólida de que tu proceso tiene ventaja, mucho antes de que tus pérdidas y ganancias puedan demostrarlo, aunque nunca es una garantía de beneficio. PinnFeed guarda el precio de cierre de Pinnacle de cada mercado cuando empieza el evento y lo sirve desde /v1/closing.

Paso 1 — La fórmula#

CLV = price_taken / closing_fair_price − 1

Usa el precio de cierre sin margen, no el bruto: batir un precio que aún contiene el margen de Pinnacle es más fácil y exagera tu ventaja. Si cogiste 2.10 y el mercado cerró a una cuota justa de 1.95, tu CLV es +7,7%.

Paso 2 — Registra cada apuesta#

Cada apuesta necesita el id del evento, la clave del mercado y el resultado. Los tres salen de la API: el id del evento, la key del mercado (s;0;m es el ganador del partido completo, s;0;ou;2.5 el total 2.5 del partido) y el name del resultado (home, away, draw, over, under).

Paso 3 — Ejecuta el tracker#

Instala requests, guarda el script como clv.py y registra las apuestas a medida que las haces:

# clv.py: registra tus apuestas y mide el valor de la línea de cierre (CLV) frente al cierre sin margen de Pinnacle.
# pip install requests   Uso:
#   python clv.py bet <event_id> <market_key> <outcome> <price>   p. ej. 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                      # aún sin cierre (o 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%

Lanza report desde cron después de los inicios; el precio de cierre de cada apuesta se pide una vez y se guarda.

Paso 4 — Interpreta el resultado#

  • Sobre unos cientos de apuestas, un CLV medio de +2% o más es un indicio fuerte de una ventaja real.
  • CLV negativo con beneficio positivo suele ser suerte. Lo normal es que se diluya.
  • Separa el CLV por deporte, mercado y antelación de la apuesta: te dice de dónde sale de verdad tu ventaja.

Paso 5 — Descarga un día entero#

Para investigación o backtests, pide todas las líneas de cierre de un día UTC:

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

Preguntas frecuentes#

¿Qué plan incluye las cuotas de cierre?#

El historial de cuotas de cierre está incluido desde Builder (99 €/mes) y en Pro y Enterprise.

¿Cuándo se captura el precio de cierre?#

Cuando empieza el evento: se guarda el último precio prepartido de cada mercado con la hora de captura.

¿Hasta cuándo llega el archivo?#

Empieza el día en que se lanzó el servicio y crece cada día. Los planes Enterprise pueden exportarlo en bloque en CSV o Parquet.

El plan WebSocket: Builder, 99 €/mes.

Cuotas de Pinnacle en tiempo real por un único WebSocket: los 13 deportes, todos los mercados, cuotas justas sin margen y cuotas de cierre. 3 días gratis y cancelas 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.