个性化阅读
专注于IT技术分析

用Python分析扑克手经典案例

本文概述

使用Python分析扑克手并轻松实现统计概念,如组合、排列、(独立)相关事件和期望值。

在本教程的第一部分中, 你了解了几个概念, 包括独立事件和从属事件, 排列和组合, 多个事件, 期望值, 以及如何计算它们。现在, 你将把这些概念应用于我在职业生涯中玩过的实际扑克游戏。在此过程中, 你将学到更多有关”期望值”的概念以及如何将其用于做出最佳决策的知识。

  • 首先, 你将简要介绍No Limit Texas Hold’em, 以便你掌握完成本教程所需的所有领域知识;
  • 接下来, 你还将了解将在扑克手案例研究中使用的一些工具。
  • 在完成了这两个介绍性部分之后, 你将仔细研究一下在第一篇教程中看到的一个概念:期望值。
  • 最后, 你将经历扑克手:Pocket 10s与翻牌前筹码, Pocket 8s与翻牌前筹码以及Flop Check Raise Semi Bluff。
用Python分析扑克手1

无限德州扑克简介

在开始之前, 需要准备一些背景信息。本文的案例研究将涉及的游戏是”无限德州扑克”。在标准的52张纸牌中, 德州扑克是所有扑克游戏中最受欢迎的一种。每个玩家都试图通过将自己的两张牌与整个手牌发出的五张公共牌相结合来做出最好的五张牌。

庄家按钮左侧的玩家开始操作, 游戏在桌上顺时针移动。通常在庄家按钮左侧的玩家下一个小盲注, 而下一个左侧的玩家下一个大盲注时开始下注。投注行动发生在多条街道上:翻牌前, 翻牌圈, 转牌和河牌。

这是你应该理解的一些术语:

  • 按钮-按钮是一个圆盘, 每只手在顺时针方向绕过桌子。在家庭游戏中, 拥有按钮的人向左手的玩家发出第一张纸牌。在娱乐场, Button标识应该是谁的发牌人, 但实际的发牌人由娱乐场提供。
  • 盲注-盲注是由按钮左侧的两名玩家强制下注的。之所以称为”盲注”, 是因为两名玩家必须下注盲注, 因为他们必须先下注才能看到自己的牌。
  • 街道-发牌的每一轮都称为街道。
  • 翻牌前-这是第一轮下注。每位玩家被发两张牌, 盲注开始下注动作。尚未发行社区卡。
  • 翻牌圈-这是第二轮下注。在这一轮中, 三张公共牌在桌子中间朝上发出, 随后进行一轮下注。
  • 转牌-在这一轮中, 只发出一张公共牌, 随后是第三轮下注。
  • 河流-发出最后一张社区卡, 然后进行最后一轮投注。
  • 摊牌-发牌并完成所有下注动作后, 所有剩余的玩家都要出牌, 看看谁牌手最好。
  • 确认-如果该轮到该行动了, 并且在该轮下注中之前没有进行过任何下注, 则该玩家可以检查选择不下注的方式, 并允许下一位玩家进行下回合。
  • 下注或加注-下注或加注是指在下注回合中增加下注的大小。每个回合中第一个将钱投入彩池的玩家正在下注。如果另一位玩家增加该回合的下注大小, 则他们将进行加注。
  • 通话-如果轮到玩家行动, 并且在该回合中已经下了一个赌注, 则该玩家可以匹配之前的下注, 即所谓的下注。
  • 弃牌-如果轮到玩家行动, 并且在该回合中已经下了赌注, 则玩家可以放弃并弃牌。该玩家不再参与下注, 并且输了所有下的彩池。

如果你从未玩过游戏或不熟悉扑克术语, 可以单击此处以获取简洁但详细的说明。

扑克概率工具

每当我在玩游戏时遇到使我感到困惑的情况时, 我都会标记该手以便稍后进行审查。玩完扑克比赛之后, 我将回到标记为待审核的牌局。我会从数学上将它们分解, 以便我对将来在类似情况下该怎么做有一个更好的了解。

本教程中使用的手牌是由第一部分中提到的软件Hold’em Manager下载并存储在PostgreSQL数据库中的。Hold’emManager通过这些手牌历史记录来计算你与之对抗的每个对手的统计数据。播放时, 数据会实时更新并显示。

我从扑克生涯中选出了三手牌。你将使用当时可用的我的对手的统计数据, 演绎推理和一个称为权益计算器的工具, 对每个可行期权获胜的概率进行假设。

注意:净值计算器用于根据你指示的情况确定赢得一手的概率。你输入自己的牌, 公共牌(如果有的话)以及你假定对手握住的手牌范围。如果剩下的纸牌都发了, 计算器就会提供中奖的可能性。

期望值:仔细研究

在进行第一手分析之前, 你需要对期望值有更好的了解。在第一部分中, 你学习了如何计算赢得$ 100美元底池和75%获胜机会的预期价值。只有两种可能性:

  • 赢\ $ 100
  • 赢\ $ 0

借助公式ExpectedValue = TotalValue×Probability, 你计算出期望值将为\ $ 100 * .75或\ $ 75。

但是, 很多时候你将没有这么简单的计算, 并且可能会有两个以上的结果。要确定期望值, 你必须找到每个可能结果的加权平均值, 其中每个可能结果均以其各自的发生概率进行加权。

因此, 上面的方程式可以更好地表示为:

$期望值=(100 * .75)+(0 * .25)$

$期望值= \ $ 75 $

如果上述情况还有第三种可能的结果怎么办?

看一下以下情况, 你有50%的机会赢得\ $ 100, 有25%的机会赢得\ $ 25, 另外25%的机会完全没有赢:

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

然后, 你的期望值的计算将如下所示:

$期望值=(100 * .50)+(25 * .25)+(0 * .25)$

$期望值= \ $ 56.25 $

现在该将你所学的知识应用于我在扑克桌上遇到的几种情况。

Pocket 10s vs翻牌前加注

注意:复习扑克手时, 通常将对手称为恶棍, 而被复习的玩家称为英雄。你要查看的玩家是” GamingFoSho”, 这是我在所玩扑克网站上的用户名。

手1概述

手1概述

Hero(GamingFoSho)一对10下注\ $ 0.85。他还剩\ $ 95.95。对手或反派加注到\ $ 2.50, 剩余\ $ 30.35。

在扑克术语中, 这称为3bet。小盲注和大盲注是第一个投注, 而Hero则加注了第二个投注。彩池中目前共有\ $ 3.70。调用不是一个好的选择, 原因超出了本博客文章的范围, 无法完全解释。

注意:通常来说, 被动玩扑克是没有利润的, 而积极玩扑克是有利润的。通话是被动的, 下注或加注是激进的。还有其他一些与扑克策略有关的因素, 例如玩家位置, 这些因素表明打电话是一个不好的选择, 但需要大量解释。

英雄必须在全押筹码和下注所有剩余筹码或弃牌之间做出决定。折叠不花任何钱, 因此你将分析全押的期望值。在这种情况下, 我会进行少量加注以使反派成为全押虚张声势, 但必须像进行全押一样进行计算因为那是计划。

如果全押并输了, 英雄将承担\ $ 95.95的风险。全押意味着将你所有的钱都投入到彩池中。英雄剩余\ $ 20.95, 所以全押风险\ $ 20.95。如果全押并获胜, Hero会赢得\ $ 23。目前底池中有\ $ 3.70。英雄押注\ $ 0.85, 反派加注至\ $ 2.50。 Hero必须加上\ $ 1.65的剩余\ $ 20.95才能匹配Villain的加薪, 使Hero剩下\ $ 19.30。这意味着Hero可以在底池中的$ 3.70之外再赢取$ 19.30, 总共¥23.00。由于目前底池中总共有$ 3.70, 如果小人弃牌, Hero会赢取$ 3.70。

Hand1_AllIn_Loses = -20.95
Hand1_AllIn_Winnings = 23
Hand1_Fold_Winnings = 3.7

第1手相关统计

扑克是一种基于不完整信息的演绎推理游戏。在Hold’em Manager中, 我可以查看过去玩过的手, 并查看玩过手时的统计数据。以下是我在玩这手牌时对该对手的一些统计数据的屏幕截图。

数字代表特定情况, 例如从Button翻牌前下注。大多数情况下, 列出两个数字。左侧的数字表示小人在特定情况下采取特定行动的审判百分比。右括号中的数字表示最多99个试验的试验次数。如果括号中没有数字, 则试验次数为100或更多。

我已经与该对手打了392手牌, 并且我强调了与此手牌有关的数据:

Stats1
Stats2
  1. 恶棍处于”按钮”位置, 这是大, 小百叶窗右边的第一个位置。总体而言, 从这个位置来看, 小人3bets占7.4%(27个试验);
  2. 英雄处于”截止”位置, 这是”按钮”右边的第一个位置。总体而言, 相对于下注, 反派3bets为12.5%(16个测试);
  3. 当小人在按钮区与翻牌前的加注时, 小人3bets 25%(4次测试);
  4. 当小人3bets翻牌前面对加注时, 他弃牌50%的时间(2次尝试)。

注意:我如何确定这4点很重要?英雄在切入位置, 小人3bet在按钮位置。我想要统计数据来显示恶棍在类似情况下的过往工作。反派3Bet在按钮位置上与对手在截止位置上相比有多少次?小人多久一次将3Bet弃牌加注?我在上面选择的统计数据最能回答这些问题。

手1的假设

根据上述统计数据, 我将做出以下假设, 这些假设是有根据的猜测;

  1. 反派用可能的起始手范围的(〜)13-15%加注到2.50;
  2. 恶棍约25%的时间弃牌加注, 并有75%的时间全押。
  3. 恶棍以大约10%的范围重新加注”全押”, 如下图所示。
  4. 以黄色突出显示的指针代表小人的假定范围, 该范围由128个组合组成(样本量的9.7%)。
  5. 如果你想知道为什么A5和A2在此范围内, 它们代表了小人的虚张声势。

注意:下图显示了德州扑克中所有可能的起始手组合的样本大小, 即本教程系列第一部分中看到的1326个组合。

手1的假设
  • AA = Ace Ace, KK = King King, 依此类推。
  • AKo = Ace King套装, ATo = Ace 10套装, 依此类推。
  • AK = Ace King, ATs = Ace 10, J8 = Jack 8, 依此类推。

手1分析

既然有了恶棍的射程, 那么你需要确定如果两人全都进入, 则英雄的手胜出恶棍的假设范围的概率。你可以将英雄的手(10h10s)和恶棍的射程插入权益计算器, 以确定英雄获胜的概率。权益计算器可以模拟10h10相对于小人的假定范围数千次, 并确定Hero赢得大约53.77%的时间。

现在, 你可以为EstFoldPercent和Equity创建变量, 然后创建AllinExpectedValue()函数。

Hand1_Fold_Percent = .25
Hand1_Equity = .538

现在, 这是一个简单的计算。你需要构建一个表示以下方程式的函数:

    $ 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

现在, 将Hand 1变量插入AllinExpectedValue函数中并打印结果:

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

第1手结果

手1结果图像在这里

英雄以一组(三个)十张数击败一对国王, 赢得了这手牌。

Pocket 8s vs翻牌前加注

手2概述

Hand2概述

在这种情况下, Hero(GamingFoSho)下注\ $ 1.10, 剩余\ $ 28.58。反面, 反面加注到\ $ 3.80, 还有\ $ 10.66。目前底池中有\ $ 5.40。这种情况与最后一手相似。同样, 打电话也不是一个好选择。折叠不花钱, 因此你需要确定加注全押是否具有正的期望值。

如果Hero全押, 他的风险为$ 13.36, 因为反派人士的剩余$ 10.66, 并且筹集了$ 2.70。如果全押, Hero赢得\ $ 16.06并赢一手(Villain剩余\ $ 10.66, 目前底池中有\ $ 5.40), 如果All-in和Villain弃牌, 则赢取$ 5.40。

Hand2_AllIn_Loses = -13.36
Hand2_AllIn_Winnings = 16.06
Hand2_Fold_Winnings = 5.40

第二手相关统计

Hand2 Stats3
Hand2 Stats1
统计2
  1. 反派处于小盲区。从这个位置开始, 小人3bets 7.2%(100多次试验);
  2. Hero处于截止位置, 对决, Villain 3bets 7.9%(89步);
  3. 恶棍弃牌率降至25%(4bet)(8次试验);
  4. 反派人物3bets的总体下注率为4%(超过100条), 而对阵Hero的下注率仅为1%(98次试验)。这是一个巨大的危险信号, 表明小人的手很强。
  5. 反派3bets失守vs.停牌9.8%(51试验)。位置不正确意味着恶棍将在随后的下注回合中首先出战, 而英雄将成为第二。
  6. 当位置偏离0%时, 反派折叠至4bet(5次试验)。另一个巨大的危险信号。

第二手的假设

根据上述统计数据, 我将做出以下假设;

  1. 与大多数对手相比, 小人3bet的机率约为8-10%, 但与3英雄以外的对手相比, 其3bet的机率是4倍。这使得小人的射程约为3%。
  2. 在这种情况下, 反派还没有弃牌到4bet, 所以反派最多只能折叠10%的时间。
  3. 恶棍的下注幅度为〜2.7%, 如下图所示。
  4. 黄色的双手代表恶棍的假设范围, 其中包括1326种可能的起始手组合中的34种(2.6%)。
Hand2范围

手2分析

再一次, 我将使用权益计算器来确定Hero的权益。在这种情况下, Hero的手拥有35.84%的股权, 而Villain的范围则为35.84%。

现在, 你可以为EstFoldPercent和Equity创建变量。

Hand2_Fold_Percent = .10
Hand2_Equity = .3584

现在, 将这只手的变量插入AllinExpectedValue函数中, 并打印结果。

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

手2结果

Hand2结果

英雄以八和二的两张王牌和王牌获胜。这是从长远来看会赔钱的决定的幸运结果。这里的最佳玩法是弃牌。

翻牌加注半诈Bl

手3概述

Hand3概述

这只手在翻牌圈, Hero(GamingFoSho)首先行动并进行检定。他有\ $ 25.08。恶棍下注\ $ 1.06, 剩余\ $ 25.37。目前底池中有\ $ 2.66。

再说一次, 打电话不是一个好选择, 而折叠不花钱。英雄必须决定在这种情况下的加注(半诈骗)是否具有正的期望值。半虚张声势是指你用绘图手进行加注时的情况, 在这种情况下为同花。

Hero没有一手牌, 因为他目前只拿到A牌高牌, 但是他有四颗红心, 并且只需要多一手就可以抽成一手强牌。就像第一手一样, 加注时最好的游戏路线是加注小并且给反派机会虚张声势。如果英雄要全力以赴, 恶棍很可能会像红心王/红心王一样弃牌。

如果全押, 英雄风险为\ $ 25.08。如果全押并获胜, Hero会赢得\ $ 26.68。恶棍下注\ $ 1.06, 因此Hero必须与剩余的\ $ 25.08中的该金额匹配, 而Hero剩下\ $ 24.02。这意味着Hero可以在目前底池中的$ 2.66之外再赢取$ 24.02, 共计$ 26.68。如果小人弃牌, Hero会赢得\ $ 2.66。

Hand3_AllIn_Loses = -25.08
Hand3_AllIn_Winnings = 26.68
Hand3_Fold_Winnings = 2.66

第三手相关统计

Hand3Stats1
Hand3Stats2
统计3
  1. 翻牌前, 反派加注, 并且从中间位置开始, 反派加注9%(100条以上的步道);
  2. 在翻牌圈, Hero下注, 而Villain(翻牌前加注)再次下注。这称为连续投注(Cbet)。恶棍100%(12次试验);
  3. Hero是Check-Raising小人, 当面对Check-Raise时, Villain弃牌率67%(3次测试);

手3的假设

  • 对手翻牌前的范围是〜9-10%, 看起来像这样:
Hand3翻牌前范围
  • 以黄色突出显示的双手代表恶棍的范围, 其中包括1326种可能的起始手组合中的128种(9.7%);
  • 在100%的情况下下注之后, 小人有约67%的时间弃牌进入英雄的检定加注, 剩下约35-45个组合在小人的范围内。反派的范围如下所示:
Hand3翻牌范围

这个范围包括35个组合, 是Villain翻牌前范围中最强的手。

有些手是深浅不一的黄色。有两个原因。

  1. 移除卡-口袋A(AA)通常具有六种组合(钻石/俱乐部, 心/俱乐部, 黑桃/俱乐部, 心/钻石, 黑桃/钻石, 黑桃/心), 但英雄拥有红心王牌。反派只能有三种口袋王牌组合(钻石/俱乐部, 黑桃/俱乐部, 黑桃/钻石)。
  2. 同花抽牌-有四种适合的国王/杰克组合(钻石, 红心, 黑桃和棍棒), 但小人只可以使用其中一个连击(心)全部进入。

手3分析

我再次将Hero的手和Villain的范围插入到净值计算器中, 这次也输入了3张翻牌。资产计算器显示Hero在这种情况下获胜43.58%。

现在, 你可以为EstFoldPercent和Equity创建变量。

Hand3_Fold_Percent = .67
Hand3_Equity = .4358

现在将Hand 3变量插入AllinExpectedValue函数并打印结果:

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

3手结果

Hand3结果

英雄赢与高手同花顺, 击败恶棍一对十。

总结

恭喜, 你现在已经完成了使用Python进行概率论的本教程!在学习了核心概率概念(包括独立/从属事件, 排列和组合, 多个事件, 期望值)以及如何在本概率和统计教程系列的第一部分中计算它们的每一个之后, 你将这些概念应用于了现实扑克环境。

在本教程中, 你对期望值有了更深入的了解, 并使用该概念在扑克桌上做出了最佳决策。在做出任何业务或财务决策时, 这一概念是一个非常有用的概念, 因此, 下次你面对此类决策时, 请尝试根据预期价值来量化你的选择。

赞(0)
未经允许不得转载:srcmini » 用Python分析扑克手经典案例

评论 抢沙发

评论前必须登录!