Pular para o conteúdo principal

Analisando mãos de pôquer com Python

Analise mãos de pôquer com Python e implemente com facilidade conceitos estatísticos como combinações, permutações, eventos (in)dependentes e valor esperado.
Actualizado 17 de set. de 2026  · 15 min leer

Explore com IA

ChatGPTClaudePerplexity

Na primeira parte deste tutorial, você aprendeu vários conceitos, incluindo eventos independentes e dependentes, permutações e combinações, eventos múltiplos, valores esperados e como calcular cada um deles. Agora você vai aplicar esses conceitos a mãos de pôquer reais que joguei ao longo da minha carreira. No caminho, você vai se aprofundar no conceito de valor esperado e em como usá-lo para tomar decisões ótimas.

  • Primeiro, você verá uma breve introdução ao No Limit Texas Hold’em para ter o contexto necessário para concluir o tutorial;
  • Em seguida, você será apresentado a algumas ferramentas que serão usadas nos estudos de caso das mãos de pôquer.
  • Depois dessas duas seções introdutórias, vamos revisitar um conceito visto no primeiro tutorial: valor esperado.
  • Por fim, você analisará as mãos: Par de 10 pré-flop contra aumento, Par de 8 pré-flop contra aumento e check-raise no flop como semiblefe.

cards

uma introdução ao No Limit Texas Hold’em

Antes de começar, vale um pouco de contexto. O jogo abordado nos estudos de caso deste artigo é o No Limit Texas Hold’em. Jogada com um baralho padrão de 52 cartas, Texas Hold’em é a variação de pôquer mais popular. Cada jogador tenta formar a melhor mão de cinco cartas possível combinando suas duas cartas com as cinco cartas comunitárias distribuídas ao longo da mão.

O jogador à esquerda do botão do dealer inicia a ação, e o jogo segue em sentido horário pela mesa. As apostas geralmente começam quando o jogador à esquerda do botão posta o small blind, e o próximo jogador à esquerda posta o big blind. A ação de apostas ocorre em múltiplas rodadas: pré-flop, flop, turn e river.

Alguns termos que você precisa conhecer:

  • Button (botão) - O botão é um disco circular que gira em sentido horário após cada mão. Em jogos caseiros, quem tem o botão dá as cartas, começando pelo jogador à sua esquerda. No cassino, o botão indica quem seria o dealer, mas quem distribui as cartas é um funcionário do cassino.
  • Blinds - As blinds são apostas obrigatórias feitas pelos dois jogadores à esquerda do botão. São chamadas de “blinds” porque esses jogadores apostam às cegas, antes de verem suas cartas.
  • Streets - Cada rodada em que as cartas são distribuídas é chamada de street.
  • Pré-flop - Primeira rodada de apostas. Cada jogador recebe duas cartas, e as blinds iniciam a ação. Ainda não há cartas comunitárias.
  • Flop - Segunda rodada de apostas. Três cartas comunitárias são abertas no centro da mesa, seguidas de uma rodada de apostas.
  • Turn - Nesta rodada, é aberta apenas uma carta comunitária, seguida da terceira rodada de apostas.
  • River - A última carta comunitária é aberta, seguida da rodada final de apostas.
  • Showdown - Após o river e depois que toda a ação de apostas ocorre, os jogadores que restaram mostram suas cartas para ver quem tem a melhor mão.
  • Check - Se é a vez de um jogador agir e não houve aposta prévia nessa rodada, ele pode dar check, ou seja, optar por não apostar e passar a vez ao próximo.
  • Bet ou raise - Apostar ou aumentar é incrementar o valor em jogo durante a rodada. O primeiro jogador a colocar fichas no pote em cada rodada está apostando (bet). Se outro jogador aumenta o valor dessa aposta, está dando raise.
  • Call - Se é a vez de um jogador e já houve uma aposta na rodada, ele pode igualar o valor apostado, o que é chamado de dar call.
  • Fold - Se é a vez de um jogador e já houve aposta na rodada, ele pode desistir da mão (fold). Esse jogador sai da disputa e perde o que já colocou no pote.

Se você nunca jogou ou não está familiarizado com a terminologia do pôquer, clique aqui para uma explicação concisa e detalhada.

ferramentas de probabilidade no pôquer

Sempre que eu me via em uma situação confusa durante o jogo, marcava a mão para revisar depois. Ao terminar a sessão, eu voltava às mãos marcadas. Eu as destrinchava matematicamente para ter uma ideia melhor do que fazer em situações semelhantes no futuro.

As mãos usadas neste tutorial foram baixadas e armazenadas em um banco PostgreSQL pelo Hold’em Manager, software citado na Parte I. O Hold’em Manager calcula estatísticas a partir desses históricos de mãos para cada oponente contra quem você joga. Os dados são atualizados e exibidos em tempo real enquanto você joga.

Separei três mãos da minha carreira no pôquer. Você vai usar estatísticas dos meus oponentes que eu tinha na época, raciocínio dedutivo e uma ferramenta chamada equity calculator para estimar a probabilidade de vencer a mão para cada opção viável.

Observação: um equity calculator é usado para determinar a probabilidade de ganhar uma mão com base em uma situação que você define. Você informa suas cartas, as cartas comunitárias (se houver) e o range de mãos que você assume que o oponente tem. A calculadora retorna a probabilidade de vitória caso as cartas restantes sejam distribuídas.

valor esperado: um olhar mais atento

Antes de partir para a análise da primeira mão, você precisa entender melhor o valor esperado. Na Parte I, você aprendeu a calcular o valor esperado ao disputar um pote de \$100 com 75% de chance de vitória. Havia apenas duas possibilidades:

  • Ganhar \$100
  • Ganhar \$0

Usando a fórmula ExpectedValue=TotalValue×Probability, você calculou que o valor esperado seria \$100 * .75, ou \$75.

No entanto, muitas vezes o cálculo não é tão direto e há mais de dois resultados possíveis. Para determinar o valor esperado, você deve encontrar a média ponderada de cada resultado possível, em que cada resultado é ponderado por sua respectiva probabilidade de ocorrer.

Por isso, a equação acima fica melhor representada assim:

$Expected Value = (100 * .75) + (0 * .25)$
$Expected Value = \$75$

E se houvesse um terceiro resultado possível para a situação acima?

Veja o cenário a seguir, em que você tem 50% de chance de ganhar \$100, 25% de chance de ganhar \$25 e outros 25% de chance de não ganhar nada:

  • Ganhar \$100 (50%)
  • Ganhar \$25 (25%)
  • Ganhar \$0 (25%)

Então, o cálculo do seu valor esperado será:

$Expected Value = (100 * .50) + (25 * .25) + (0 * .25)$
$Expected Value = \$56.25$

Agora é hora de aplicar o que você aprendeu a alguns cenários que enfrentei na mesa de pôquer.

par de 10 contra aumento pré-flop

Observação: Ao revisar mãos de pôquer, é comum chamar o oponente de Villain e o jogador analisado de Hero. O jogador que você vai acompanhar é o ‘GamingFoSho’, que era meu nome de usuário nos sites de pôquer em que jogava.

visão geral da mão 1

Hand 1 Overview

Hero (GamingFoSho) tem um par de 10 e apostou \$0.85. Ele tem \$20.95 restantes. O oponente (Villain) aumentou para \$2.50 e tem \$30.35 restantes.

Na terminologia do pôquer, isso é um 3bet. O small blind e o big blind fazem a primeira aposta, e o Hero deu raise neles, que foi a segunda aposta. Há \$3.70 no pote. Dar call não é uma boa opção por motivos que fogem ao escopo deste post.

Observação: de forma geral, jogar de maneira passiva no pôquer não é lucrativo e jogar de forma agressiva é lucrativo. Call é passivo; apostar ou dar raise é agressivo. Há outros fatores estratégicos, como posição, que também indicam que o call é ruim aqui, mas exigiriam uma explicação longa.

Hero precisa decidir entre dar raise com o plano de ir all-in (apostar todas as fichas) ou dar fold. Fold não custa nada, então vamos analisar o valor esperado do all-in. Nesta situação, eu faria um pequeno raise para induzir um all-in de blefe do Villain, mas o cálculo deve ser feito como se eu fosse all-in, já que esse é o plano.

Hero arrisca \$20.95 se for all-in e perder. Ir all-in significa colocar todo o dinheiro no pote. Hero tem \$20.95 restantes, então o risco é de \$20.95. Hero ganha \$23 se for all-in e vencer. Há \$3.70 no pote. Hero apostou \$0.85 e Villain aumentou para \$2.50. Hero precisa completar \$1.65 dos \$20.95 restantes para igualar o raise, ficando com \$19.30. Isso significa que ele pode ganhar mais \$19.30 além dos \$3.70 já no pote, totalizando \$23.00. Como há \$3.70 no pote agora, Hero ganha \$3.70 se o Villain desistir.

Hand1_AllIn_Loses = -20.95
Hand1_AllIn_Winnings = 23
Hand1_Fold_Winnings = 3.7

estatísticas relevantes da mão 1

O pôquer é um jogo de raciocínio dedutivo com informação incompleta. No Hold’em Manager, posso revisar mãos antigas e ver as estatísticas que eu tinha na época em que a mão foi jogada. Abaixo estão prints de algumas das estatísticas que eu tinha sobre esse oponente naquele momento.

Os números representam situações específicas, como apostar pré-flop no botão. Na maioria das vezes há dois números. O da esquerda indica o percentual de vezes em que o Villain fez um movimento específico em uma situação específica. O número entre parênteses à direita indica o número de ocorrências até 99. Se não houver parênteses, o número de ocorrências é 100 ou mais.

Eu havia jogado 392 mãos contra esse oponente e destaquei as estatísticas relevantes para esta mão:

Stats1

Stats2

  1. Villain está no botão, que é a primeira posição à direita das blinds. No geral, dessa posição, ele dá 3bet 7,4% (27 ocorrências);
  2. Hero está no cut-off, a primeira posição à direita do botão. Contra o cut-off, Villain dá 3bet 12,5% (16 ocorrências);
  3. Quando o Villain está no botão contra um raise pré-flop do cut-off, ele dá 3bet 25% (4 ocorrências);
  4. Quando o Villain dá 3bet pré-flop e enfrenta um novo aumento, ele desiste 50% das vezes (2 ocorrências).

Observação: Como decidi que esses 4 pontos eram importantes? Hero estava no cut-off e o Villain deu 3bet do botão. Quero estatísticas do que o Villain fez em mãos anteriores em situações parecidas. Com que frequência ele dá 3bet no botão ou contra um jogador no cut-off? Com que frequência ele desiste de um 3bet diante de um novo aumento? As estatísticas selecionadas acima respondem melhor a essas perguntas.

suposições da mão 1

Com base nas estatísticas acima, vou adotar as seguintes suposições (estimativas fundamentadas):

  1. Villain aumenta para 2,50 com cerca de (~) 13–15% do range de mãos iniciais possíveis;
  2. Villain desiste diante de um novo raise ~25% das vezes e vai all-in ~75% das vezes;
  3. Villain volta all-in com um range de ~10%, representado na imagem abaixo.
  4. As mãos em amarelo representam o range presumido do Villain, com 128 combinações (9,7% do total).
  5. Se você está se perguntando por que A5s e A2s estão no range, elas representam mãos de blefe do Villain.

Observação: A imagem abaixo representa o universo de todas as combinações possíveis de mãos iniciais no Texas Hold’em, que são 1326 combinações, como você viu na primeira parte desta série.

Hand 1 Assumptions

  • AA = Ás Ás, KK = Rei Rei, etc.
  • AKo = Ás Rei off, ATo = Ás Dez off, etc.
  • AKs = Ás Rei suited, ATs = Ás Dez suited, J8s = Valete Oito suited, etc.

análise da mão 1

Agora que você tem o range do Villain, precisa determinar a probabilidade de a mão do Hero vencer contra esse range presumido se ambos forem all-in. Você pode inserir a mão do Hero (10h10s) e o range do Villain em uma equity calculator para obter a probabilidade de vitória do Hero. A equity calculator simula 10h10s contra o range do Villain milhares de vezes e indica que o Hero vence cerca de 53,77% das vezes.

Agora você pode criar variáveis para EstFoldPercent e Equity, e então criar a função AllinExpectedValue().

Hand1_Fold_Percent = .25
Hand1_Equity = .538

Agora é um cálculo simples. Você precisa construir uma função que represente a seguinte equação:

    $FoldEV = (FoldPercent * FoldWinnings)$
    $AllinEV = (1 - FoldPercent) * ((AllInWinnings * Equity) + (AllInLoses * (1 - Equity)))$
    $AllinExpectedValue = FoldEV + AllinEV$
def AllinExpectedValue(AllIn_Loses, AllIn_Winnings, Fold_Winnings, Fold_Percent, Equity):
    FoldEV = (Fold_Percent * Fold_Winnings)
    AllinEV = (1 - Fold_Percent) * ((AllIn_Winnings * Equity) + (AllIn_Loses * (1 - Equity)))
    AllinExpectedValue = FoldEV + AllinEV
    if AllinExpectedValue > 0:
        return 'Raise!', AllinExpectedValue
    else:
        return 'Fold!', AllinExpectedValue

Agora insira as variáveis da Mão 1 na função AllinExpectedValue e imprima os resultados:

Hand1_Decision, Hand1_EV = AllinExpectedValue(Hand1_AllIn_Loses, Hand1_AllIn_Winnings, Hand1_Fold_Winnings, Hand1_Fold_Percent, Hand1_Equity)
print(Hand1_Decision)
print(Hand1_EV)
Raise!
2.9463250000000016

resultado da mão 1

Hand 1 Results Image here

Hero vence a mão com uma trinca de dez, superando um par de reis.

par de 8 contra aumento pré-flop

visão geral da mão 2

Hand2 Overview

Nesta situação, o Hero (GamingFoSho) apostou \$1.10 e tem \$28.58 restantes. O Villain, por sua vez, aumentou para \$3.80 e tem \$10.66 restantes. Há \$5.40 no pote. É uma situação semelhante à mão anterior. Novamente, dar call não é uma boa opção. Fold não custa nada, então é preciso determinar se o all-in tem valor esperado positivo.

Se o Hero for all-in, ele arrisca \$13.36, já que o Villain tem \$10.66 restantes e aumentou \$2.70. Hero ganha \$16.06 se for all-in e vencer a mão (Villain tem \$10.66 restantes e há \$5.40 no pote) e ganha \$5.40 se for all-in e o Villain desistir.

Hand2_AllIn_Loses = -13.36
Hand2_AllIn_Winnings = 16.06
Hand2_Fold_Winnings = 5.40

estatísticas relevantes da mão 2

Hand2 Stats3 Hand2 Stats1 Hand2 Stats2

  1. Villain está no small blind. Dessa posição, ele dá 3bet 7,2% (100+ ocorrências);
  2. Hero está no cut-off e, contra o cut-off, Villain dá 3bet 7,9% (89 ocorrências);
  3. Villain desiste diante de um 4bet 25% das vezes (8 ocorrências);
  4. Villain dá 3bet 4% no geral (100+ ocorrências), mas contra o Hero apenas 1% (98 ocorrências). Isso é um grande alerta e indica que o Villain tem uma mão muito forte;
  5. Villain dá 3bet fora de posição contra o cut-off 9,8% (51 ocorrências). Fora de posição significa que o Villain vai agir primeiro nas rodadas seguintes, e o Hero, depois.
  6. Villain desiste diante de um 4bet quando está fora de posição 0% (5 ocorrências). Outro grande alerta.

suposições da mão 2

Com base nas estatísticas acima, vou adotar as seguintes suposições:

  1. Em comparação com a maioria dos oponentes, o Villain dá 3bet ~8–10% do tempo, mas parece dar 3bet 4 vezes mais contra outros jogadores que não o Hero. Isso coloca o range do Villain em ~3%.
  2. O Villain ainda não desistiu diante de um 4bet nessa situação; então, no máximo, ele desiste 10% das vezes.
  3. Villain paga com um range de ~2,7%, representado na imagem abaixo.
  4. As mãos em amarelo representam o range presumido do Villain, com 34 das 1326 combinações possíveis de mãos iniciais (2,6%).

Hand2 Range

análise da mão 2

Mais uma vez, usei uma equity calculator para determinar a equidade do Hero. Neste caso, a mão do Hero tem 35,84% de equidade contra o range do Villain.

Agora você pode criar variáveis para EstFoldPercent e Equity.

Hand2_Fold_Percent = .10
Hand2_Equity = .3584

Agora insira as variáveis desta mão na função AllinExpectedValue e imprima os resultados.

Hand2_Decision, Hand2_EV = AllinExpectedValue(Hand2_AllIn_Loses, Hand2_AllIn_Winnings, Hand2_Fold_Winnings, Hand2_Fold_Percent, Hand2_Equity)
print(Hand2_Decision)
print(Hand2_EV)
Fold!
-1.994284799999999

resultado da mão 2

Hand2 Results

Hero vence a mão com uma trinca de oito contra dois pares, ases e reis. Foi um resultado de sorte para uma decisão que daria prejuízo no longo prazo. A jogada ideal aqui é dar fold.

check-raise no flop como semiblefe

visão geral da mão 3

Hand3 Overview

Esta mão está no flop e o Hero (GamingFoSho) é o primeiro a agir e dá check. Ele tem \$25.08. O Villain aposta \$1.06 e tem \$25.37 restantes. Há \$2.66 no pote.

Mais uma vez, call não é uma boa opção, e fold não custa nada. O Hero precisa decidir se aumentar nessa situação, conhecida como semiblefe, tem valor esperado positivo. Um semiblefe é quando você aumenta com uma mão em formação, neste caso, um draw de flush.
O Hero não tem uma mão feita; por enquanto tem apenas Ás alto, mas possui quatro cartas de copas e precisa de mais uma para um flush, que é uma mão forte. Assim como na primeira mão, a melhor linha ao aumentar é fazer um raise pequeno e dar ao Villain a chance de blefar. Se o Hero simplesmente for all-in, o Villain provavelmente desistirá de mãos como Rei de Copas/Valete de Copas.

Hero arrisca \$25.08 se for all-in. Hero ganha \$26.68 se for all-in e vencer a mão. O Villain apostou \$1.06, então o Hero precisa igualar esse valor com parte dos \$25.08 restantes, ficando com \$24.02. Isso significa que ele pode ganhar mais \$24.02 além dos \$2.66 no pote, totalizando \$26.68. Hero ganha \$2.66 se o Villain desistir.

Hand3_AllIn_Loses = -25.08
Hand3_AllIn_Winnings = 26.68
Hand3_Fold_Winnings = 2.66

estatísticas relevantes da mão 3

Hand3Stats1 Hand3Stats2 Hand3Stats3

  1. Pré-flop, o Villain aumentou; de posição intermediária, ele aumenta 9% (100+ ocorrências);
  2. No flop, o Hero dá check, e o Villain (que aumentou pré-flop) aposta de novo. Isso é chamado de continuation bet (Cbet). O Villain faz Cbet 100% das vezes (12 ocorrências);
  3. Hero está dando check-raise no Villain e, diante de um check-raise, o Villain desiste 67% das vezes (3 ocorrências);

suposições da mão 3

  • O range pré-flop do oponente é de ~9–10%, que se parece com isto:

Hand3 PreFlop Range

  • As mãos destacadas em amarelo representam o range do Villain, com 128 das 1326 combinações possíveis (9,7%);
  • Após fazer Cbet 100% das vezes, o Villain desiste ~67% das vezes ao enfrentar o check-raise do Hero, restando ~35–45 combinações no range do Villain. O range dele fica assim:

Hand3 Flop Range

  • Esse range tem 35 combinações e representa as mãos mais fortes do range pré-flop do Villain.
  • Algumas mãos estão em tons diferentes de amarelo. Há dois motivos principais:

    1. Remoção de cartas - Um par de ases (AA) normalmente tem seis combinações (Ouros/Paus, Copas/Paus, Espadas/Paus, Copas/Ouros, Espadas/Ouros, Espadas/Copas), mas o Hero tem o Ás de Copas. O Villain só poderia ter três combinações de AA (Ouros/Paus, Espadas/Paus, Espadas/Ouros).
    2. Flush draws - Existem quatro combinações de Rei/Valete do mesmo naipe (Ouros, Copas, Espadas e Paus), mas o Villain só iria all-in com uma delas (Copas).

análise da mão 3

Mais uma vez, inseri a mão do Hero e o range do Villain na equity calculator, agora também informando as 3 cartas do flop. A calculadora indica que o Hero vence nessa situação em 43,58%.

Agora você pode criar as variáveis para EstFoldPercent e Equity.

Hand3_Fold_Percent = .67
Hand3_Equity = .4358

Agora insira as variáveis da Mão 3 na função AllinExpectedValue e imprima os resultados:

Hand3_Decision, Hand3_EV = AllinExpectedValue(Hand3_AllIn_Loses, Hand3_AllIn_Winnings, Hand3_Fold_Winnings, Hand3_Fold_Percent, Hand3_Equity)
print(Hand3_Decision)
print(Hand3_EV)
Raise!
0.9496126400000008

resultado da mão 3

Hand3 Results

Hero vence com um flush de copas com Ás alto, superando o par de dez do Villain.

conclusão

Parabéns, você concluiu este tutorial sobre teoria da probabilidade com Python! Depois de aprender conceitos fundamentais como eventos independentes/dependentes, permutações e combinações, eventos múltiplos, valores esperados e como calculá-los na primeira parte desta série, você aplicou tudo isso a situações reais de pôquer.

Neste tutorial, você aprofundou seu entendimento de valor esperado e usou o conceito para tomar decisões ótimas na mesa. Esse conceito é extremamente útil para qualquer decisão de negócios ou financeira. Da próxima vez que enfrentar esse tipo de escolha, tente quantificar suas opções em termos de valor esperado.

Temas
Python

Saiba mais sobre Python

Curso

Análise de cluster em Python

4 h
66.1K
Conheça o aprendizado não supervisionado por meio de técnicas como agrupamento hierárquico e k-means usando a biblioteca SciPy.
Ver detalhesRight Arrow
Começar Curso
Ver maisRight Arrow
Relacionado
5 Python Challenges

blog

5 desafios Python para desenvolver suas habilidades

Aumente o nível de suas habilidades em Python com estes cinco desafios de codificação em Python. Faça um teste para ver se você consegue completar um em uma semana!
DataCamp Team's photo

DataCamp Team

5 min

Tutorial

21 ferramentas essenciais do Python

Aprenda sobre as ferramentas Python essenciais para o desenvolvimento de software, raspagem e desenvolvimento da Web, análise e visualização de dados e aprendizado de máquina.
Abid Ali Awan's photo

Abid Ali Awan

6 min

Tutorial

Tutorial de conjuntos e teoria de conjuntos em Python

Aprenda sobre os conjuntos do Python: o que são, como criá-los, quando usá-los, funções incorporadas e sua relação com as operações da teoria dos conjuntos.
DataCamp Team's photo

DataCamp Team

13 min

Tutorial

Sequência de Fibonacci em Python: Aprenda e explore técnicas de programação

Descubra como funciona a sequência de Fibonacci. Explore suas propriedades matemáticas e aplicações no mundo real.
Laiba Siddiqui's photo

Laiba Siddiqui

6 min

Tutorial

Funções em Python: como chamar e escrever funções

Descubra como escrever funções em Python reutilizáveis e eficientes. Domine parâmetros, instruções de retorno e temas avançados como funções lambda. Organize melhor seu código com main() e outras boas práticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Tutorial

Principais técnicas para lidar com valores ausentes que todo cientista de dados deve conhecer

Explore várias técnicas para lidar eficientemente com valores ausentes e suas implementações em Python.
Zoumana Keita 's photo

Zoumana Keita

15 min

Ver MaisVer Mais