【マーチンゲール法】ExcelとPythonで勝てない確率をシミュレーション
マーチンゲール法とは?
マーチンゲール法は当たる確率がほぼ50%のイーブンベットに使われ、理論上は絶対に負けない手法と言われています。
最初にベット額の初期値を決めておいて、負けたら次のゲームのベット額を倍にし、勝ったら次のゲームのベット額を初期値に戻すというやり方を繰り返します。
負けたらベット額を倍に増やすため、ベット額の初期値はミニマムベット(そのテーブルでの最小のベット額)に設定するのが一般的です。
そうしないと連敗して赤字が膨らんでいるのに、とんでもない額のベットをすることになってしまいます。
例えば9連敗すると初期値の512倍(2の9乗)を賭けることになります。
初期値を100ドルにしていたら、理論上は9連敗して51,100ドルの赤字になっているのに、更に51,200ドルを賭けることになってしまい、とても普通の人にそんな勇気はありませんね。
現実的な話としては、通常はテーブルごとにテーブルリミット(ベット額の上限)も設定されているため、
「俺は勝つまでいくらでもつぎ込むぜ」
という人でも、そんなことはできません。
ですので理論上は絶対に負けないとは言っても、現実的には負けることもありえます。
でも
「マーチンゲール法を使うことによって勝率が上がるのでは?」
という期待感がありますね。
実際、次の章で解説するように魔法のような側面もあります。
そこでこれをシミュレーションで確かめてみました。
結論を先に言うと、マーチンゲール法を使うと条件次第で勝率が少し上がります。
今回の記事はいろいろな実験をやっていて少し長いので、
「途中経過はどうでもいいから結論だけ教えて」
という方は、こちらからまとめに飛んで下さい。
Excelでマーチンゲール法のトリックを理解する
マーチンゲール法はExcelで簡単にシミュレーションすることができます。
下記ではRANDBETWEEN関数を使い、当たりなら1、外れなら-1のフラグを立てるようにしています。
このシミュレーションでは20回のゲームを行っていますが、最終金額は109になっています。
初期値が100なので9の利益です。
20回中12回も負けていますが、9の利益を確保できています。
毎回同じベット額を賭けていたら、当然マイナスになっているところですね。
実はマーチンゲール法でイーブンベットゲームを行った場合の利益額は大抵の場合、
ゲーム回数✕1/2+ベット初期値
になります。
これが「マーチンゲール法は凄い」と言われている所以です。
なぜこのようになるのかは、次のように説明できます。
ゲーム3が終わった時の手持ち額が103です。
その後、ゲーム4から4回連続で外していますが、ゲーム8で当たると手持ち額が104になっています。
つまり、何度連続して外そうと、次に当たった時には連敗中の損を回復できて、逆に1だけ増えるのです。
これは次の3連敗でも同じです。
連敗の前後で手持ち額が1増えていますね。
正確にいうと、上の例では1増えていますが、これはベット額の初期値です。
ベット額初期値が2の場合には、連敗前後で手持ち額が2増えます。
平均的にはゲーム回数の半分は当たるので、
ゲーム回数✕1/2+ベット初期値
が平均的な利益額になるわけです。
「ゲーム数に比例して利益が増える」
魔法のような手法ですね。
Pythonでマーチンゲール法をシミュレーション
それではこのマーチンゲール法をPythonでシミュレーションして、この魔法が本物かどうかを確かめてみましょう。
Pythonコード
import pandas as pd
import random
def martingale(onhand, ini_bet, target, table_limit):
bet = ini_bet
onhand_log = pd.DataFrame()
max_bet = bet #ベット最大額の初期値を設定
while onhand > 0 and onhand < target: #手持ち資金がゼロまたは目標金額にになるまで繰り返し
choice = random.choices(p_options, k = 1, weights = p_weights) #確率ウェイトに基づくプレーヤーの選択
if bet > onhand: #ベット額が手持ち資金より足りない場合
bet = onhand #手持ち資金をベット額に設定
outcome = random.choices(options, k = 1, weights = weights) #確率ウェイトに基づきルーレットの結果を生成
if outcome == choice: #当りの場合
onhand += bet #手持ち金を増やす
bet = ini_bet #ベット額を初期値に戻す
else: #外れの場合
onhand -= bet #手持ち金を減らす
bet *= 2 #ベット額を倍にする
if bet > table_limit: #ベット額がテーブルベット額を超える場合
bet = table_limit #ベット額をテーブルベット額に設定
if bet > max_bet: #ベット額が最大値を更新した場合
max_bet = bet #最大値を更新
data = pd.DataFrame([onhand, max_bet]).T
onhand_log = pd.concat([onhand_log, data], axis = 0)
return onhand_log
ini_onhand = 2000 #初期資金
ini_bet = 2 #初期ベット額
ini_target = 4000 #目標金額
table_limit = 4000 #テーブルの最大ベット額
options = ['R', 'B', 'G'] #ルーレット結果のオプション
weights = [18, 18, 1] #ルーレットオプションの確率ウェイト
p_options = ['R', 'B'] #プレーヤーの選択肢
p_weights = [1, 1] #プレーヤーの確率ウェイト
results = pd.DataFrame()
for i in range(1000):
logs = martingale(ini_onhand, ini_bet, ini_target, table_limit) #1ゲーム当りの手持ち金推移を取得
final_amount = logs.iloc[-1, 0]
game_length = len(logs)
result = pd.DataFrame([final_amount, game_length, logs.iloc[-1, 1]]).T
results = pd.concat([results, result], axis = 0)
results.columns = ['最終金額', 'ゲーム数', '最大ベット額']
win_rate = results[results['最終金額']!=0].iloc[:,0].count()/results.shape[0]
a = results['ゲーム数'].mean()
b = results['最大ベット額'].mean()
win_rate, a, b
勝ちパターンと負けパターンの特徴
先のコードは初期資金:2,000ドル、目標金額:4,000ドル、ベット額初期値:2ドル、テーブルリミット:4,000ドルとして1,000回のゲームを行うシミュレーションです。
テーブルリミットとは最大のベット額のことです。
カジノでは理論上は絶対に負けないマーチンゲール法に制限を掛けるために、1回のゲームで賭けられるベット額に上限を設けています。
オンラインカジノでは最小ベット額:2ドル、最大ベット額:4,000ドルとなっているケースが多いので、この条件でシミュレーションしてみました。
結果、目標額である4,000ドルを達成できた勝率は38.4%でした。
意外と低いですね。
まずは勝った場合のゲーム回数をヒストグラムで見てみましょう。
このように2,000回くらいで勝つケースが圧倒的に多いことがわかります。
2,000ドルから4,000ドルに増やすということは利益額が2,000ドルですので、
ゲーム回数✕1/2✕ベット初期値
に当てはめるとゲーム回数は2,000回になりますので、この結果は妥当と言えます。
それでは負けた場合はどうでしょうか?
このようになりました。
2,000回以下で負けているケースが圧倒的に多いことがわかります。
中でも少ないゲーム数で負けているケースが一番多いですね。
これは初期の段階で連敗してゲームオーバーとなる確率が相当高いということを示しています。
初期資金である2,000ドルは、11連敗すればゲームオーバーです。
また10連敗が2回起こってもゲームオーバーです。
10連敗が起こる確率は約0.1%、つまり1,000回に1回くらいしか起こりませんが、2,000回くらいゲームをすると2回起こってもおかしくないわけです。
ですので、これも妥当な結果と言えます。
「1,000回も2,000回もやらないよ」
という声が聞こえてきそうですが、最初にも述べたようにマーチンゲール法を行うにはベット額の初期値をなるべく小さくすることがリスク回避には不可欠なため、2,000ドルの利益を得るにはどうしてもこれくらいのゲーム回数が必要になってしまうのです。
初期資金額による勝率の違い
イーブンベットは初期資金を多く用意できる金持ちほど、狙った利益額を達成できる確率が高いことを前回の記事で明らかにしました。
ルーレットは金持ちほど勝つ確率が高いのか?百万回シミュレーションしてみた
この法則はマーチンゲール法にも当てはまるのでしょうか?
初期資金額を100ドルから2,000ドルまで変えて、100ドルの利益を得ようとする場合に成功する確率がどうなるかをシミュレーションしてみました。
結果は次のようになりました。
このようにマーチンゲール法でも明らかに金持ち有利なことがわかります。
目標金額による勝率の違い
次に目標金額の高さにより勝率がどのくらい異なってくるのかをシミュレーションしてみましょう。
初期資金額200ドルで目標金額を220ドルから400ドルまで変えて勝率を調べてみました。
400ドルまで増やせる確率は43%しかありませんが、220ドルまでなら90%の確率で増やせることがわかります。
欲張らなければ、かなりの高確率で利益を得られるということです。
固定ベット額との勝率の差
欲張らなければ勝率が上がるというのは、ベット額を固定する場合でも同じです。
そこで、先のシミュレーションを固定ベット額で行ってみましょう。
常に2ドルをベットした場合のシミュレーション結果は次のようになりました。
随分と低い勝率になりましたね。
特に200ドルを400ドルまで増やせる確率は1%未満しかありません。
これはベット額が2ドルと小さすぎるためです。
当たる確率と外れる確率がほぼ半々の中で、当たる回数が外れる回数より100回も多くならないと200ドルの利益に届かないわけです。
単純に考えても、ほぼ不可能だということがわかりますね。
そこで毎回20ドルをベットするという前提に変えて、シミュレーションをしてみましょう。
次のような結果になりました。
だいぶ勝率が上がりました。
マーチンゲール法の結果と並べて表示してみましょう。
平均して5ポイントくらいマーチンゲール法の方が勝率が高くなっています。
しかし、これでマーチンゲール法の方が優れているとは言い切れません。
ベット額の大小によりルーレットで勝ち逃げできる確率は変わってくるのか?で見たように、ベット額は大きい方が勝ち逃げできる勝率が上がります。
200ドルの元手でゲームを始めた場合、250ドルで勝ち逃げする時には50ドルを、300ドルで勝ち逃げする時には100ドルを一挙にベットするのが最も勝率が上がる賭け方です。
そこで、そのような賭け方をした場合とマーチンゲール法を比べてみましょう。
今度は目標額が小さな時以外は、マーチンゲール法の方が勝率が低くなってしまいました。
これは初期資金額が大きい時、つまり金持ちがやっても同じです。
一応、そのような場合についてもシミュレーションしておきましょう。
テーブルリミットは通常4,000ドル程度なので、いくらお金持ちでも4,000ドル以上はベットできません(VIPテーブル以外は)。
ですので、初期資本4,000ドルを4,500ドルまで増やしたい時に、毎回500ドルをベットする方法で賭けた時と、マーチンゲール法で賭けた時のシミュレーションを行ってみましょう。
結果は
毎回500ドルを賭けた時:84.5%
マーチンゲール法で賭けた時:85.1%
となり、マーチンゲール法の方が僅かに勝率が高くなりました。
ところが初期資本4,000ドルを6,000ドルまで増やしたい時に、毎回2,000ドルをベットする方法で賭けた時と、初期ベット額2ドルのマーチンゲール法で賭けた時の勝率をシミュレーションすると、
毎回500ドルを賭けた時:64.3%
マーチンゲール法で賭けた時:54.6%
と逆にマーチンゲール法の方が10ポイント近く勝率が低くなりました。
マーチンゲール法は目標利益額が少ない場合にのみ、有効な手法だと言えます。
まとめ
- マーチンゲル法にはテーブルリミットがあるため「絶対に負けない方法」ではない
- テーブルリミットの影響を小さくするためには、初期ベット額を低く設定する必要がある。ミニマムベットに設定するのが妥当
- 初期ベット額をミニマムベットにセットすると、当たった時の累積利益の増加額はミニマムベットに等しくなるため、大きな利益を上げるには途方もないゲーム回数が必要になる
- 10回連続して外す確率は0.1%しかないが、途方もない回数を繰り返すと必然的にこの悲劇に遭遇し、すべてを失うことになる
- 自分で決めた目標額に達したら勝ち逃げしようとする時には、ベット額が大きいほどが勝率が高い(ベット額の大小によりルーレットで勝ち逃げできる確率は変わってくるのか?)
- 先の方法にマーチンゲール法が勝てるのは、目標利益額が極々低い場合のみ
- 従って、マーチンゲール法は僅かな利益、かつ少ないゲーム回数で勝ち逃げしたい場合にのみ有効な手法である