Como calcular a probabilidade justa a partir das odds em Python (com dados abertos)
Toda odd carrega uma comissão embutida. Se você somar as probabilidades implícitas de todos os resultados de um mercado, o total passa de 100%: o excedente é a margem da casa. Neste post mostro, em poucas linhas de Python, como retirar essa margem e chegar à probabilidade «justa», e onde encontrar dados abertos para testar.
A conta
Para um mercado de dois resultados com odds decimais a e b:
def justa(a, b):
pa, pb = 1 / a, 1 / b
total = pa + pb
return {
'prob_a': pa / total,
'prob_b': pb / total,
'margem_pct': 100 * (total - 1),
}
print(justa(1.91, 1.91)) # margem de 4,7%
print(justa(1.50, 2.75)) # margem de 3,0%
Quanto as casas ficam, na prática
O índice diário de margem mede essa comissão todos os dias em 12 esportes, a partir das odds de cerca de 30 casas (julho a setembro de 2026). O CSV e o dicionário de dados são CC BY 4.0. Resumo por tipo de mercado:
| Tipo de mercado | Margem média |
|---|---|
| Resultado com três opções (1X2) | 7,5% |
| Mercados de jogadores | 7,4% |
| Totais | 6,2% |
| Handicaps | 5,4% |
| Resultado com duas opções | 5,1% |
Puxando os dados com uma API sem chave
import json, urllib.request
url = 'https://betbetter.world/predicted-scores/nba?format=json'
req = urllib.request.Request(url, headers={'User-Agent': 'tabnews-demo/1.0'})
jogos = json.load(urllib.request.urlopen(req, timeout=20)).get('games', [])
print(len(jogos), 'jogos')
A referência completa está em betbetter.world/api; também existe pip install betbetter.
E as probabilidades justas são mesmo justas?
Um estudo de calibração com 18.238 mercados liquidados compara, decil por decil, a probabilidade sem margem com a frequência real. Resultado: boa calibração em média (diferença abaixo de dois pontos em cada decil), com uma inclinação: azarões rendem um a dois pontos acima do previsto e favoritos o mesmo tanto abaixo.
Dados CC BY 4.0, com crédito para a Bet Better. Estimativas de modelo, não é recomendação de aposta. 18+. Jogue com responsabilidade.