Ir al contenido principal

Análisis de jugadas de póker con Python

Analiza jugadas de póker con Python e implementa sin complicaciones conceptos estadísticos como combinaciones, permutaciones, sucesos (in)dependientes y valor esperado.
Actualizado 17 sept 2026  · 15 min leer

Explorar con IA

ChatGPTClaudePerplexity

En la primera parte de este tutorial, viste varios conceptos como sucesos independientes y dependientes, permutaciones y combinaciones, sucesos múltiples, valores esperados y cómo calcular cada uno de ellos. Ahora vas a aplicar esos conceptos a jugadas reales de póker que jugué a lo largo de mi carrera. Por el camino, profundizarás mucho más en el concepto de valor esperado y en cómo usarlo para tomar decisiones óptimas.

  • Primero, verás una breve introducción a No Limit Texas Hold’em para que tengas el contexto necesario para completar el tutorial;
  • Después, conocerás algunas herramientas que usaremos en los casos prácticos de manos de póker.
  • Tras estas dos secciones introductorias, volverás sobre un concepto que ya viste en el primer tutorial: el valor esperado.
  • Por último, analizarás tres manos: pareja de 10 frente a subida preflop, pareja de 8 frente a subida preflop y check-raise de semifarol en el flop.

cartas

Introducción a No Limit Texas Hold’em

Antes de empezar, conviene repasar un poco de contexto. El juego que analizaremos en los casos prácticos de este artículo es No Limit Texas Hold’em. Se juega con una baraja estándar de 52 cartas y es la variante de póker más popular. Cada jugador intenta formar la mejor mano posible de cinco cartas combinando sus dos cartas privadas con las cinco comunitarias que se reparten durante la mano.

El jugador a la izquierda del botón del crupier inicia la acción y el juego avanza en el sentido de las agujas del reloj. La apuesta suele comenzar cuando el jugador a la izquierda del botón publica la ciega pequeña y el siguiente jugador a su izquierda publica la ciega grande. La acción de apuestas se desarrolla en varias calles: preflop, flop, turn y river.

Aquí tienes algunos términos que conviene conocer:

  • Botón: ficha circular que va rotando en sentido horario después de cada mano. En una partida casera, quien tiene el botón reparte, empezando por el jugador a su izquierda. En un casino, el botón indica quién sería el repartidor, pero el crupier real lo proporciona el casino.
  • Las ciegas: apuestas obligatorias de los dos jugadores a la izquierda del botón. Se llaman «ciegas» porque se hacen sin ver las cartas.
  • Calles: cada ronda en la que se reparten cartas se denomina calle.
  • Preflop: primera ronda de apuestas. A cada jugador se le reparten dos cartas y las ciegas inician la acción. Aún no hay cartas comunitarias.
  • Flop: segunda ronda de apuestas. Se descubren tres cartas comunitarias en el centro de la mesa y se realiza una ronda de apuestas.
  • Turn: se descubre una sola carta comunitaria y tiene lugar la tercera ronda de apuestas.
  • River: se descubre la última carta comunitaria y se realiza la última ronda de apuestas.
  • Showdown: tras el river y una vez finalizada la acción, los jugadores que siguen en la mano muestran sus cartas para ver quién tiene la mejor mano.
  • Check: si es tu turno de actuar y nadie ha apostado en esa ronda, puedes pasar (check), es decir, no apostar y ceder el turno al siguiente jugador.
  • Bet o raise: apostar o subir es aumentar el tamaño de la apuesta durante una ronda. El primer jugador que pone dinero en el bote en cada ronda está apostando (bet). Si otro jugador incrementa esa apuesta, está subiendo (raise).
  • Call: si es tu turno de actuar y ya hay una apuesta en esa ronda, puedes igualarla; esto se conoce como pagar (call).
  • Fold: si es tu turno de actuar y ya hay una apuesta, puedes retirarte (fold). Dejas de participar en la mano y pierdes el dinero que ya hubieras puesto en el bote.

Si nunca has jugado o no te suena la terminología del póker, puedes hacer clic aquí para ver una explicación concisa pero detallada.

Herramientas de probabilidad para póker

Siempre que, jugando, me encontraba con una situación que me generaba dudas, marcaba la mano para revisarla después. Al terminar la sesión, volvía a las manos que había marcado. Las descomponía matemáticamente para tener más claro qué hacer en situaciones similares en el futuro.

Las manos usadas en este tutorial se descargaron y almacenaron en una base de datos PostgreSQL mediante Hold’em Manager, software mencionado en la Parte I. Hold’em Manager calcula estadísticas a partir de los historiales de manos de cada rival contra el que juegas. Los datos se actualizan y muestran en tiempo real mientras juegas.

He seleccionado tres manos de mi carrera. Usarás estadísticas de mis rivales que tenía disponibles entonces, razonamiento deductivo y una herramienta llamada calculadora de equity para estimar la probabilidad de ganar la mano para cada opción viable.

Nota: una calculadora de equity se usa para estimar la probabilidad de ganar una mano en una situación concreta. Introduces tus cartas, las comunitarias (si las hay) y el rango de manos que supones que lleva tu rival. La calculadora te ofrece la probabilidad de ganar la mano si se reparten las cartas restantes.

Valor esperado: un vistazo más de cerca

Antes de pasar al análisis de la primera mano, necesitas entender mejor el valor esperado. En la Parte I aprendiste a calcular tu valor esperado al optar a un bote de 100\$ con un 75% de probabilidad de ganar. Solo había dos posibilidades:

  • Ganar 100\$
  • Ganar 0\$

Usando la fórmula ExpectedValue=TotalValue×Probability, calculaste que el valor esperado sería 100\$ * 0,75, es decir, 75\$.

Sin embargo, muchas veces el cálculo no es tan directo y hay más de dos resultados posibles. Para determinar el valor esperado, debes hallar la media ponderada de cada resultado posible, donde cada resultado se pondera por su probabilidad de ocurrencia.

Por eso la ecuación anterior se representaría mejor así:

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

¿Y si hubiera un tercer resultado posible en el ejemplo anterior?

Fíjate en esta situación, donde tienes un 50% de ganar 100\$, un 25% de ganar 25\$ y otro 25% de no ganar nada:

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

Entonces, el cálculo de tu valor esperado sería:

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

Ahora toca aplicar lo aprendido a varios escenarios que me encontré en la mesa.

Pareja de 10 frente a subida preflop

Nota: Al revisar manos de póker, es habitual llamar Villain al rival y Hero al jugador analizado. El jugador que revisarás es ‘GamingFoSho’, que era mi nombre de usuario en las salas donde jugaba.

Resumen de la mano 1

Resumen mano 1

Hero (GamingFoSho) tiene una pareja de 10 y apuesta 0,85\$. Le quedan 20,95\$. El rival (Villain) resube a 2,50\$ y le quedan 30,35\$.

En la jerga del póker, esto es una 3bet. La ciega pequeña y la grande hacen la primera apuesta, y Hero las sube, que es la segunda apuesta. Ahora mismo hay 3,70\$ en el bote. Pagar no es una buena opción por razones que se salen del alcance de este artículo.

Nota: en términos generales, jugar pasivo no es rentable y jugar agresivo sí lo es. Pagar es pasivo; apostar o subir es agresivo. Hay otros factores estratégicos como la posición que también indican que pagar es mala opción, pero requerirían mucha más explicación.

Hero debe decidir entre subir con la idea de ir all-in (apostar todas sus fichas) o foldear. Retirarse no cuesta nada, así que analizaremos el valor esperado de ir all-in. En esta situación, haría una subida pequeña para inducir a Villain a ir all-in de farol, pero el cálculo debe hacerse como si fuera all-in, ya que ese es el plan.

Hero arriesga 20,95\$ si va all-in y pierde. Ir all-in significa poner todo tu dinero en el bote. A Hero le quedan 20,95\$, así que arriesga 20,95\$. Hero gana 23\$ si va all-in y gana. Ahora hay 3,70\$ en el bote. Hero apostó 0,85\$ y Villain subió a 2,50\$. Hero debe añadir 1,65\$ de los 20,95\$ que le quedan para igualar, quedándole 19,30\$. Esto significa que puede ganar 19,30\$ adicionales además de los 3,70\$ del bote, para un total de 23,00\$. Si Villain se tira, Hero gana los 3,70\$ actuales del bote.

Hand1_AllIn_Loses = -20.95
Hand1_AllIn_Winnings = 23
Hand1_Fold_Winnings = 3.7

Estadísticas relevantes de la mano 1

El póker es un juego de razonamiento deductivo con información incompleta. En Hold’em Manager puedo revisar manos que jugué y ver las estadísticas que tenía en el momento. A continuación tienes capturas con algunas estadísticas que tenía de este rival cuando se jugó esta mano.

Los números representan situaciones concretas, como apostar preflop desde el botón. La mayoría de las veces aparecen dos números. El de la izquierda indica el porcentaje de veces que Villain realizó una acción concreta en una situación concreta. El número entre paréntesis a la derecha indica el número de muestras hasta 99. Si no hay número entre paréntesis, el número de muestras es 100 o más.

Había jugado 392 manos contra este rival y destaqué las estadísticas relevantes para esta mano:

Stats1

Stats2

  1. Villain está en el botón, que es la posición a la derecha de las ciegas. Desde ahí, hace 3bet el 7,4% (27 muestras);
  2. Hero está en el cut-off, la posición a la derecha del botón. Frente al cut-off, Villain hace 3bet el 12,5% (16 muestras);
  3. Cuando Villain está en el botón y se enfrenta a una subida preflop del cut-off, hace 3bet el 25% (4 muestras);
  4. Cuando Villain hace 3bet preflop y se enfrenta a una resubida, foldea el 50% de las veces (2 muestras).

Nota: ¿Cómo decidí que estos 4 puntos eran importantes? Hero estaba en el cut-off y Villain hizo 3bet desde el botón. Quiero estadísticas de lo que Villain ha hecho antes en situaciones parecidas. ¿Con qué frecuencia hace 3bet desde el botón o contra un jugador en el cut-off? ¿Con qué frecuencia foldea su 3bet ante una subida? Las estadísticas seleccionadas son las que mejor responden a esas preguntas.

Suposiciones para la mano 1

Basándome en las estadísticas anteriores, haré las siguientes suposiciones (estimaciones fundamentadas):

  1. Villain sube a 2,50 con ~13–15% del rango de manos iniciales posibles;
  2. Villain foldea ante una resubida ~25% de las veces y va all-in ~75%;
  3. Villain resube all-in con un rango ~10%, representado en la imagen de abajo.
  4. Las manos resaltadas en amarillo representan el rango asumido de Villain, con 128 combinaciones (9,7% del total).
  5. Si te preguntas por qué A5s y A2s están en el rango, representan los faroles de Villain.

Nota: La imagen siguiente representa todas las combinaciones posibles de manos iniciales en Texas Hold’em, que son 1326, como viste en la primera parte de esta serie.

Suposiciones mano 1

  • AA = As As, KK = Rey Rey, etc.
  • AKo = As Rey offsuit, ATo = As Diez offsuit, etc.
  • AKs = As Rey suited, ATs = As Diez suited, J8s = Jota Ocho suited, etc.

Análisis de la mano 1

Con el rango de Villain definido, necesitas determinar la probabilidad de que la mano de Hero gane contra ese rango si ambos van all-in. Puedes introducir la mano de Hero (10h10s) y el rango de Villain en una calculadora de equity para estimar la probabilidad de victoria. La calculadora simula 10h10s contra el rango asumido miles de veces y determina que Hero gana alrededor del 53,77% de las veces.

Ahora puedes crear las variables EstFoldPercent y Equity, y luego crear tu función AllinExpectedValue().

Hand1_Fold_Percent = .25
Hand1_Equity = .538

Ahora el cálculo es sencillo. Debes construir una función que represente la siguiente ecuación:

    $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

Ahora introduce las variables de la mano 1 en la función AllinExpectedValue e imprime los 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

Resultados de la mano 1

Resultados mano 1

Hero gana la mano con trío de dieces venciendo a una pareja de reyes.

Pareja de 8 frente a subida preflop

Resumen de la mano 2

Resumen mano 2

En esta situación, Hero (GamingFoSho) apuesta 1,10\$ y le quedan 28,58\$. Villain, por su parte, sube a 3,80\$ y le quedan 10,66\$. Ahora hay 5,40\$ en el bote. Es una situación similar a la anterior. De nuevo, pagar no es buena opción. Retirarse no cuesta nada, así que hay que determinar si subir all-in tiene valor esperado positivo.

Si Hero va all-in, arriesga 13,36\$ ya que a Villain le quedan 10,66\$ y ha subido 2,70\$. Hero gana 16,06\$ si va all-in y gana la mano (a Villain le quedan 10,66\$ y ahora hay 5,40\$ en el bote) y gana 5,40\$ si va all-in y Villain se tira.

Hand2_AllIn_Loses = -13.36
Hand2_AllIn_Winnings = 16.06
Hand2_Fold_Winnings = 5.40

Estadísticas relevantes de la mano 2

Stats mano 2-3 Stats mano 2-1 Stats mano 2-2

  1. Villain está en la ciega pequeña. Desde ahí hace 3bet el 7,2% (100+ muestras);
  2. Hero está en el cut-off, y contra el cut-off Villain hace 3bet el 7,9% (89 muestras);
  3. Villain foldea ante una 4bet el 25% (8 muestras);
  4. Villain hace 3bet un 4% en general (100+ muestras), pero contra Hero solo un 1% (98 muestras). Es una señal clara de que Villain lleva una mano muy fuerte;
  5. Villain hace 3bet fuera de posición contra el cut-off un 9,8% (51 muestras). Fuera de posición significa que actuará primero en las calles posteriores y Hero después.
  6. Villain foldea ante una 4bet cuando está fuera de posición el 0% (5 muestras). Otra señal preocupante.

Suposiciones para la mano 2

Con base en las estadísticas anteriores, haré estas suposiciones:

  1. Comparado con la mayoría, Villain hace 3bet ~8–10% del tiempo, pero parece hacerlo 4 veces más a rivales que no son Hero. Esto sitúa su rango contra Hero en ~3%.
  2. Villain aún no ha foldeado ante una 4bet en esta situación, así que como mucho se tira el 10% de las veces.
  3. Villain paga con un rango ~2,7%, representado en la imagen siguiente.
  4. Las manos en amarillo representan el rango asumido de Villain: 34 de las 1326 combinaciones posibles (2,6%).

Rango mano 2

Análisis de la mano 2

De nuevo usaré una calculadora de equity para estimar la equity de Hero. En este caso, la mano de Hero tiene un 35,84% de equity frente al rango de Villain.

Ahora puedes crear las variables EstFoldPercent y Equity.

Hand2_Fold_Percent = .10
Hand2_Equity = .3584

Introduce las variables de esta mano en la función AllinExpectedValue e imprime los 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

Resultados de la mano 2

Resultados mano 2

Hero gana con trío de ochos frente a dos pares (ases y reyes). Fue un resultado afortunado de una decisión que, a la larga, pierde dinero. La jugada óptima aquí es foldear.

Check-raise de semifarol en el flop

Resumen de la mano 3

Resumen mano 3

Esta mano está en el flop y Hero (GamingFoSho) actúa primero y pasa. Le quedan 25,08\$. Villain apuesta 1,06\$ y le quedan 25,37\$. Hay 2,66\$ en el bote.

Otra vez, pagar no es buena opción y foldear no cuesta nada. Hero debe decidir si subir en esta situación, lo que se conoce como semifarol, tiene valor esperado positivo. Un semifarol es cuando subes con una mano de proyecto, en este caso de color. Hero no tiene mano hecha (solo As alto), pero tiene cuatro corazones y le falta uno para completar color, que es una mano fuerte. Igual que en la primera mano, la mejor línea al subir es hacerlo pequeño y dar a Villain la oportunidad de farolear. Si Hero fuera directamente all-in, Villain probablemente foldearía manos como Rey de corazones/Jota de corazones.

Hero arriesga 25,08\$ si va all-in. Hero gana 26,68\$ si va all-in y gana la mano. Villain apuesta 1,06\$, así que Hero debe igualar esa cantidad de los 25,08\$ que le quedan, quedándole 24,02\$. Esto significa que puede ganar 24,02\$ adicionales además de los 2,66\$ actuales del bote, para un total de 26,68\$. Si Villain foldea, Hero gana 2,66\$.

Hand3_AllIn_Loses = -25.08
Hand3_AllIn_Winnings = 26.68
Hand3_Fold_Winnings = 2.66

Estadísticas relevantes de la mano 3

Stats mano 3-1 Stats mano 3-2 Stats mano 3-3

  1. Preflop, Villain subió y, desde posición media, sube el 9% (100+ muestras);
  2. En el flop, Hero pasa y Villain (que subió preflop) apuesta de continuación. Villain hace c-bet el 100% (12 muestras);
  3. Hero hace check-raise a Villain y, ante un check-raise, Villain foldea el 67% (3 muestras);

Suposiciones para la mano 3

  • El rango preflop del rival es ~9–10%, que se ve así:

Rango preflop mano 3

  • Las manos resaltadas en amarillo representan el rango de Villain: 128 de las 1326 combinaciones posibles (9,7%);
  • Tras hacer c-bet el 100% de las veces, Villain foldea ~67% ante el check-raise de Hero, quedándole ~35–45 combinaciones en su rango. El rango de Villain queda así:

Rango en flop mano 3

  • Este rango consta de 35 combinaciones y recoge las manos más fuertes del rango preflop de Villain.
  • Algunas manos aparecen en distintos tonos de amarillo por dos motivos:

    1. Eliminación de cartas: pareja de ases (AA) suele tener seis combinaciones (diamantes/tréboles, corazones/tréboles, picas/tréboles, corazones/diamantes, picas/diamantes, picas/corazones), pero Hero tiene el as de corazones. Villain solo podría tener tres combinaciones (diamantes/tréboles, picas/tréboles, picas/diamantes).
    2. Proyectos de color: hay cuatro combinaciones de Rey/Jota suited (diamantes, corazones, picas y tréboles), pero Villain solo iría all-in con una de ellas (corazones).

Análisis de la mano 3

De nuevo, introduzco la mano de Hero y el rango de Villain en la calculadora de equity, esta vez también con las 3 cartas del flop. La calculadora indica que Hero gana en esta situación el 43,58%.

Ahora puedes crear tus variables EstFoldPercent y Equity.

Hand3_Fold_Percent = .67
Hand3_Equity = .4358

Introduce las variables de la mano 3 en la función AllinExpectedValue e imprime los 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

Resultados de la mano 3

Resultados mano 3

Hero gana con color al as, superando la pareja de dieces de Villain.

Conclusión

¡Enhorabuena! Has completado este tutorial de teoría de la probabilidad con Python. Tras aprender conceptos clave como sucesos independientes/dependientes, permutaciones y combinaciones, sucesos múltiples y valores esperados, y cómo calcularlos en la primera parte de esta serie, los has aplicado a situaciones reales de póker.

En este tutorial, has profundizado en el valor esperado y lo has usado para tomar decisiones óptimas en la mesa. Es un concepto extremadamente útil para cualquier decisión empresarial o financiera, así que la próxima vez que te enfrentes a una, intenta cuantificar tus opciones en términos de valor esperado.

Temas
Python

Más sobre Python

Curso

Análisis de clústeres en Python

4 h
65.8K
Este curso te presenta el aprendizaje no supervisado con la biblioteca SciPy mediante técnicas como los clústeres jerárquicos y de k-medias.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

Funciones en Python: cómo llamar y escribir funciones

Descubre cómo escribir funciones en Python reutilizables y eficientes. Domina los parámetros, las sentencias return y temas avanzados como las funciones lambda. Organiza mejor tu código con main() y otras buenas prácticas.
Karlijn Willems's photo

Karlijn Willems

14 min

Tutorial

21 herramientas esenciales de Python

Conozca las herramientas esenciales de Python para el desarrollo de software, raspado y desarrollo web, análisis y visualización de datos y aprendizaje automático.
Abid Ali Awan's photo

Abid Ali Awan

6 min

Tutorial

Las mejores técnicas para gestionar valores perdidos que todo científico de datos debe conocer

Explore varias técnicas para manejar eficazmente los valores perdidos y sus implementaciones en Python.
Zoumana Keita 's photo

Zoumana Keita

15 min

Tutorial

Optimización en Python: Técnicas, Paquetes y Buenas Prácticas

Este artículo te enseña la optimización numérica, destacando diferentes técnicas. Analiza paquetes de Python como SciPy, CVXPY y Pyomo, y proporciona un práctico cuaderno DataLab para ejecutar ejemplos de código.
Kurtis Pykes 's photo

Kurtis Pykes

11 min

Tutorial

Tutorial de Python sobre conjuntos y teoría de conjuntos

Aprende sobre los conjuntos en Python: qué son, cómo crearlos, cuándo usarlos, funciones incorporadas y su relación con las operaciones de la teoría de conjuntos.
DataCamp Team's photo

DataCamp Team

13 min

data-frames-in-python-banner_cgzjxy.jpeg

Tutorial

Tutorial de Pandas: DataFrames en Python

Explora el análisis de datos con Python. Los DataFrames de Pandas facilitan la manipulación de tus datos, desde la selección o sustitución de columnas e índices hasta la remodelación de tus datos.
Karlijn Willems's photo

Karlijn Willems

15 min

Ver MásVer Más