Pular para o conteúdo
Data Science

Arbitragem em Apostas Esportivas: O que é

Arbitragem esportiva é apostar em todos os resultados possíveis em casas diferentes, garantindo lucro independente do resultado. A matemática é simples — o desafio é velocidade.

TL;DR

Arbitragem em Apostas Esportivas: O que é. Arbitragem esportiva é apostar em todos os resultados possíveis em casas diferentes, garantindo lucro independente do resultado. A matemática é simples — o desafio é velocidade.

O que é arbitragem esportiva

Arbitragem é um conceito que vem do mercado financeiro: explorar diferenças de preço do mesmo ativo em mercados distintos pra garantir lucro sem risco. No esporte, o 'ativo' é um resultado de um jogo e os 'mercados' são as casas de apostas.

Na prática funciona assim: você encontra um jogo onde Casa A paga 2.20 pra vitória do time X, e Casa B paga 2.30 pra vitória do time Y. Apostando os valores certos em cada casa, você garante lucro qualquer que seja o resultado. Isso existe porque as casas têm modelos diferentes, equipes de traders diferentes, e nem sempre concordam sobre as probabilidades.

O lucro por oportunidade costuma ser pequeno — tipicamente entre 1% e 5% do capital apostado. Mas com automação e volume, isso escala. Um apostador de arb profissional pode executar dezenas de oportunidades por dia em múltiplas casas e ligas.

Um ponto que confunde muita gente: arbitragem não é trapaça e não é ilegal. Você está simplesmente aproveitando preços inconsistentes entre casas diferentes. As casas respondem limitando contas de apostadores lucrativos, mas a prática em si é legítima.

A matemática por trás

Calculando se existe arbitragem

A fórmula é direta. Para um mercado de duas vias (por exemplo, tênis ou basquete sem empate), você calcula a soma dos inversos das melhores odds disponíveis em qualquer casa. Se essa soma é menor que 1, existe arbitragem.

Para três vias (futebol com empate possível), a fórmula é a mesma mas com três termos: 1/odd_home + 1/odd_draw + 1/odd_away. Se o resultado for menor que 1.0, você tem um arb. A diferença entre 1.0 e esse resultado é a margem de lucro garantida.

Calculando o stake ótimo em cada casa

O stake em cada resultado precisa ser proporcional ao inverso da odd daquele resultado, dividido pela soma total dos inversos. Isso garante que você recebe exatamente o mesmo valor monetário independente do resultado — que é a definição de arbitragem perfeita.

python
def verificar_arb_2vias(odd1, odd2):
    """Verifica arbitragem em mercado de 2 vias (tênis, basquete)"""
    soma_inversos = (1/odd1) + (1/odd2)
    if soma_inversos < 1.0:
        lucro_pct = (1 - soma_inversos) / soma_inversos * 100
        return True, lucro_pct
    return False, 0

def verificar_arb_3vias(odd_home, odd_draw, odd_away):
    """Verifica arbitragem em mercado de 3 vias (futebol)"""
    soma_inversos = (1/odd_home) + (1/odd_draw) + (1/odd_away)
    if soma_inversos < 1.0:
        lucro_pct = (1 - soma_inversos) / soma_inversos * 100
        return True, lucro_pct
    return False, 0

def calcular_stakes(odds, bankroll_total):
    """
    Calcula quanto apostar em cada resultado.
    odds: lista de odds para cada resultado (em casas diferentes)
    bankroll_total: capital total disponível para esse arb
    Retorna: stakes para cada resultado e lucro garantido
    """
    inversos = [1/o for o in odds]
    soma = sum(inversos)
    
    if soma >= 1.0:
        return None, 0  # Não é arb
    
    # Lucro garantido por unidade de capital total
    lucro_garantido = (1/soma - 1) * bankroll_total
    
    # Stake proporcional pra cada resultado
    stakes = []
    for inv in inversos:
        stake = (inv / soma) * bankroll_total
        stakes.append(round(stake, 2))
    
    return stakes, round(lucro_garantido, 2)

# Exemplo: Federer vs Djokovic, tênis
# Casa A: Federer 2.20 | Casa B: Djokovic 2.30
existe_arb, lucro_pct = verificar_arb_2vias(2.20, 2.30)
print(f'Arb existe: {existe_arb}, lucro potencial: {lucro_pct:.2f}%')

if existe_arb:
    stakes, lucro = calcular_stakes([2.20, 2.30], bankroll_total=1000)
    print(f'Apostar R${stakes[0]} no Federer (Casa A)')
    print(f'Apostar R${stakes[1]} no Djokovic (Casa B)')
    print(f'Lucro garantido: R${lucro}')

# Exemplo: Jogo de futebol com 3 vias
# Flamengo 2.20 (Casa A) | Empate 3.40 (Casa B) | Vasco 3.80 (Casa C)
existe_3v, lucro_3v = verificar_arb_3vias(2.20, 3.40, 3.80)
print(f'\nArb 3 vias: {existe_3v}, lucro: {lucro_3v:.2f}%')
if existe_3v:
    stakes_3v, lucro_3vr = calcular_stakes([2.20, 3.40, 3.80], 1000)
    print(f'Stakes: Fla R${stakes_3v[0]}, Empate R${stakes_3v[1]}, Vasco R${stakes_3v[2]}')
    print(f'Lucro garantido: R${lucro_3vr}')

Como scanear oportunidades

Manualmente é impossível. Você teria que comparar centenas de jogos entre dezenas de casas constantemente. Qualquer arb real dura minutos ou segundos antes que as casas ajustem as odds. Automação não é opcional — é o negócio.

O pipeline básico de scanning: busca odds de múltiplas casas via API pra todos os jogos disponíveis, agrupa por jogo e resultado, pega a melhor odd disponível em qualquer casa pra cada resultado, aplica a fórmula de arbitragem, e alerta quando encontra algo com margem positiva.

A frequência ideal de scanning depende do mercado. Pra jogos que começam em horas, odds mudam devagar — checagem a cada 5 minutos pode ser suficiente. Pra apostas ao vivo, você precisa de atualização em segundos. Isso exige WebSockets ou polling muito agressivo, o que aumenta custos de API.

Ferramentas e bots de arb

Ferramentas prontas

OddStorm, BetBurger e RebelBetting são as ferramentas SaaS mais conhecidas. Elas fazem o scanning por você, mostram as oportunidades em tempo real com countdown de quanto tempo a odd já está disponível, e algumas até calculam os stakes automaticamente. Os planos custam entre 50 e 200 euros por mês.

A vantagem dessas ferramentas é que elas cobrem dezenas de casas que você jamais conseguiria monitorar sozinho. A desvantagem é que todos os assinantes veem as mesmas oportunidades ao mesmo tempo — o que significa concorrência direta e odds que desaparecem ainda mais rápido.

Construindo seu próprio scanner

Um scanner próprio tem vantagens: você pode cobrir casas que as ferramentas prontas não cobrem, executar em latência menor, e não concorre com outros usuários do mesmo serviço. O custo é de desenvolvimento inicial e manutenção quando as APIs mudam.

python
import requests
import pandas as pd
from itertools import combinations

API_KEY = 'sua_chave'

def buscar_todas_odds(esporte='soccer_brazil_campeonato'):
    url = f'https://api.the-odds-api.com/v4/sports/{esporte}/odds'
    params = {'apiKey': API_KEY, 'regions': 'eu,us', 'markets': 'h2h', 'oddsFormat': 'decimal'}
    r = requests.get(url, params=params)
    r.raise_for_status()
    return r.json()

def extrair_melhores_odds(dados):
    """Para cada jogo, pega a melhor odd disponível em qualquer casa por resultado"""
    jogos = {}
    for jogo in dados:
        jogo_id = jogo['id']
        home = jogo['home_team']
        away = jogo['away_team']
        melhores = {'home': (0, ''), 'away': (0, ''), 'draw': (0, '')}
        
        for casa in jogo.get('bookmakers', []):
            for market in casa.get('markets', []):
                if market['key'] != 'h2h':
                    continue
                for outcome in market['outcomes']:
                    nome = outcome['name']
                    odd = outcome['price']
                    if nome == home and odd > melhores['home'][0]:
                        melhores['home'] = (odd, casa['key'])
                    elif nome == away and odd > melhores['away'][0]:
                        melhores['away'] = (odd, casa['key'])
                    elif nome == 'Draw' and odd > melhores['draw'][0]:
                        melhores['draw'] = (odd, casa['key'])
        
        jogos[jogo_id] = {
            'home': home, 'away': away,
            'melhor_odd_home': melhores['home'],
            'melhor_odd_draw': melhores['draw'],
            'melhor_odd_away': melhores['away'],
        }
    return jogos

def scanear_arbs(jogos, min_lucro_pct=0.5):
    """Encontra oportunidades de arbitragem com lucro mínimo definido"""
    oportunidades = []
    for jogo_id, jogo in jogos.items():
        odd_h, casa_h = jogo['melhor_odd_home']
        odd_d, casa_d = jogo['melhor_odd_draw']
        odd_a, casa_a = jogo['melhor_odd_away']
        
        if not all([odd_h, odd_d, odd_a]):
            continue
        
        soma = (1/odd_h) + (1/odd_d) + (1/odd_a)
        if soma < 1.0:
            lucro_pct = (1 - soma) / soma * 100
            if lucro_pct >= min_lucro_pct:
                oportunidades.append({
                    'jogo': f"{jogo['home']} vs {jogo['away']}",
                    'lucro_pct': round(lucro_pct, 2),
                    'odd_home': odd_h, 'casa_home': casa_h,
                    'odd_draw': odd_d, 'casa_draw': casa_d,
                    'odd_away': odd_a, 'casa_away': casa_a,
                })
    return sorted(oportunidades, key=lambda x: x['lucro_pct'], reverse=True)

# Pipeline completo
dados = buscar_todas_odds()
jogos = extrair_melhores_odds(dados)
arbs = scanear_arbs(jogos)
for arb in arbs:
    print(f"[{arb['lucro_pct']}%] {arb['jogo']}")
    print(f"  Home: {arb['odd_home']} ({arb['casa_home']})")
    print(f"  Draw: {arb['odd_draw']} ({arb['casa_draw']})")
    print(f"  Away: {arb['odd_away']} ({arb['casa_away']})")

Riscos e limitações

Limitação de conta

Esse é o maior risco real do arb. Casas de apostas não gostam de apostadores que consistentemente ganham delas. Quando detectam o padrão — apostas em odds altas logo antes de serem ajustadas, múltiplas apostas em eventos similares — elas limitam sua conta. Primeiro reduzem o limite máximo de aposta, depois podem suspender completamente.

A estratégia pra estender a vida das contas: misture apostas de valor com apostas normais ocasionais, não aposte sempre no limite máximo, varie os esportes e mercados, e cuide da velocidade de saque (saques muito frequentes também levantam bandeira). Apostadores profissionais de arb geralmente têm dezenas de contas em casas diferentes.

Latência e odds desatualizadas

Entre o momento que você detecta um arb e o momento que executa as apostas, as odds podem ter mudado. Se você apostou na Casa A mas a Casa B já moveu a odd, você ficou com uma posição unilateral — não é mais arb, é aposta normal. Isso acontece mais do que deveria, especialmente em mercados movimentados.

A solução técnica é minimizar latência: use servidores próximos às APIs das casas, implemente timeout curtos, e sempre verifique a odd no momento da execução antes de confirmar a aposta. Nunca execute baseado em dados com mais de 30 segundos de idade.

Margem real vs margem teórica

O arb calculado na teoria pode ser menor na prática. As casas cobram comissão em alguns mercados, os limites de aposta podem não permitir o stake calculado, e diferenças de câmbio se você apostar em moedas diferentes comem parte da margem. Sempre calcule o lucro depois de todas as taxas antes de executar.

Perguntas frequentes

O que é arbitragem esportiva

Arbitragem é um conceito que vem do mercado financeiro: explorar diferenças de preço do mesmo ativo em mercados distintos pra garantir lucro sem risco. No esporte, o 'ativo' é um resultado de um jogo e os 'mercados' são as casas de apostas. Na prática funciona assim: você encontra um jogo onde Casa A paga 2.20 pra vitória do time X, e Casa B paga 2.30 pra vitória do time Y. Apostando os valores certos em cada casa, você garante lucro qualquer que seja o resultado. Isso existe porque as casas têm modelos diferentes, equipes de traders diferentes, e nem sempre concordam sobre as probabilidades. O lucro por oportunidade costuma ser pequeno — tipicamente entre 1% e 5% do capital apostado. Mas com automação e volume, isso escala. Um apostador de arb profissional pode executar dezenas de oportunidades por dia em múltiplas casas e ligas.

Como scanear oportunidades

Manualmente é impossível. Você teria que comparar centenas de jogos entre dezenas de casas constantemente. Qualquer arb real dura minutos ou segundos antes que as casas ajustem as odds. Automação não é opcional — é o negócio. O pipeline básico de scanning: busca odds de múltiplas casas via API pra todos os jogos disponíveis, agrupa por jogo e resultado, pega a melhor odd disponível em qualquer casa pra cada resultado, aplica a fórmula de arbitragem, e alerta quando encontra algo com margem positiva. A frequência ideal de scanning depende do mercado. Pra jogos que começam em horas, odds mudam devagar — checagem a cada 5 minutos pode ser suficiente. Pra apostas ao vivo, você precisa de atualização em segundos. Isso exige WebSockets ou polling muito agressivo, o que aumenta custos de API.