まえがき
こんにちは、さつま芋です。
マーチンゲール法とは、負けたら次に倍を賭ける方法です。
今回は、コイン投げのシミュレーションで賭け方を変えたときの資金推移を図示してみます。
条件説明
資金を100万円とし、初期投資額を0.1万円(1000円)にしています。
100人が1000投したコイン投げをシミュレーションしました。
まず、掛け金を常に一定額0.1万円(1000円)とした場合をFlatとします。
次に、マーチンゲール法(Martingale)は負けたら投資額を2倍に増やし、勝ったら初期投資額に戻します。
また、パーレー法(Parlay)は勝ったら投資額を2倍に増やし、負ければ初期投資額に戻します。
ちなみに、スプレッドなどの手数料は含んでいません。
シミュレーション結果
それでは資金推移を図示します。
バラツキは見えないのですが、100人分の資金推移が重なっています。
最終結果は次の表です。
最小値 | 第1四分位数 | 中央値 | 平均 | 第3四分位数 | 最大値 | |
---|---|---|---|---|---|---|
フラット | 94.3 | 98.5 | 100.6 | 100.5 | 102.2 | 106.9 |
マーチン | 99.1 | 148.9 | 150.1 | 149.1 | 150.8 | 153.4 |
パーレー | 47.40 | 49.48 | 50.60 | 50.55 | 51.52 | 55.00 |
感想
最終結果だけ比較すればマーチンゲール法は有利に見えますが、途中のドローダウンを見ると破産している人もいます。
他に注意点を挙げると、スプレッドの影響は想像以上に大きいです。
スプレッド0.5pips相当の手数料を加味したコイン投げの一例です。
コード
# 必要なパッケージをインストール
if (!require(ggplot2)) install.packages('ggplot2')
if (!require(reshape2)) install.packages('reshape2')
# ランダム種を設定
set.seed(123)
# 初期設定
n <- 1000 # シミュレーションの回数
m <- 100 # 人数
fee <- 0.00
# 結果を保存するためのベクトルを初期化
resultsFlat <- matrix(nrow = n, ncol = m)
resultsMartingale <- matrix(nrow = n, ncol = m)
resultsParlay <- matrix(nrow = n, ncol = m)
# シミュレーション
for (j in 1:m) {
A_martingale <- 100
A_parlay <- 100
a <- 0.1 # 初期の掛け金
a_martingale <- a # マーチンゲール法の掛け金
a_parlay <- a # パーレー法の掛け金
resultsMartingale[1, j] <- A_martingale
resultsParlay[1, j] <- A_parlay
for (i in 2:n) {
if (runif(1) < 0.5) { # 50%の確率で勝つ
A_martingale <- A_martingale + a_martingale * (1-fee)
a_martingale <- a # 勝った次の掛け金は初期の掛け金に戻す(マーチンゲール法)
A_parlay <- A_parlay + a_parlay * (1-fee)
a_parlay <- min(a_parlay * 2, Inf) # 勝った次の掛け金は2倍にする(パーレー法)
} else { # 50%の確率で負ける
A_martingale <- A_martingale - a_martingale * (1+fee)
A_parlay <- A_parlay - a_parlay * (1+fee)
a_parlay <- a # 負けた次の掛け金は初期の掛け金に戻す(パーレー法)
}
resultsMartingale[i, j] <- A_martingale
resultsParlay[i, j] <- A_parlay
}
}
summary(resultsFlat[n, ])
summary(resultsMartingale[n, ])
summary(resultsParlay[n, ])
# データフレームに変換
dfFlat <- as.data.frame(resultsFlat)
names(dfFlat) <- paste0("Person", 1:m)
dfFlat$round <- 1:nrow(dfFlat)
dfFlat$method <- "Flat"
dfMartingale <- as.data.frame(resultsMartingale)
names(dfMartingale) <- paste0("Person", 1:m)
dfMartingale$round <- 1:nrow(dfMartingale)
dfMartingale$method <- "Martingale"
dfParlay <- as.data.frame(resultsParlay)
names(dfParlay) <- paste0("Person", 1:m)
dfParlay$round <- 1:nrow(dfParlay)
dfParlay$method <- "Parlay"
# データを準備
df <- rbind(dfFlat, dfMartingale, dfParlay)
df_melt <- reshape2::melt(df, id.vars = c("round", "method"))
# グラフを描画
geom_line() +
facet_wrap(~ method, ncol = 1) +
labs(x = "Round", y = "Total Money", color = "Person") +
theme_minimal() +
ggtitle("Simulation Results") +
guides(color = "none") # 色の凡例を非表示にする
あとがき
Google Colaboratoryというサービスで、オンライン上のプログラミングをすることができます。
無料だと制限付きらしいですが、私は不自由なく使えました。
付属するColab AIを上手く使えば、スマホだけでプログラミングできそうです。
以上、さつま芋でした。