FXタカハシのトレード日記

FXタカハシのトレード日記

日々のトレードの反省点と、役立つ知識(時系列分析、テクニカル)を要約します。

大数の法則で逆張りは有効か?

大数の法則とは?

たくさん回数を重ねれば、実際に起こる確率は、真の確率に近づいていく」です。
カジノのルーレットで例えると、
赤(黒)の出る確率が50%として、たくさん回数を重ねれば、実際に赤のでる確率も50%に近づいていきます。
※話を簡単にするため、赤の確率は50%にしてます。(実際は0と00があるので、47%くらい)

大数の法則逆張りは使えるか?

赤(黒)が50%の確率ででるルーレットで、赤と黒の出た回数が偏っていたとします。
過去1000回の結果:赤400回、黒600回

ここから1000回勝負するとして、あなたなら赤と黒のどちらに賭けるでしょうか?
大数の法則があるなら、赤の逆張りが有利でしょうか??
(赤の現在の確率40%はこの先回数を重ねれば、真の確率50%に収束するはず)

大数の法則をシミュレーション

ルーレットの回数が偏った時に、逆張りは有効なのか? をシミュレーションしました。

【シミュレーションの内容】
・シミュレーション数10万回を1セットとして、計10セットおこなう。
・赤(黒)の出る確率は50%とする

【シミュレーションの目的】
・実際の確率は、真の確率50%に収束するか?
・実際の赤(黒)が出る回数が偏ったときに、その期待値に収束する動きがあるか?

結果は以下の通り。

f:id:FXtakahashi:20200423142043p:plain
大数の法則のよくある誤解
上のグラフが確率の収束、下のグラフが回数の収束の結果です。
確率は、真の確率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="期待値との差")