Pular para o conteúdo
Data Science

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.

python
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.

python
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.