Value Betting com IA: Como Encontrar Apostas
Value betting é encontrar apostas onde a odd oferecida é maior do que a probabilidade real sugere. Com IA, dá pra estimar probabilidades reais e comparar com o
TL;DR
Value Betting com IA: Como Encontrar Apostas. Value betting é encontrar apostas onde a odd oferecida é maior do que a probabilidade real sugere. Com IA, dá pra estimar probabilidades reais e comparar com o mercado automaticamente.
O que é valor esperado (EV)
Valor esperado (Expected Value, EV) é um conceito de probabilidade que descreve quanto você espera ganhar ou perder em média por aposta, repetindo a mesma situação muitas vezes. EV positivo significa que no longo prazo você lucra. EV negativo significa que você perde — independente de ganhar ou perder apostas individuais no curto prazo.
A fórmula é direta: EV = (probabilidade de ganhar × lucro se ganhar) − (probabilidade de perder × perda se perder). Se você aposta R$100 numa odd de 2.0 e acredita que a probabilidade real de ganhar é 55%, o EV é: (0.55 × 100) − (0.45 × 100) = R$10. Cada R$100 apostado nessa situação vale R$110 em valor esperado.
O mercado de apostas na maioria dos casos tem EV negativo para o apostador porque as casas adicionam margem. Uma odd de 2.0 numa casa com 5% de margem implica que a probabilidade real é na verdade 47.6%, não 50%. Você paga 5% de imposto toda vez que aposta nessa situação.
Value betting é a arte de encontrar as exceções: momentos onde a odd oferecida excede o que a probabilidade real justificaria. Esses momentos existem porque os modelos das casas não são perfeitos, porque o mercado ainda não absorveu uma informação relevante, ou porque a casa precifica para o apostador médio, não para o mercado eficiente.
def calcular_ev(prob_real, odd_decimal, stake=100):
"""
Calcula o valor esperado de uma aposta.
prob_real: probabilidade real estimada (0 a 1)
odd_decimal: odd oferecida pela casa
stake: valor apostado
"""
lucro_se_ganhar = stake * (odd_decimal - 1)
perda_se_perder = stake
ev = (prob_real * lucro_se_ganhar) - ((1 - prob_real) * perda_se_perder)
ev_percentual = ev / stake * 100
return {
'ev_reais': round(ev, 2),
'ev_percentual': round(ev_percentual, 2),
'tem_valor': ev > 0
}
# Exemplo: odd 2.20, você estima probabilidade real de 52%
resultado = calcular_ev(prob_real=0.52, odd_decimal=2.20, stake=100)
print(f"EV: R${resultado['ev_reais']} ({resultado['ev_percentual']}%)")
print(f"Vale a pena apostar: {resultado['tem_valor']}")
# Exemplo 2: odd 1.80, probabilidade real de 52%
resultado2 = calcular_ev(prob_real=0.52, odd_decimal=1.80, stake=100)
print(f"\nEV: R${resultado2['ev_reais']} ({resultado2['ev_percentual']}%)")
print(f"Vale a pena apostar: {resultado2['tem_valor']}")Closing Line Value (CLV)
CLV — Closing Line Value — é a métrica mais importante que você vai usar pra medir se suas apostas têm valor real. A ideia é simples: a odd de fechamento (o preço logo antes do jogo começar) é geralmente o preço mais eficiente do mercado, porque absorveu toda a informação disponível incluindo os apostadores profissionais.
Se você apostou numa odd de 2.20 e a odd de fechamento foi 1.90, você bateu a closing line — sua aposta tinha valor no momento da entrada. Se a odd de fechamento foi 2.40, você entrou mais caro do que o mercado precificou no fim, o que sugere que sua análise estava errada ou você entrou cedo demais.
A lógica de usar CLV como métrica é que apostadores profissionais consistentemente batem a closing line. No curto prazo, você pode bater a closing line e ainda perder (sorte) ou entrar numa odd ruim e ainda ganhar (azar). Mas no longo prazo, CLV positivo consistente é o sinal mais confiável de que seu edge é real.
Rastrear CLV requer guardar a odd no momento da sua aposta e buscar a odd de fechamento depois do jogo. Com um banco de histórico de odds (veja o artigo sobre Python para análise de odds), você consegue reconstruir isso automaticamente. É um processo que vale implementar desde o início.
Como estimar probabilidades reais com IA
Aqui é onde a IA entra de verdade. Você precisa de uma estimativa de probabilidade que seja melhor do que a implícita nas odds do mercado. Existem duas abordagens principais: usar as odds de uma casa sharp (como Pinnacle) removendo a margem, ou construir um modelo próprio com dados históricos.
Modelo de probabilidade vs modelo de resultado
Tem uma distinção importante que muitos ignoram. Um modelo de resultado prevê qual time vai ganhar — saída categórica. Um modelo de probabilidade prevê com que probabilidade cada resultado vai acontecer — saída contínua entre 0 e 1. Pra value betting, você precisa do segundo tipo.
Com scikit-learn, XGBoost ou redes neurais, você consegue saídas de probabilidade usando predict_proba() em vez de predict(). Mas ter o número não é suficiente — ele precisa ser calibrado. Um modelo que diz 70% de probabilidade deve acertar 70% das vezes nessa faixa. Se ele diz 70% mas acerta 85%, está subconfiante. Se acerta 55%, está superconfiante.
Calibração do modelo
Calibração é ajustar as probabilidades brutas do modelo para que elas correspondam às frequências reais. O scikit-learn tem CalibratedClassifierCV que faz isso automaticamente usando Platt Scaling ou Isotonic Regression. Sempre calibra depois de treinar — probabilidades não calibradas podem parecer boas em acurácia mas são inúteis pra value betting.
Pra verificar a calibração, usa um reliability diagram (curva de calibração). O sklearn.calibration.calibration_curve plota probabilidades previstas contra frequências observadas. Uma curva perfeita é uma diagonal. Qualquer desvio significativo indica que você precisa calibrar antes de usar as probabilidades pra calcular EV.
Kelly Criterion — quanto apostar
Encontrar value bets é metade do problema. A outra metade é: quanto apostar? Apostar muito pouco e você não capitaliza o edge. Apostar muito e uma sequência de derrotas te tira do jogo antes de chegar no longo prazo onde o edge se manifesta.
O Kelly Criterion é a fórmula matemática que resolve isso. Ele calcula o percentual ótimo do bankroll a apostar em cada oportunidade para maximizar o crescimento geométrico da carteira no longo prazo. A fórmula é: f = (bp - q) / b, onde b é o lucro proporcional (odd - 1), p é a probabilidade de ganhar, e q é a probabilidade de perder (1 - p).
Full Kelly vs Fractional Kelly
Full Kelly maximiza o crescimento no longo prazo, mas os swings são violentos. Numa sequência ruim, você pode ver o bankroll cair 50% ou mais antes de recuperar — mesmo quando o edge é real. Pra maioria das pessoas, isso é psicologicamente insuportável e leva a decisões irracionais.
Fractional Kelly usa uma fração do stake sugerido — geralmente 25% ou 50% do Kelly. Você abre mão de parte do crescimento ótimo em troca de muito menos volatilidade. A maioria dos apostadores profissionais usa entre 20% e 50% do Kelly. É a escolha racional quando você não tem certeza absoluta da calibração do seu modelo.
def kelly_criterion(prob_ganhar, odd_decimal, bankroll, fracao=0.25):
"""
Calcula o stake pelo Kelly Criterion.
fracao: use 0.25 pra Quarter Kelly (recomendado pra iniciantes)
"""
b = odd_decimal - 1 # lucro por unidade apostada
p = prob_ganhar
q = 1 - p
# Full Kelly
kelly_full = (b * p - q) / b
if kelly_full <= 0:
return {'stake': 0, 'pct_bankroll': 0, 'mensagem': 'Sem edge — não apostar'}
# Fractional Kelly
kelly_fracionado = kelly_full * fracao
stake = bankroll * kelly_fracionado
return {
'kelly_full_pct': round(kelly_full * 100, 2),
'kelly_fracionado_pct': round(kelly_fracionado * 100, 2),
'stake_recomendado': round(stake, 2),
'bankroll': bankroll
}
# Exemplo: prob estimada 55%, odd 2.10, bankroll R$1000
resultado = kelly_criterion(
prob_ganhar=0.55,
odd_decimal=2.10,
bankroll=1000,
fracao=0.25 # Quarter Kelly
)
print(f"Full Kelly: {resultado['kelly_full_pct']}% do bankroll")
print(f"Quarter Kelly: {resultado['kelly_fracionado_pct']}% do bankroll")
print(f"Apostar: R${resultado['stake_recomendado']}")
# Vários jogos no mesmo dia
apostas = [
{'jogo': 'Fla vs Pal', 'prob': 0.55, 'odd': 2.10},
{'jogo': 'Real vs Bar', 'prob': 0.48, 'odd': 2.50},
{'jogo': 'Cid vs Ars', 'prob': 0.62, 'odd': 1.75},
]
bankroll = 1000
for a in apostas:
r = kelly_criterion(a['prob'], a['odd'], bankroll)
print(f"{a['jogo']}: R${r['stake_recomendado']} ({r['kelly_fracionado_pct']}%)")Implementando um sistema de value betting
Arquitetura do sistema
Um sistema completo tem quatro componentes: coleta de dados (odds + estatísticas de jogos), modelo de probabilidade (treinado e calibrado), motor de value (compara probabilidades do modelo com odds do mercado), e gestão de bankroll (Kelly Criterion pra dimensionar apostas). Cada componente pode ser desenvolvido e testado independentemente.
O fluxo de dados é: você coleta odds das APIs periodicamente e salva no banco. O modelo de probabilidade roda offline, treinado com dados históricos, e gera probabilidades pra jogos futuros. O motor de value cruza as probabilidades do modelo com as odds atuais e identifica onde existe EV positivo. A gestão de bankroll calcula o stake pra cada oportunidade.
Exemplo prático end-to-end
Na prática você vai ter um script que roda diariamente e produz uma lista de apostas recomendadas para o dia. Esse script carrega o modelo treinado, busca odds atualizadas da API, calcula EV pra cada combinação jogo/casa/mercado, filtra por EV positivo acima de um threshold, e aplica Kelly pra cada aposta aprovada.
O output ideal é um relatório simples: nome do jogo, resultado, casa, odd atual, probabilidade do modelo, EV calculado e stake recomendado. Você revisa, decide se concorda com as apostas (sempre tem o julgamento humano no loop), e executa manualmente ou integra com uma API de apostas se a casa tiver.
Registra tudo. Cada aposta feita: quando foi, qual odd estava disponível, qual a probabilidade do modelo, qual a odd de fechamento depois. Com 200-300 apostas registradas você começa a ter dados estatisticamente significativos pra avaliar se o sistema tem edge real ou se foi sorte.
Gestão de banca e mindset
Separa o bankroll de apostas do seu dinheiro pessoal. Não mistura. Define um valor que você pode perder completamente sem impacto na sua vida. Isso parece óbvio mas a maioria das pessoas não faz, e é daí que vêm as decisões emocionais que destroem estratégias matematicamente sólidas.
Variância é real e vai te testar. Mesmo com edge positivo de 5%, uma sequência de 20 derrotas seguidas é estatisticamente plausível. Você precisa entender isso no nível visceral antes de começar. O Kelly Criterion ajuda, mas não elimina a volatilidade — só a otimiza.
Nunca muda a estratégia no meio de uma sequência ruim. Aumentar stakes depois de perder (Martingale disfarçado) é a ruína garantida. Diminuir drasticamente depois de ganhar (fear of losing profits) desperdiça o edge. A disciplina de seguir o sistema mesmo quando dói é o que separa apostadores sistemáticos dos amadores.
Revisa o modelo periodicamente. O futebol muda — treinadores mudam, jogadores mudam, estilos de jogo evoluem. Um modelo treinado em dados de 2020 pode estar desatualizado em 2026. Re-treinamento com dados recentes, validação de CLV e monitoramento de performance são tarefas que não podem ser negligenciadas num sistema de longo prazo.
Perguntas frequentes
O que é valor esperado (EV)
Valor esperado (Expected Value, EV) é um conceito de probabilidade que descreve quanto você espera ganhar ou perder em média por aposta, repetindo a mesma situação muitas vezes. EV positivo significa que no longo prazo você lucra. EV negativo significa que você perde — independente de ganhar ou perder apostas individuais no curto prazo. A fórmula é direta: EV = (probabilidade de ganhar × lucro se ganhar) − (probabilidade de perder × perda se perder). Se você aposta R$100 numa odd de 2.0 e acredita que a probabilidade real de ganhar é 55%, o EV é: (0.55 × 100) − (0.45 × 100) = R$10. Cada R$100 apostado nessa situação vale R$110 em valor esperado. O mercado de apostas na maioria dos casos tem EV negativo para o apostador porque as casas adicionam margem. Uma odd de 2.0 numa casa com 5% de margem implica que a probabilidade real é na verdade 47.6%, não 50%. Você paga 5% de imposto toda vez que aposta nessa situação.
Como estimar probabilidades reais com IA
Aqui é onde a IA entra de verdade. Você precisa de uma estimativa de probabilidade que seja melhor do que a implícita nas odds do mercado. Existem duas abordagens principais: usar as odds de uma casa sharp (como Pinnacle) removendo a margem, ou construir um modelo próprio com dados históricos. Tem uma distinção importante que muitos ignoram. Um modelo de resultado prevê qual time vai ganhar — saída categórica. Um modelo de probabilidade prevê com que probabilidade cada resultado vai acontecer — saída contínua entre 0 e 1. Pra value betting, você precisa do segundo tipo. Com scikit-learn, XGBoost ou redes neurais, você consegue saídas de probabilidade usando predict_proba() em vez de predict(). Mas ter o número não é suficiente — ele precisa ser calibrado. Um modelo que diz 70% de probabilidade deve acertar 70% das vezes nessa faixa. Se ele diz 70% mas acerta 85%, está subconfiante. Se acerta 55%, está superconfiante.