On the wire · 05:07:44 UTC Live 585 · Prematch 14,345 · Markets 57,130 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Resposta · Arbitragem

Calculadora de arbitragem com odds da Pinnacle

Atualizado em · PinnFeed · 2 min de leitura

Resposta: existe arbitragem quando os melhores preços de todos os resultados de um mercado, somando várias casas, têm probabilidades implícitas que somam menos de 1: 1/p1 + 1/p2 (+ 1/p3) < 1. Divida o stake de cada resultado na proporção de 1/preço para garantir o mesmo retorno. O PinnFeed fornece o lado da Pinnacle em tempo real (Builder) ou por REST; os preços da outra casa vêm da sua própria fonte, já que o PinnFeed traz só a Pinnacle.

Fórmula e divisão do stake#

def arb(prices: list[float], bankroll: float = 100):
    inv = [1 / p for p in prices]
    total = sum(inv)
    if total >= 1:
        return None                         # no arbitrage
    stakes = [bankroll * i / total for i in inv]
    return {"margin": 1 - total, "stakes": [round(s, 2) for s in stakes],
            "return": round(bankroll / total, 2)}

print(arb([2.12, 2.02]))   # Pinnacle over 2.12, other book under 2.02 -> small arb

Com 2,12 e 2,02 a soma implícita é 0,9668, então uma banca de 100 retorna cerca de 103,44 seja qual for o lado vencedor, antes de taxas e desde que as duas apostas fiquem de pé.

Loop de alertas (lado Pinnacle via PinnFeed)#

import os, time, requests
KEY = os.environ["PINNFEED_KEY"]  # ps_live_...

def other_book_prices(event):        # plug in your own source here
    return {}

while True:
    r = requests.get("https://pinnfeed.io/v1/odds",
        params={"sport": "tennis", "market": "moneyline", "main": "true", "limit": 100},
        headers={"x-api-key": KEY}, timeout=10)
    for e in r.json()["events"]:
        for m in e["markets"]:
            if (m["maxStake"] or 0) < 100:
                continue
            pin = {o["name"]: o["decimal"] for o in m["outcomes"]}
            other = other_book_prices(e)          # {"home": 1.9, "away": 2.2}
            if set(pin) == set(other) and pin:
                best = [max(pin[k], other[k]) for k in pin]
                res = arb(best)
                if res:
                    print(e["home"], "v", e["away"], res)
    time.sleep(5)                                  # Hobby allows 2 req/s

Riscos antes de apostar#

  • Os preços mudam entre as duas apostas; você pode perder uma das pernas.
  • As casas podem anular erros evidentes ou limitar contas de arbitragem.
  • As regras variam (desistências no tênis, prorrogação, empates); uma arbitragem "garantida" pode perder se a liquidação for diferente.
  • Compare com o value betting, que costuma escalar melhor: arbitragem vs value betting.

Planos#

O Free tem 30 s de atraso, lento demais para arbitragem a não ser em testes. O Hobby (€29/mês) é REST em tempo real; o Builder (€99/mês) envia as mudanças da Pinnacle pelo WebSocket. Teste de 3 dias; o cartão é obrigatório e a cobrança ocorre após o dia 3, a menos que você cancele.

Conteúdo educativo para maiores de 18 anos. A arbitragem tem risco de execução e de liquidação; nada aqui promete lucro. No Brasil, aposte apenas em operadores autorizados pela SPA/MF.

Perguntas frequentes#

Dá para achar arbitragem só com o PinnFeed?#

Não. A arbitragem precisa de pelo menos duas casas; o PinnFeed traz só a Pinnacle.

O maxStake importa na arbitragem?#

Sim. Ele limita quanto a Pinnacle aceita naquele preço, e com isso a perna da Pinnacle.

Devo contar as taxas?#

Sim. A comissão de uma exchange ou as taxas de pagamento podem acabar com uma margem de arbitragem pequena.

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.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

One free key per email. Link valid for 20 minutes.