傳說中的賭場21點算牌真的存在嗎?以Python實作驗證可行性

Roy Luo
Dec 12, 2024

--

上篇文講述了21點這個賭戲其實過度被理想化,後來陸續收到私信問了我對於算牌的看法。這次我用Python更完整地寫出可以通用各賭場21點規則的程式,並加入各種算牌演算法及策略模擬結果

前言

現在這個時代,大部分的賭場(尤其是亞洲)都改用連續洗牌機,也就是算牌已經沒有辦法使用了。因此本篇將以理論討論那些電影中的情節、或聲稱在歐美國家算牌獲利的職業賭徒,是否是靠運氣的幸存者偏差?還是確實有可行性。

算牌的原理是什麼

白話來說,就是根據已發出的牌,持續地追蹤牌盒裡剩下的牌是大牌或小牌偏多,若大牌偏多,則根據基本策略(Basic strategy)勝率會提升0.5–1%不等;若小牌偏多勝率則會下降。那麼只要在勝率大的時候下大注,勝率小的時候下小注或是離桌,你的收益長期下來就會為正,進而打敗賭場成為優勢玩家。

書上及網路上存在諸多教學,從最基本的Hi-Low算牌,到根據真數大小調整基本策略,最後下注大小使用凱莉公式(Kelly criterion),整套流程下來為最經典的算牌法。不過還有一些傳聞的技術,如切牌,A追蹤等等,就不在本篇的討論中。

當然賭場也是會用一些手段預防算牌玩家,例如給出更差的規則 — — 即使讓你算牌,也是讓你勝率的起跑點更低,或是很差的穿透率(指玩家玩到牌盒一定位置的時候牌必須重洗),直接大幅減少你算到優勢情況的機率

程式模擬

為了更接近真實情況,我採用我在亞洲見過的唯一非連續洗牌機的賭場:韓國華克山莊的規則(6 decks, min bet ₩100,000, dealer stand on soft 17, late surrender allowed, double on any 2 cards, split up to 4 hands, Aces re-split 有興趣的人請自行上網查規則的差別)

這裡為了方便計算,我們每次賭注設定1 元,連續玩1000次後畫出折線圖,並且這個動作重複50次先觀察看看無算牌和有算牌的差別

無算牌,完全按照基本策略
使用hi-low算牌,並根據真數調整基本策略

上圖為無算牌連續玩1000次,共重複50次的結果。平均報酬為-6.42,每下1元期望值為-0.00642;而有算牌的平均結果為12.04,每下1元期望值0.01204,期望值來到了正值,代表算牌確實可以打敗賭場!

不過值得注意的是算牌後的震盪更劇烈,甚至兩者的結果從±70來到了±150個注碼。當然這是因為勝率增加時,根據凱莉公式會下大注所導致,粗略來算從50.5%勝率開始每提升0.5%勝率注碼加倍,因此勝率在52%左右需要下注8倍的注碼。

因此也引發出一個值得思考的問題,追求期望值的同時,承受得住風險嗎?

算牌的風險

我們仔細想想算牌玩家所說「勝率大的時候下大注,勝率小的時候下小注,收益長期為正」這句話有沒有什麼問題?

理論上是正確的,然而執行上卻有一些前提我們需要了解:

  1. 賭桌最小賭注多少
  2. 我們本金有多少
  3. 標準差多大

舉例來說:假設兩個遊戲讓你選則,必須玩100次,你會怎麼選?

a) 一次下注1元,期望值為-0.1,玩100次的標準差為10 (10個注碼)
b) 一次下注5元,期望值為+0.1,玩100次的標準差為100 (20個注碼)

正常下我們一定會選期望值高的那一個(b),然而加入了標準差我們會發現:選擇(a)的獲利會在 -30 ~ +10 之間(95%信賴區間,±2個標準差), 選擇(b)獲利會落在 -190 ~ +210,雖然說期望值越高無疑是越好的選擇,但因為標準差的差距太大,導致這兩者已經完全不能拿來做比較,因為必須去考慮能否承擔高標準差虧損的風險。

用更貼近普通人的例子來說,假設某隻股票在半年後高機率上漲,然而中途中有機會經歷多次跌停,你能夠承受這樣的損失嗎?

在股市之中,以上的解決的方法很單純,就是風險控管得當,避免開過大槓桿即可。然而賭場中卻無法解決這個問題 — — 因為通常給出較好規則且可以算牌的牌桌,最低注碼都不小(上述華克山莊的例子單注最低注碼將近2500台幣)。再者,由於21點規則的特殊性,必要的時候會分牌或加注,導致槓桿會再更大。

長期算牌下的標準差有多大

為了計算長期玩下來的標準差,我們再把手牌數增加到10,000手(大約為職業賭徒打3–6個月的時長),並且重複1,000次做統計,結果如下:

模擬結果如長條圖所示,平均每連續玩10,000手的獲利為+150,不過標準差卻驚人的來到312,這個數字是什麼概念呢?通常可執行算牌的賭桌至少單注為50美金起跳,即使我們只計算兩個標準差的區間,等同於平均獲利$7,500(台幣240,000)但實際結果的損益介於$-23,700~$38,700(台幣-758,400~1,238,400)如果極端一些的計算3個標準差的情況,實際上有極小機會虧損超過百萬台幣!對於賭場而言他們有無限的資金,但對於玩家而言只要僅僅一次用完資金就意味結束了。因此若單純認為期望值為正就認為有利可圖的話,很可能聰明反被聰明誤!

真實世界中的可採取的其他策略

上述模擬是純粹以數學模型來討論,然而實際上還是有很多變因,大致上我把它們區分為改善方法和難題。

a) 改善方法

  1. 退佣
    有些賭場其實是可以讓買入大量籌碼的客戶談退佣和輸錢折扣的,通常是指買入美金1萬以上級別的客戶(有點類似股票大戶可以與券商談手續費)。若可以與公關談到0.5%的退佣,那麼我們的標準差模型即可向右平移,獲利為正的機率於從60%機率增加到70%。
  2. 多人團隊
    相當於多人入股,若獲利區間為-100萬到+120萬,那麼5人團隊就能減低到-20萬到24萬,是最有效對抗波動的方法,這也是最普遍職業賭徒的做法,電影中通常也是以4–5個主角群飾演賭博團隊

b) 難題

  1. 成本過高
    既然賭徒以賺錢為目的,那麼成本的控制就顯得重要。然而若不是本地人,所有的機票及住宿會是一筆數目,舉例來說網路上聲稱招募賭徒團隊卻只有一兩個星期的行程,實際上扣掉成本是無法獲利的。
  2. 賭場監控
    有如電影演的劇情,若完全不藏算牌技術的賭客很快就會被賭場注意到,讓自己增添更多麻煩。這裡指的顯露技術指的是100%按照算牌公式和下注大小打牌,然而既要最大化獲利又要故意打錯牌無疑是一個艱難的挑戰。
  3. 賭場作弊的可能
    哪怕是找到一個規則好又可以算牌的賭場,你也無法證明賭場完全無作弊的可能。由於玩家無法驗牌,假設牌盒中添加了一些小牌,會直接讓按照標準策略的人越輸越多,重點是統計學也無法證明是賭場作弊還是玩家運氣差。

結論

雖然說我們已經驗證21點算牌是有機會打敗賭場的,但仔細想想會發現,你必須長期的練習,完美的做對數十件事才能成立你的策略,然而只要做錯一件事,又或者運氣稍差就失敗了,是非常吃力不討好的事情。

以投資的成本和天時地利人和的要件來說,有如此的頭腦和資金,或許嘗試最簡單的債券投資或是股市,也遠比靠算牌獲利容易。

後記

上一篇發文已經是一年前,當時用的是windows作業系統,所以資料視覺化是用C#的Winform非常的方便,這次用Mac OS所以改採用Python的套件Tkinter做介面加上Matplotlib做圖,唯一的小缺點應該是Tkinter沒辦法做的太精美而已。

演算法的部分因為我沒有研究深度學習和蒙地卡羅演算法,因此暴力解的速度大約是在10秒內跑出10⁸次方手牌,複雜度為O(n),同時畫折線圖時間成本很也很高,因此以折線圖觀察趨勢,再以長條圖做統計最適合。

--

--

Roy Luo
Roy Luo

Written by Roy Luo

DevOps / Software Developer

Responses (1)