負けても資本が増える法則とは?パロンドのパラドックスを色んなケースで検証してみた(少しだけ株の買い方の話)
こんにちは、私です!
皆さんは、パロンドのパラドックス(Parrondo's paradox)というのをご存じでしょうか?
例えば、ゲームAとゲームBがあり、ゲームA・Bは単体では負けるゲームですが、ゲームAとゲームBを組み合わせると総合では得となるゲームになるというパラドックスです。
「負けるゲームの組みあわせなのに資産が増える」という直観に反する事象からパラドックスという名前がついていますが、この事象はどういった場合でも成り立つものではなく、公式wikiにあるような特定のケースでしか発生しないようです。
ではどんなケースであれば「資産が増える」条件に成りうるのでしょうか?
また、株に利用できるテクニカルな法則があるのではないか?
今回はそう言った所を実際のシミュレーションから検証してみたいと思います。
まずはchatGPTに聞いてみる
検証の前にまずはある程度のアタリをつける必要があるので、chatGPTにパロンドのパラドックスで利益を生む法則を聞いてみました。
ふむふむ。チャットGPTより、ここでベースとするゲームの確率はそれぞれ下記と提案がありました。
ゲームA:
49%の確立で残資本を+1する。それ以外は-1する。
ゲームB:
残資本が偶数なら10%以下の確立で残資本を+1する(それ以外は-1する)。奇数なら75%以下の確立で残資本を+1する(それ以外は-1する)
ゲームAは勝率49%なので、単体でこのゲームを続けると負けるゲームです。また、ゲームBの平均勝率も
平均勝率=(0.5×10%)+(0.5×75%)=5%+37.5%=42.5%
となり、この条件下での平均勝率は 42.5% で単体のゲームを繰り返すと負けるゲームとなります。
また加えて、ゲームの組み合わせ(以降、パターンと呼びます)が「A→B→A→B…」の順番であれば、100%の確立で資本は増えますが、「A→A→B→A→A→B…」といった組み合わせに変わるだけでも利益は生まれなくなるようです。
試しに上記の条件についてpythonでシミュレーションしました。ゲームを300回実行した場合の結果のグラフは下記です。
確かに、「A→B」の組み合わせの場合はゲームを繰り返すと資本は増えていますが、「A→A→B」の組み合わせの場合、資産は横並びです。
ではこれを元に検証をしてみたいと思います。
ー検証1 様々なゲームのパターンで検証してみる
では、まず簡単な所から、AとBゲームの勝率は変えずに、様々なパターンで勝率を計算してみようと思います。
ゲームではA→Bのサイクルは簡単に作れますが、現実的にはコントロールは難しく、ランダムな組み合わせになる事の方が多いと予測される為です。
今回は4ゲームを1サイクルとして、1サイクルの中で様々なAとBの組み合わせを選べるようにします。
組み合わせは以下14ケースです。(全てがゲームAやゲームBになるパターンは除く)
ここから、パターンに従って75サイクルを回し、それを1000回のシミュレーションにかけ、実際の勝率を計算しました。
勝率=資産が増えたシミュレーションの回数/全シミュレーション回数
14ケースについての勝率は下記です。
同様にグラフを出力しました。
確かに、勝率80%以上の組み合わせ(14ケース中5ケース)は実際のグラフでも右肩上がりになっています。
ー検証1 結果
パターンについて明確な法則は見られませんでした。
ただ、明確に勝率が高い組み合わせと低い組み合わせが発生している事が分かりました。
そのため、(この後の検証で)勝率が高い組み合わせの発生率を高くする事で、現実でも再現性の高い現象になるのではないかと考えられます。
仮に、総パターン14回、うち5パターンが勝ちとすると、
5÷14=35%がシミュレーション上の勝率ですが、
8パターンを勝ちにすることができれば
8÷14=57%となり、平均以上の確率で資産を増やせる事となる為です。
では、どういった事をすれば、この勝率は高められるのでしょうか?
ー検証2 AとBの確立差を変えて検証してみる
パロンドのパラドックスで検証しているゲームは、
ゲームAは勝率49%、ゲームBは2分の1で勝率10%、2分の1で勝率75%という構成になっています。
ここから、この数字にどんな意味があるのか?
ゲームA/Bの勝率差を変える事で収支にどのように影響するかを検証していきます。
まずは、ゲームBの勝率の差を無くし、ゲームAと同じように
49%の確率で負ける状態で検証してみます。(パラメーターを偶数の時10%→49%、奇数の時75%→49%とする。)
すると、これまで勝率100%近くあったパターンが消え、全てのパターンが勝率30%になってしまいました。
ここから、ゲームBにおける10%と75%の勝率差がノイズとなり、確実に資産を増やすパターンを産んでいる事が分かります。
因みにこのノイズ(=勝率差)を最大まで大きくした結果は下記です。偶数の時10%→1%、奇数の時75%→90%と変更し検証しました。結果のグラフは下記の通りです。
結論としては14パターン中5パターンが100%の確立で資本が増えており、最大の確率差にする事に意味はなく、一定以上の差がある事がゲームBの条件であると分かりました。
次に、ゲームBの勝率は変えず、ゲームAの勝率を低くして検証しました。
ゲームAの勝率を49%→40%、49%→30%に変えて検証すると下記の結果となりました。
勝率40%の場合では14ケース中3パターン、30%では1パターンしか勝てない結果となりました。
結果、ゲームAの勝率を下げると、収支がプラスになる組み合わせが減るようです。(当たり前と言えば当たり前ですが)
ゲームAの「勝率49%」という数字は、平均以下ではありますが、その中では最大値のラインです。
その為、全体の勝率を高めるには、単体では負けつつもできるだけ高い勝率を維持する事が重要であると分かります。
また、ゲームAをゲームB同様に「偶数の時10%、奇数の時75%」のケースにすると、全14ケースの全ての勝率は0%になってしまいました。
ー検証2 結果
上記の検証をまとめると、
ゲームBの「一定以上の勝率差があるゲーム」×ゲームAの「できるだけ高い確率で負けているゲーム」
の組み合わせがパロンドのパラドックスを産むために重要であり、ゲームBの確率差を無くすか、ゲームAの平均勝率を下げると、資産が増えるパターンが極端に減ってしまう事がわかりました。
まとめ
ここから、パロンドのパラドックスを用いて利益を産むために言える法則は以下であると仮説できると思います。
「安定して負けるが、できるだけ勝率の高いゲーム(ゲームA)」があること。この勝率が低くなったり、安定性が無くなると勝率の高い組み合わせのパターン数が減る。(現実的に負けやすくなる)
同じく「大きく買って大きく負けるゲーム(ゲームB)」をノイズとして含むこと。ゲームBの勝率差が大きくなくゲームAの様に平均的な勝率差になると、同様に勝率の高い組み合わせのパターン数が減る。ただ、一定以上の勝率差があれば勝率差が開いても結果は変わらない。
株に当て嵌めてみる
ここから、どういった株の買い方をすると勝率が上がりやすいのか、考えてみます。
上記1.より、「少し負けてもいいから安定していて大きく負けない買い方」をすること。つまり、いつもは株価が下がったらすぐ損切して損切貧乏のゲームをする(ゲームA)
上記2.より、2分の1で勝てるゲームであると分かった場合には必ず勝負に出てみること(ゲームB)。例えば「市場が○○の時には○○の株価が上がり、逆に××の時には△△の株価が上がる」といった特定の条件に嵌められそうな場合はその賭けをしてみること。
この、「損切貧乏+賭けやすい勝負で賭ける」買い方がパロンドのパラドックスの条件に当てはまりやすい、つまり「いつも負けているが資産は増えている」状態を作るのではないかと考えられます。
今回は、パロンドのパラドックスと、それを実践利用する為にいくつかのケースでシミュレーションをしてみました。
如何でしたでしょうか?
下記にシミュレーションのコードを記載しますので、皆さんも様々なケースで検証してみてください!
コード
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib # 追加
# ゲームAの勝率とゲームBの勝率設定
def game_A():
return 1 if np.random.rand() < 0.49 else -1
def game_B(capital):
if capital % 2 == 0: # 偶数時の勝率
return 1 if np.random.rand() < 0.01 else -1
else: # 奇数時の勝率
return 1 if np.random.rand() < 0.99 else -1
# シミュレーション関数
def simulate_games(num_rounds, pattern):
capital_history = [0]
capital = 0
for i in range(num_rounds):
if pattern[i % len(pattern)] == 'A':
capital += game_A()
elif pattern[i % len(pattern)] == 'B':
capital += game_B(capital)
capital_history.append(capital)
return capital_history
# プラスになる確率を計算する関数
def calculate_probability(num_simulations, num_rounds, pattern):
positive_results = 0
for _ in range(num_simulations):
final_capital = simulate_games(num_rounds, pattern)[-1]
if final_capital > 0:
positive_results += 1
return positive_results / num_simulations
# 組み合わせ
patterns = [
['A', 'A', 'A', 'B'], ['A', 'A', 'B', 'A'], ['A', 'A', 'B', 'B'],
['A', 'B', 'A', 'A'], ['A', 'B', 'A', 'B'], ['A', 'B', 'B', 'A'],
['A', 'B', 'B', 'B'], ['B', 'A', 'A', 'A'], ['B', 'A', 'A', 'B'],
['B', 'A', 'B', 'A'], ['B', 'A', 'B', 'B'], ['B', 'B', 'A', 'A'],
['B', 'B', 'A', 'B'], ['B', 'B', 'B', 'A']
]
# シミュレーション回数とゲーム数
num_rounds = 300
num_simulations = 1000 # 確率計算に使うシミュレーション回数
# 各パターンに対してシミュレーションを実行し、資本推移を計算
pattern_histories = [simulate_games(num_rounds, pattern) for pattern in patterns]
# 各パターンに対して確率を計算し、20%以上のパターンを収集
probabilities = []
for pattern in patterns:
probability = calculate_probability(num_simulations, num_rounds, pattern)
probabilities.append(probability)
pattern_str = ', '.join(pattern)
print(f"パターン ({pattern_str}) のプラスになる確率: {probability * 100:.2f}%")
# プラスになる確率が30%以上のパターンのみプロット
plt.figure(figsize=(14, 7))
for i, pattern in enumerate(patterns):
if probabilities[i] >= 0.30:
plt.plot(pattern_histories[i], label=f"{pattern} (確率: {probabilities[i] * 100:.2f}%)")
# グラフの設定
plt.xlabel("ゲーム回数")
plt.ylabel("資本")
plt.title("プラスになる確率が30%以上のパターンの資本推移")
plt.legend(loc="best")
plt.grid(True)
plt.show()
この記事が気に入ったらサポートをしてみませんか?