概要
ダズンベット法を使うと勝ちやすいとか書いてあるので実際にプログラムを書いて検証してみました。
「勝率が高いベッティング方法とマーチンゲール法による資金管理を組み合わせれば最強じゃね?」と思ってプログラムを書いて検証してみました。
世の中にあるカジノのシミュレータは、ベッティング方法単体、資金管理方法単体でのシミュレーターはあるのですが両方を一気に実行できるプログラムがなかったので書きました。
単純な計算で出せないので、ちゃんとオブジェクト指向でアクターとエンティティを整理して書かないときれいに書けないなと感じたので、ちゃんと設計して書くのが面倒でした。
クラス図を書く必要があるギリギリの難易度くらいでした。
アプローチ
勝率の高いベッティング方法は過去の履歴を参考にして出やすい目を予測することです。
確率で考えると赤か黒が10回連続で出る確率は、
(18^10)/(37^10)=0.00074252=0.074252%
となるので10回目に同じ色が出る確率は非常に少ないことになります。これを元に10回目は別の色に賭けるということによって勝率をあげようと言うことです。逆張りアプローチです。
単純な計算で出せないので、ちゃんとオブジェクト指向でアクターとエンティティを整理して書かないときれいに書けないなと感じたので、ちゃんと設計して書くのが面倒でした。
考察
しかしながら、全然思ったとおりに勝てないことがわかりました。
シミュレーションの結果
シミュレーションの結局、期待した結果にはなりませんでした。
9回連続同じ色が出た後に、10回目に同じもの色が出る確率は約1/2です。
以下のサイトにある通りでした。
このサイトでは再三言っていますが、カジノにおけるルーレットは過去の事象の歴史と次回の事象には関連性がない独立した事象であるという事です。
https://www.a-taichi.com/casinogamenavi/roulette/roulette9884.html
例
基本ルール
- 開始は200クレジット
- 戦略を実行するためのベットができなくなった時点で中止
毎回1クレジットをランダムに黒か赤に賭ける
360プレイ x 100日分実行した結果
この360プレイというのは、1回のルーレットの実施に2分かかると仮定して、12時間プレイすると仮定した値です。ようするに丸1日中ルーレットをした場合のプレイ数です。
ずっと黒に賭ける
そもそも赤も黒も期待値は同じなので、ずっと黒にかけてみても同じになるはずなので検証。
% bundle exec ruby main.rb |grep Won | awk '{ print $2}' | awk 'BEGIN {total=0} {total += $1} END {print total/NR}' 48.5666
48.5666%となるので、ほぼ理論値通り。
確率は、18/37=0.48648649
36万回実行してます。
5回連続同じ色が出たら逆張り戦略
本気で勝ちにいきたいので、ベットする金額はマーチンゲール法を用いてみます。
マーチンゲール法では、負けた分を取り返すような掛け方になるので1, 2, 4, 8, 16というふうに指数的に増えます。
ほとんどのサンプルは資産が微増するようになってます。しかしながら気になるのは、下にスパイクしたときのサンプルです。
その際に、最後の統計値を見るのが重要です。
Test suite result ---------------------- Bankrupt: 6 Bankrupt rate: 6.0%
6%が資産不十分になってしまってマーチンゲール法を続けられなくなってます。
実世界に置き換えると、まる1日カジノに居て、16日に1回は破産します。15回は10%程度の微増です。
逆張りをしたときの勝率
36万回実行してみた結果、47.926%でした。
Won(%): 47.926 %
1回あたりにおける当たる確率は、18/37-19/37 = 0.48648649なので、逆張りをしても意味が無いです。
ちなみに、ゲームへの参加率は6.452778%でした。実際のゲームで実行するとなると空き時間が多いですね。
5回連続同じ目が出たときに、当たるまで1単位を逆張りし続けたときの資金残高はこちら。残高が0になっても止まらないように変更して実行しました。
まとめ
簡単なコードの変更でルーレットの戦略、実行回数、を変更して実行結果をシミュレーションするプログラムを作りました。
グラフでの出力により視覚的にわかりやすくして、シミュレーションに必要な各種指標を出力するようにしました。
昔、FXの自動取引プログラムを開発していたときの知識が役に立ちました。
Comments