モンテカルロ法はマーチンゲール法に劣る理由をExcelとPythonでシミュレーション
モンテカルロ法の仕組み
ルーレットで理論上は絶対に負けない必勝法としてマーチンゲール法があります。
これをされるとカジノ側は赤字になってしまうため、テーブルリミット(1回当りのベット額の上限)を設定して際限なくベット額を上げられないようにしています。
つまりカジノ側は、マーチンゲール法を禁止はしないけれども、理論通りの結果を出させないように骨抜きにしていると言えます。
モンテカルロ法は、このようなカジノの骨抜き策を巧みに回避しながら、マーチンゲール法に近い勝率を上げる手法として知られています。
マーチンゲール法は負けたら次のベット額を2倍にするという単純明快な手法ですが、モンテカルロ法では数列を使って次のようにベット額を決定します。
- 数列の初期値を(1,2,3)とする
- ベット額は数列の最初と最後の要素を足した値とする
- 外れたら外れた時のベット額を数列の最後尾に追加し、当たったら数列の最初と最後の要素を削除する
- 数列の要素数が1またはゼロになったら1に戻る。その他の場合は2に戻る
はじめに100ドルの所持金があるとすると次のようになります。
ここでは11回の賭けを行っていて、うち5回当たって6回外していますが、次のことがわかります。
- 連続して外さなければ、次に1回当たれば所持金を回復できる
- 2回連続して外した場合は、次に1回当てるだけでは所持金を回復できない
- 3回連続して外した場合は、次に2回連続当てても所持金を回復できない
マーチンゲール法はどんなに連続して外しても、次に1回当てれば所持金が絶対に増えるのですが、モンテカルロ法はそうはならないのです。
連続して外した場合は、同じ回数だけ当てないと所持金は増えません。
つまり、当たりと外れの回数は同数にならないと所持金が減る確率が非常に高くなります。
マーチンゲール法は1勝5敗でも最後に1勝が来れば所持金は増えるので、モンテカルロ法はそれに比べるとかなり弱いですね。
モンテカルロ法と固定ベット法との比較
それでは毎回のベット額を固定する固定ベット法と比べるとどうでしょうか?
先程と同じ勝負を、毎回5ドルを賭ける固定ベット法で行った場合の所持金の推移は次のようになります。
5勝6敗で通算1敗なので、最終金額は5ドル減っています。
モンテカルロ法では2ドルのプラスだったため、これよりはましだと言えます。
グラフで2つを比べてみましょう。
モンテカルロ法では連敗している時の所持金の減りが大きくなりますが、当たれば急回復して逆転していることがわかります。
ちなみに、モンテカルロ法では数列の初期値が(1,2,3)なので最初のベット額は4ドルになりますが、これは20ドルや40ドルでも構いません。
数列の最初と最後の要素を足した数の何倍をベット額にするかというのを最初に決めておけば、何倍しても構わないのです。
試しに2倍でモンテカルロ法を行った場合の所持金の推移を固定ベット法の場合と比べてみましょう。
このように連敗中の所持金の落ち込みはより大きくなりますが、回復度合いも大きくなります。
次に、逆に1/2倍してモンテカルロ法を行った場合はどうでしょうか?
次のようになりました。
ほぼ固定ベット法の結果に近くなりました。
このようにモンテカルロ法は倍率を変えることにより感度を調整できます。
モンテカルロ法とマーチンゲール法との比較
それでは同じ勝負をマーチンゲール法で行った時はどうなるのでしょうか?
このように最終所持金はモンテカルロ法の場合と比べて多くなっています。
グラフで比較してみましょう。
全体に渡ってマーチンゲール法の方が勝っています。
「モンテカルロ法、意味ないじゃん」
と思うところですが、連敗が混んだ場合は次のようになります。
これは途中で6連敗した場合の比較ですが、マーチンゲール法では途中で所持金がマイナスになり破産、ゲームオーバーになっているのに対し、モンテカルロ法では何とか踏みとどまって回復しています。
このようにマーチンゲール法はほとんどの期間においてモンテカルロ法より勝るものの、連敗が混んで破産するか、テーブルリミットに引っかかり継続することができなくなるリスクがより大きい手法であることがわかります。
Pythonコード
オッズ2倍の赤/黒ベットで、モンテカルロ法を使って300ドルを600ドルまで増やす賭けを100,000回繰り返して、600ドルまで増やせた成功率を計算するコードです。
モンテカルロ法の倍率は20倍としています。
import pandas as pd
import random
def montecarlo(onhand, target):
seq = [1, 2, 3] #初期数列
mult = 20 #倍率
onhand_log = pd.DataFrame()
while onhand > 0 and onhand < target: #手持ち資金がゼロまたは目標金額にになるまで繰り返し
bet = (seq[0] + seq[-1]) * mult
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 #手持ち金を増やす
del seq[0]
del seq[-1]
else: #外れの場合
onhand -= bet #手持ち金を減らす
seq.append(bet / mult)
if len(seq) < 3:
seq = [1, 2, 3] #数列の長さが2以下なら初期数列に戻す
data = pd.DataFrame([onhand, bet]).T
onhand_log = pd.concat([onhand_log, data], axis = 0)
return onhand_log
ini_onhand = 300 #初期資金
ini_target = 600 #目標金額
options = ['R', 'B', 'G'] #ルーレット結果のオプション
weights = [18, 18, 1] #ルーレットオプションの確率ウェイト
p_options = ['R', 'B'] #プレーヤーの選択肢
p_weights = [1, 1] #プレーヤーの確率ウェイト
results = pd.DataFrame()
for i in range(100000):
logs = montecarlo(ini_onhand, ini_target) #1ゲーム当りの手持ち金推移を取得
final_amount = logs.iloc[-1, 0]
game_length = len(logs)
result = pd.DataFrame([final_amount, game_length]).T
results = pd.concat([results, result], axis = 0)
results.columns = ['最終金額', 'ゲーム数']
win_rate = results[results['最終金額']>=ini_target].iloc[:,0].count()/results.shape[0] #目標金額を上回った確率を計算
win_rate
所持金による勝率の違いをシミュレーション
固定ベット法やマーチンゲール法と比べた場合のモンテカルロ法の特徴は何となくわかりましたので、所持金によってどの手法を使うのが最適なのかをPythonシミュレーションで調べてみましょう。
300ドルを獲得して勝ち逃げしたい時に、
所持金300ドルを600ドルに増やす
所持金3,000ドルを3,300ドルに増やす
所持金10,000ドルを10,300ドルに増やす
のそれぞれの場合について固定ベット法、マーチンゲール法、モンテカルロ法を100,000回ずつ行って勝率の平均をシミュレーションしてみました。
結果は次の通りです。
所持金が多い方が有利というのはルーレットは金持ちほど勝つ確率が高いのか?百万回シミュレーションしてみたで見た通りで、その通りになっています。
また所持金がとても多い時以外は、固定ベット法が一番勝率が高くなりました。
唯一、所持金がとても多い時だけマーチンゲール法が一番勝てる方法になりました。
モンテカルロ法で最適倍率をチューニング
このようにモンテカルロ法はいずれの場合にも最適な手法にはなりませんでしたが、前の章で見たようにモンテカルロ法は倍率(数列の最初と最後の数を足した数の何倍をベット額とするか)により感度が変わり、勝率も変わってきます。
そこで所持金が多い場合(10,000ドルを10,300ドルに増やす場合)のモンテカルロ法で倍率を5倍から50倍まで変えて勝率がどう変わるかをシミュレーションしてみました。
このように倍率をチューニングしてもマーチンゲール法の95.8%には叶いませんでした。
結論:モンテカルロ法はマーチンゲール法に劣る
- モンテカルロ法はマーチンゲール法のようにいくら連敗しても1回の当たりでそれまでの累積損が解消できるような絶対的な必勝法ではない
- マーチンゲール法は絶対的な必勝法であるため、カジノ側はテーブルリミットを設定して防衛している
- モンテカルロ法はテーブルリミットにかかる可能性は低いが、その分、効果が中途半端でマーチンゲール法と固定ベット法のいずれにも勝つことはできない
理論上は負けないマーチンゲール法ですが、実際にはテーブルリミットがあるために無敗ではありません。
それどころか、マーチンゲール法が効果的である場面は限られます。
興味のある方は、こちらも読んでみて下さい。
【マーチンゲール法】正しく使って勝つための条件をシミュレーションで明らかにする