Skip to content
[OPEN_POKER]

Poker Bot筹码管理:有效的Buy-In策略

JJoão Carvalho||14 min read

大多数poker bot使用默认的2,000筹码buy-in(10/20盲注下的100大盲)然后再也不考虑这个问题。这等于把筹码留在桌上。Buy-in大小决定了你在翻牌后每条street的stack-to-pot ratio,而SPR是bot策略中最被低估的杠杆。

什么是stack-to-pot ratio(SPR)?

Stack-to-pot ratio是翻牌后开始时你的剩余筹码除以底池大小。如果你加注到60,一个对手跟注,底池是130(你的加注+他们的跟注+30盲注),2,000筹码的stack剩下大约1,940筹码。你的SPR是1,940 / 130 = 大约15。

SPR重要是因为它告诉你的手牌需要多少承诺才值得。低SPR(4以下)意味着几乎任何top-pair手牌都已承诺:你可以有利可图地用对子和大draw全下。高SPR(13以上)意味着你需要更强的手牌才能打光筹码:top pair变成单条street的value bet,而不是全下手牌。

这个框架来自Flynn、Mehta和Miller的Professional No-Limit Hold'em (Volume I),2007年出版。对于必须在有限时间内做决策的bot来说,这仍然是思考翻牌后sizing最清晰的方式。

为什么默认100bb buy-in亏钱?

默认2,000筹码buy-in(10/20盲注下100bb)在单次加注底池中创建约13-15的SPR。这是尴尬的中间地带:太深无法用一对承诺,太浅无法用隐含赔率打4条street的牌。这也是所有人都用的buy-in,意味着你的bot在和桌面平均值相同的SPR配置下游戏。

问题在于100bb的最优打法被人类充分研究并被GTO solver良好实现。如果你的bot在这个范围内做出次优决策,它是在对做出更接近最优决策的对手这样做。

短筹码方法(40-50bb)极大地简化了翻牌后的博弈树。大多数决策在转牌时变成"全下或弃牌",这比在湿润牌面上精心控制底池容易正确编码得多。我们看到短筹码bot以1-2 bb/100超过其深筹码版本,不是因为短筹码绝对"更好",而是因为它更容易正确执行。

你的bot应该用哪个buy-in?

三种场景,三种不同的buy-in选择。根据你的bot擅长什么来选择。

1,000筹码(50bb):简化打法。 这是Open Poker上最低的合法buy-in。单次加注后SPR在7-8左右。翻牌后博弈树浅,大多数合理手牌在转牌时已承诺。当你的bot有不错的翻牌前打法但翻牌后复杂度有限时使用。也将每次会话的损失减半:bad beat让你损失1,000而不是2,000。

2,000筹码(100bb):默认值。 SPR约13-15。平台上70%的bot使用这个。你的bot将以合理的筹码深度打平衡的翻牌后手牌。当你的bot能处理多条street的决策,包括底池控制、河牌bluff-catching和多人底池时使用。

4,000-5,000筹码(200-250bb):深筹码打法。 单次加注底池中SPR超过25。翻牌后博弈树爆炸:隐含赔率重要,set-mining变得有利可图,小优势在多条street上复合累积。仅当你的bot有强大的翻牌后手牌阅读能力且你已经在100bb证明了盈利时使用。否则额外的深度是负担。

join_lobby消息中的buy_in字段控制这一点。有效范围是1,000到5,000筹码。完整消息详情在WebSocket协议文档中。

如何在season中调整buy-in?

静态buy-in选择会遗留价值在桌上。聪明的bot根据结果调整buy-in。

框架:从小开始,赢了就扩大。每个season以1,000筹码buy-in开始。追踪前200-300手的结果。如果盈利(筹码总数高于起始基线),下一个会话增加到2,000。如果再盈利300手,考虑3,000。一旦胜率持平或下降就停止增加深度。

为什么有效?因为大多数bot在某个筹码深度有"能力上限"。围绕翻牌前range和简单翻牌后sizing设计的bot可能在50bb盈利但在200bb持平或亏损。更深的资金需要bot无法做出的read。超出能力上限增加筹码深度只会增加方差而不增加优势。

程序化追踪。调用GET /api/season/me读取当前筹码总数和已玩手数。与上次buy-in更改比较。如果(当前筹码 - 上次更改时筹码) / 更改以来的手数 > 1,你在这个深度正在赢钱可以扩大。如果为负,下个会话回到更小的buy-in。

bot何时应该短rebuy?

Rebuy恢复1,500筹码,让你处于标准buy-in 1,000和2,000之间。这实际上是SPR工作的sweet spot:SPR约11-12,比100bb默认略浅,简化翻牌后决策而不强迫你每个翻牌都推。

一些bot rebuy后立即试图通过在下一张桌子买更深来"重建"到5,000。我们观察排行榜发现这个模式与更差的表现相关,而不是更好。刚刚破产的bot和失去前一个stack的是同一个bot。添加筹码不能修复漏洞。它会放大漏洞。

更好的方法:rebuy,坐在相同的buy-in水平(或更小),通过打牌恢复。冷却时间强制rebuy之间5分钟暂停(Pro tier为2分钟),足够时间记录破产并标记是否有值得调查的策略bug。

按buy-in的bb/100表现如何?

我们从多个season提取了手牌历史并按平均buy-in对bot进行分组。模式足够一致值得信赖:

平均Buy-in中位数bb/100(上四分位)中位数bb/100(下四分位)
1,000(50bb)+4.2-2.1
2,000(100bb)+3.1-3.8
3,000(150bb)+2.4-5.6
4,000(200bb)+1.9-7.2
5,000(250bb)+1.5-9.4

两个模式很突出。第一,上下四分位之间的差距随buy-in增大而扩大。深筹码游戏更积极地奖励技能,但也更积极地惩罚技能不足。第二,上四分位的优势实际上随buy-in增大而缩小。最好的bot在深度游戏时每100手赚更少,即使它们的整体优势是真实的。

这不矛盾。深度游戏对每手牌的方差更友好(因为底池可以大得多),但每手牌的优势更小,因为大多数spot更接近均衡。如果你在优化14天season的总筹码,较小buy-in的优势通常胜出,因为它产生更少的灾难。

如何实现SPR感知的sizing?

最简单的实现是按当前SPR索引的查找表。在每手牌开始时使用your_turn消息中的底池大小和剩余筹码计算SPR。然后根据你所在的SPR区间选择下注大小:

def spr_sizing(your_turn_msg, hand_strength):
    """Pick a bet size based on current SPR and hand strength.
 
    hand_strength: 0.0 (air) to 1.0 (nuts).
    Returns: (action, amount) tuple.
    """
    pot = your_turn_msg["pot"]
    my_stack = your_turn_msg["my_stack"]
    spr = my_stack / pot if pot > 0 else 100
 
    valid = {a["action"]: a for a in your_turn_msg["valid_actions"]}
 
    # Low SPR: commit with strong hands, give up with air
    if spr < 4:
        if hand_strength > 0.5 and "all_in" in valid:
            return ("all_in", valid["all_in"]["amount"])
        if hand_strength > 0.3 and "call" in valid:
            return ("call", valid["call"]["amount"])
        return ("fold", 0)
 
    # Medium SPR: standard pot-sized betting
    if spr < 13:
        if hand_strength > 0.7 and "raise" in valid:
            target = int(pot * 0.75)
            amt = max(valid["raise"]["min"], min(target, valid["raise"]["max"]))
            return ("raise", amt)
        if hand_strength > 0.4 and "call" in valid:
            return ("call", valid["call"]["amount"])
        return ("fold", 0)
 
    # High SPR: protect stack, only commit with the nuts
    if hand_strength > 0.85 and "raise" in valid:
        target = int(pot * 0.66)
        amt = max(valid["raise"]["min"], min(target, valid["raise"]["max"]))
        return ("raise", amt)
    if hand_strength > 0.55 and "call" in valid:
        return ("call", valid["call"]["amount"])
    return ("fold", 0)

这是故意简化的。区间很宽,sizing很粗略。重点不是最优;而是做出响应实际筹码深度的sizing决策,而不是把每手牌同等对待。根据你的胜率数据来改进。

我们在筹码管理上犯的错误

我们的第一次分析将100bb视为"正确"的深度,假设更短的buy-in严格更差。我们错了。我们看到多个season排名前10的bot几乎完全使用1,000筹码buy-in,浅筹码方法是一个深思熟虑的选择,而不是新手错误。

他们的开发者给出的理由是一致的:浅筹码减少每手牌的决策数量。更少的决策意味着bot犯错的机会更少。50bb的平庸bot可以超过200bb的雄心勃勃但在应对超出准备的策略复杂性的bot。

我们不是说要把所有东西都短筹码。我们是说根据你的bot擅长什么来选择筹码深度,而不是根据什么感觉"真实"或"深"或"有竞争力"。你的bot不在乎扑克文化。它在乎筹码总数。

FAQ

Open Poker的默认buy-in是多少? 默认是2,000筹码,在平台10/20盲注结构下是100大盲。有效范围是1,000到5,000筹码。通过join_lobbyWebSocket消息的buy_in字段或REST API设置。

可以在会话中途更改buy-in吗? Buy-in在你加入桌子时设定,在该桌子期间固定不变。要使用不同的buy-in,离开当前桌子并用新金额重新加入。服务器在该桌子会话期间维持选择的buy-in。

Buy-in影响排行榜分数吗? 间接影响。你的分数是总筹码(账户余额加桌上筹码),所以你带到桌子上的任何筹码仍然计入。Buy-in不改变公式,但改变你的预期方差和bot需要导航的翻牌后博弈树。

为什么更多bot不用短筹码? 主要是文化惯性。100bb是人类扑克中的"标准深筹码",所以大多数开发者不质疑就采用它。更浅的筹码在Open Poker上完全可行,对早期阶段的bot通常更合适。

Pro tier会改变buy-in限制吗? 不会。1,000-5,000筹码范围适用于所有bot,不论tier。Pro tier缩短rebuy冷却时间并解锁分析功能,但buy-in机制在所有tier之间相同。完整差异列表见Pro功能比较


筹码管理是你的bot能获得的最便宜的策略升级。不需要手牌评估,不需要对手建模,不需要复杂数学。只需为join_lobby消息选择正确的数字。注册一个bot,针对当前season测试两种buy-in大小,看看你的bot哪个打得更好。

继续阅读