Como Usar Python para Analisar Odds de Apostas
A usar Python e APIs de odds para encontrar value bets. Código prático com pandas, requests e análise estatística.
Por que isso é importante
Como Usar Python para Analisar Odds de Apostas. A usar Python e APIs de odds para encontrar value bets. Código prático com pandas, requests e análise estatística.
Programador que apostava sem código era eu até uns dois anos atrás. Perdia grana igual a todo mundo, achando que entendia de futebol. Aí comecei a usar Python pra analisar odds e minha perspectiva mudou completamente — não que eu fique rico, mas entendi exatamente onde estava errando e onde as casas ganham dinheiro. Vou te mostrar como funciona na prática.
Por que programadores têm vantagem em apostas esportivas
A vantagem não é mágica. É acesso a dados que o apostador comum ignora. Você consegue comparar odds de 20 casas em segundos, calcular probabilidades implícitas automaticamente e identificar quando uma casa está com um número fora do padrão. Isso é tudo. Não tem segredo além de capacidade de processamento e disciplina pra não apostar na emoção.
O apostador médio olha pra odd 2.10 e pensa 'parece bom'. O programador olha pra mesma odd e calcula que ela implica 47.6% de probabilidade, compara com os outros 15 mercados que tem abertos pra o mesmo jogo e decide se tem valor ou não. Simples assim.
A vantagem real do programador
Velocidade: compara centenas de odds em segundos
Precisão: calcula probabilidades sem viés emocional
Escala: monitora múltiplos mercados simultaneamente
Histórico: armazena e analisa dados passados automaticamente
Entendendo odds — decimal, fracionária e americana
Antes de qualquer código, você precisa entender os três formatos de odds que vai encontrar nas APIs. No Brasil usamos quase sempre decimal, mas APIs internacionais retornam os três formatos e você vai precisar converter.
Odds decimal 2.50 significa que pra cada R$1 apostado você recebe R$2.50 de volta (lucro de R$1.50). Odds fracionária 3/2 é a mesma coisa. Odds americana +150 também. O problema é quando a API te manda tudo misturado e você precisa normalizar antes de comparar.
Como converter odds em probabilidade implícita
Probabilidade implícita é a probabilidade que a casa de apostas está atribuindo a um resultado. Pra odds decimal, a fórmula é simples: divide 1 pela odd. Odd 2.50 implica probabilidade de 40% (1/2.50 = 0.40). Se você acha que o time tem 50% de chance real de ganhar e a odd implica 40%, aí tem valor na aposta.
def odds_decimal_para_probabilidade(odd: float) -> float:
"""Converte odd decimal em probabilidade implícita."""
return 1 / odd
def odds_americana_para_decimal(odd_americana: int) -> float:
"""Converte odd americana em decimal."""
if odd_americana > 0:
return (odd_americana / 100) + 1
else:
return (100 / abs(odd_americana)) + 1
def odds_fracionaria_para_decimal(numerador: int, denominador: int) -> float:
"""Converte odd fracionária em decimal."""
return (numerador / denominador) + 1
# Exemplo prático
print(odds_decimal_para_probabilidade(2.50)) # 0.4 = 40%
print(odds_americana_para_decimal(150)) # 2.5
print(odds_fracionaria_para_decimal(3, 2)) # 2.5
# Calculando a margem da casa (overround)
def calcular_margem(odds_partida: dict) -> float:
"""Calcula a margem da casa de apostas."""
probabilidades = [odds_decimal_para_probabilidade(o) for o in odds_partida.values()]
return (sum(probabilidades) - 1) * 100
odds_jogo = {'casa': 2.10, 'empate': 3.20, 'fora': 3.80}
print(f'Margem da casa: {calcular_margem(odds_jogo):.2f}%')
# Margem da casa: 5.68% — o dinheiro delesAPIs de odds gratuitas (The Odds API, Betfair, etc.)
Tem algumas APIs que funcionam pra isso. A The Odds API tem um plano gratuito com 500 requisições por mês, suficiente pra experimentar. A Betfair tem API pública mas exige cadastro. O OddsPortal não tem API oficial mas dá pra scrappear com cuidado. Vou focar na The Odds API porque é a mais fácil de começar.
The Odds API
API com plano gratuito de 500 requests/mês. Cobre futebol, basquete, tênis e mais. Formato JSON limpo.
Betfair Exchange API
API oficial da Betfair. Acesso a mercados em tempo real. Exige conta verificada.
SportMonks
API de dados esportivos com odds históricas. Plano pago mas robusto para análise.
API-Football
Dados de ligas, times e jogadores. Ótimo pra cruzar com dados de odds.
Código prático: coletando e comparando odds
Agora a parte que interessa. Esse código conecta na The Odds API, puxa os jogos disponíveis e monta um DataFrame com pandas pra comparar odds entre casas. Você vai precisar de uma chave de API gratuita que consegue em 2 minutos no site deles.
import requests
import pandas as pd
from datetime import datetime
API_KEY = 'sua_chave_aqui' # The Odds API
BASE_URL = 'https://api.the-odds-api.com/v4'
def buscar_odds_futebol(esporte: str = 'soccer_brazil_campeonato') -> pd.DataFrame:
"""
Busca odds de futebol da The Odds API.
Retorna DataFrame com odds de cada casa por jogo.
"""
url = f'{BASE_URL}/sports/{esporte}/odds'
params = {
'apiKey': API_KEY,
'regions': 'eu', # europeu usa odds decimal
'markets': 'h2h', # head-to-head (1X2)
'oddsFormat': 'decimal',
'dateFormat': 'iso'
}
response = requests.get(url, params=params)
response.raise_for_status()
dados = response.json()
registros = []
for jogo in dados:
for bookmaker in jogo.get('bookmakers', []):
for market in bookmaker.get('markets', []):
if market['key'] == 'h2h':
odds_jogo = {
'jogo': f"{jogo['home_team']} vs {jogo['away_team']}",
'data': jogo['commence_time'],
'casa_aposta': bookmaker['title'],
'odd_casa': None,
'odd_empate': None,
'odd_fora': None
}
for outcome in market['outcomes']:
if outcome['name'] == jogo['home_team']:
odds_jogo['odd_casa'] = outcome['price']
elif outcome['name'] == jogo['away_team']:
odds_jogo['odd_fora'] = outcome['price']
else:
odds_jogo['odd_empate'] = outcome['price']
registros.append(odds_jogo)
return pd.DataFrame(registros)
# Executando
df = buscar_odds_futebol()
print(df.head(10))
print(f'\nTotal de registros: {len(df)}')
print(f'Casas de apostas: {df["casa_aposta"].nunique()}')Identificando discrepâncias entre casas
Aqui é onde fica interessante. Depois de coletar os dados, você quer encontrar jogos onde existe diferença significativa entre o que diferentes casas estão oferecendo. Quando uma casa oferece odd 2.80 e outra 2.30 pro mesmo resultado, alguém está errando — e você quer estar do lado certo.
def encontrar_discrepancias(df: pd.DataFrame, threshold: float = 0.15) -> pd.DataFrame:
"""
Encontra jogos com maior discrepância de odds entre casas.
threshold: diferença mínima em percentual pra considerar discrepância.
"""
resultados = []
for jogo in df['jogo'].unique():
df_jogo = df[df['jogo'] == jogo]
for coluna in ['odd_casa', 'odd_empate', 'odd_fora']:
odds_validas = df_jogo[coluna].dropna()
if len(odds_validas) < 2:
continue
odd_max = odds_validas.max()
odd_min = odds_validas.min()
diferenca_pct = (odd_max - odd_min) / odd_min
if diferenca_pct >= threshold:
casa_max = df_jogo.loc[odds_validas.idxmax(), 'casa_aposta']
casa_min = df_jogo.loc[odds_validas.idxmin(), 'casa_aposta']
resultados.append({
'jogo': jogo,
'mercado': coluna.replace('odd_', ''),
'odd_maxima': odd_max,
'odd_minima': odd_min,
'diferenca_pct': f'{diferenca_pct:.1%}',
'melhor_casa': casa_max,
'pior_casa': casa_min,
'prob_implicita_melhor': f'{1/odd_max:.1%}'
})
return pd.DataFrame(resultados).sort_values('diferenca_pct', ascending=False)
discrepancias = encontrar_discrepancias(df)
print('Top discrepâncias encontradas:')
print(discrepancias.head(10).to_string())Rodando isso regularmente você vai notar padrões. Certas casas consistentemente ficam atrasadas pra ajustar odds quando sai notícia de desfalque. Outras são mais rápidas. Esse tipo de conhecimento — construído com dados — é o que diferencia análise séria de chute.
Limitações e riscos (a casa sempre ajusta)
Preciso ser direto aqui porque a maioria dos tutoriais ignora essa parte. As casas têm algoritmos muito mais sofisticados que o seu script Python. Elas ajustam odds em tempo real com base no volume de apostas, notícias e dados de mercado que você não tem acesso. Quando você encontra uma discrepância 'boa', provavelmente ela já foi corrigida ou vai ser em minutos.
Aviso sobre riscos
Apostas esportivas envolvem risco real de perda financeira. Nenhum sistema, algoritmo ou bot garante lucro consistente. As casas de apostas têm margem estrutural que torna o lucro de longo prazo extremamente difícil para o apostador médio. Use as ferramentas apresentadas para aprendizado e análise, nunca aposte mais do que pode perder. Se você tem problemas com jogo compulsivo, busque ajuda profissional.
Outro risco prático: se você começar a ganhar consistentemente, a casa vai limitar sua conta. Isso é legal, acontece com todo value bettor bem-sucedido. Então mesmo que seu sistema funcione, você vai bater no teto bem antes do que imagina. Não é pessimismo — é o que acontece na prática com quem tenta isso de verdade.
Checklist antes de usar qualquer sistema de odds
- Entende a matemática de probabilidade implícita
- Tem banca separada só pra apostas (nunca misturar com gastos fixos)
- Define stop-loss mensal antes de começar
- Testa o sistema em papel (sem dinheiro real) por pelo menos 1 mês
- Entende que pode perder tudo mesmo com sistema
- Conhece as leis de apostas do seu país
Quer ir além nessa análise? Veja o artigo sobre como criar um bot completo de apostas com IA, que explora a arquitetura completa de coleta, análise e execução. Ou se quiser entender a teoria primeiro, o artigo sobre value betting explica a matemática por trás de apostas com expectativa positiva.