大数の法則で逆張りは有効か?
大数の法則とは?
「たくさん回数を重ねれば、実際に起こる確率は、真の確率に近づいていく」です。
カジノのルーレットで例えると、
赤(黒)の出る確率が50%として、たくさん回数を重ねれば、実際に赤のでる確率も50%に近づいていきます。
※話を簡単にするため、赤の確率は50%にしてます。(実際は0と00があるので、47%くらい)
大数の法則で逆張りは使えるか?
赤(黒)が50%の確率ででるルーレットで、赤と黒の出た回数が偏っていたとします。
過去1000回の結果:赤400回、黒600回
ここから1000回勝負するとして、あなたなら赤と黒のどちらに賭けるでしょうか?
大数の法則があるなら、赤の逆張りが有利でしょうか??
(赤の現在の確率40%はこの先回数を重ねれば、真の確率50%に収束するはず)
大数の法則をシミュレーション
ルーレットの回数が偏った時に、逆張りは有効なのか? をシミュレーションしました。
【シミュレーションの内容】
・シミュレーション数10万回を1セットとして、計10セットおこなう。
・赤(黒)の出る確率は50%とする
【シミュレーションの目的】
・実際の確率は、真の確率50%に収束するか?
・実際の赤(黒)が出る回数が偏ったときに、その期待値に収束する動きがあるか?
結果は以下の通り。
上のグラフが確率の収束、下のグラフが回数の収束の結果です。
確率は、真の確率50%に収束していることが確認できます。
ただし、回数の偏りはその期待値に収束していません。(むしろ広がっている)
つまり、ルーレットの赤黒の回数がどちらかに偏っても、逆張りの優位性はありません。
なぜ確率が収束するのに、回数はその期待値に収束しないか?
少しイメージしにくいと思いますが、
全体の範囲で大きくみたときに確率は収束しますが、実際の回数はその期待値へ収束しません(むしろ期待値から離れていく)
以下のようなイメージです。
試行数 | 実際の確率 | 実際の回数 | 回数の期待値 | 回数の期待値との差 |
---|---|---|---|---|
100 | 55% | 55 | 50 | +5 |
1000 | 53% | 530 | 500 | +30 |
10000 | 51% | 5100 | 5000 | +100 |
100000 | 50.2% | 50200 | 50000 | +200 |
確率は50%に収束しても、その分試行数も多くなるので、期待値(試行数 * 50%)との差は広がります。
大数の法則は実際のルーレットに当てはまらない
1点注意なんですが、ここまでの内容は理論(大数の法則)の話です。
・確率が50%で、独立であることを前提(前の試行結果が現在の試行に影響を与えない)
・過去にどれだけ赤(黒)が連続しようと、次に赤(黒)が出る確率は50%
いっぽう、実際のルーレットやFXの確率は違います。
赤と黒の確率は50%ではないし、独立でもないでしょう。
・ルーレットのシューターがある程度出目を狙えるとしたら、確率は50%でない
・シューターも人なので、過去の良し悪しが現在の試行に影響を与える
・陰線が連続するほど、陽線が出る確率は上がる
・経済に影響を与えるくらい為替が下がれば、国が介入する
つまり、確率が独立で50%ならば、こちら側に勝つ手段はありませんが、 実際のルーレットやFXでは、人間の「感情」や「作為」が入る分こちら側にも勝つ手法があるということです。
大数の法則まとめ
大数の法則で、確率は収束するけど、期待値との差は収束しない。
確率が独立なら、回数の偏りを利用した逆張りに優位性はない。
大数の法則は実際の投資やギャンブルには当てはまらない(人間がすることの確率は独立でないことがほとんど)
コード
シミュレーションに使用したコードは以下の通りです(環境:JupyterLab 言語:R)
library(tidyverse) options(repr.plot.width=12, repr.plot.height=4) options(scipen=100, warn=-1) ##### 大数の法則 シミュレーション ##### count = 100000 # 10万試行 set = 10 # 10セット list1 = list() list2 = list() for(h in 1:set) { deme.vec = numeric(count) for (i in seq_along(deme.vec)) { deme.vec[i] = sample(c(0,1), 1) } list1 = c(list1, list(cumsum(deme.vec) / seq_along(deme.vec))) # 確率 list2 = c(list2, list(0.5 * seq(deme.vec) - cumsum(deme.vec))) # 回数の期待値との差 } df1 = data.frame(do.call(cbind, list1)) df2 = data.frame(do.call(cbind, list2)) df1 %>% gather(key, value) %>% mutate(sim_count = rep(1:count, set)) -> df1.gg df2 %>% gather(key, value) %>% mutate(sim_count = rep(1:count, set)) -> df2.gg ##### 確率は収束する ##### ggplot(df1.gg, aes(sim_count, value, col=key)) + geom_line() + geom_hline(yintercept=0.5, color="red", size=1, alpha=0.5) + ylim(0.45, 0.55) + theme(legend.position="none", text = element_text(size=16)) + labs(title="", x="試行数", y="確率") ##### 期待値の偏りは収束しない ##### ggplot(df2.gg, aes(sim_count, value, col=key)) + geom_line() + geom_hline(yintercept=0, color="red", size=1, alpha=0.5) + theme(legend.position="none", text = element_text(size=16)) + labs(title="", x="試行数", y="期待値との差")