任意停止定理とギャンブルの数学

カジノで「倍々賭け」という戦略を聞いたことがあるでしょうか。負けたら賭け金を倍にし、勝ったらやめるというものです。この戦略を使えば、最終的に必ず1単位の利益を得られるように見えます。公平なゲーム(マルチンゲール)では「平均的には損も得もしない」はずなのに、適切なタイミングで止めれば必ず勝てるのでしょうか。

答えは「いいえ」です。しかし、なぜ「いいえ」なのかを厳密に理解するには、任意停止定理(Optional Stopping Theorem, OST)とその適用条件を正確に把握する必要があります。任意停止定理は、「いつゲームをやめるか」という停止時刻でのマルチンゲールの性質を明らかにする定理です。

任意停止定理は以下のような場面で威力を発揮します。

  • ギャンブル理論: 公平なゲームで「必勝法」が存在しないことの厳密な証明を与えます
  • 確率論: ランダムウォークの初到達時刻の期待値計算に使われます
  • 金融工学: アメリカンオプションの最適行使タイミングの解析に応用されます
  • 統計学: 逐次検定(sequential testing)の停止規則の設計に不可欠です
  • コンピュータ科学: ランダムアルゴリズムの期待実行時間の解析に使われます

本記事では、任意停止定理の主張と証明を解説し、ギャンブラーの破産問題やランダムウォークの初到達問題など古典的な応用をPythonシミュレーションで検証します。

本記事の内容

  • 停止時刻の定義と具体例
  • 任意停止定理の主張と成立条件
  • 証明のエッセンス
  • ギャンブラーの破産問題への応用
  • ランダムウォークの初到達時刻の計算
  • 倍々賭け戦略の分析
  • Pythonシミュレーションによる検証

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

停止時刻とは

直感的な理解

停止時刻(stopping time)とは、「過去と現在の情報だけに基づいてゲームを止めるタイミング」のことです。大事なのは、「未来の情報を使わずに、止めるかどうかを判断する」という条件です。

日常的な例で考えてみましょう。

  • 「株価が100ドルを超えたら売る」— これは停止時刻です。現在の株価を見れば条件を満たすかどうか判断できます
  • 「株価が最高値をつけた時点で売る」— これは停止時刻ではありません。最高値かどうかは未来の株価を知らないと判断できないからです
  • 「3回連続で負けたらやめる」— これは停止時刻です。過去の結果だけで判断できます

形式的な定義

確率空間 $(\Omega, \mathcal{F}, P)$ 上のフィルトレーション $\{\mathcal{F}_n\}_{n \geq 0}$ に対して、確率変数 $\tau: \Omega \to \{0, 1, 2, \dots\} \cup \{\infty\}$ が停止時刻であるとは、任意の $n \geq 0$ に対して、

$$ \begin{equation} \{\tau \leq n\} \in \mathcal{F}_n \end{equation} $$

が成り立つことです。同値な条件として $\{\tau = n\} \in \mathcal{F}_n$ も使われます。

この条件の意味は、「時刻 $n$ までの情報 $\mathcal{F}_n$ だけで、$\tau \leq n$(すでに停止したかどうか)を判定できる」ということです。

具体例

例1: ランダムウォーク $S_n$ に対して、$\tau = \min\{n \geq 0 : S_n = a\}$(初めて $a$ に到達する時刻)は停止時刻です。$S_n = a$ かどうかは時刻 $n$ の情報で判定できます。

例2: $\tau = \min\{n \geq 0 : S_n \geq a \text{ or } S_n \leq -b\}$($a$ に到達するか $-b$ に到達するかの早い方)も停止時刻です。これはギャンブラーの破産問題の停止時刻に対応します。

例3: $\tau = \arg\max_n S_n$($S_n$ の最大値を達成する時刻)は停止時刻ではありません。最大値を達成したかどうかは未来の値を知らないと判定できません。

停止時刻の概念を理解したところで、任意停止定理の主張を見ましょう。

任意停止定理の主張

基本定理

任意停止定理(Optional Stopping Theorem): $\{M_n\}_{n \geq 0}$ がマルチンゲール(または上マルチンゲール)であり、$\tau$ が停止時刻であるとする。以下の条件のいずれかが成り立つとき、

$$ \begin{equation} E[M_\tau] = E[M_0] \end{equation} $$

(上マルチンゲールの場合は $E[M_\tau] \leq E[M_0]$)が成り立つ。

十分条件(以下のいずれか):

  1. $\tau$ が有界: ある定数 $N$ が存在して $\tau \leq N$ a.s.
  2. $\tau$ が有限かつ $M_n$ が有界: $P(\tau < \infty) = 1$ かつ $|M_{n \wedge \tau}| \leq C$ a.s. となる定数 $C$ が存在
  3. $\tau$ の期待値が有限かつ増分が有界: $E[\tau] < \infty$ かつ $|M_{n+1} - M_n| \leq C$ a.s. となる定数 $C$ が存在(ドゥーブの形)

定理が成り立たない場合

任意停止定理が失敗する例を見ておくことは、定理の条件を理解する上で重要です。

対称ランダムウォーク: $S_n = \sum_{k=1}^n X_k$($X_k = \pm 1$ を等確率)はマルチンゲールです。$\tau = \min\{n : S_n = 1\}$(初めて $+1$ に到達する時刻)を考えます。

$S_\tau = 1$ なので、任意停止定理が成り立てば $E[S_\tau] = 1 = E[S_0] = 0$ となり矛盾します。

実は $\tau$ は有限($P(\tau < \infty) = 1$)ですが、$E[\tau] = \infty$(期待到達時刻が無限大)です。したがって条件3は満たされず、任意停止定理は適用できません。この例は、$P(\tau < \infty) = 1$ だけでは不十分であることを示しています。

なぜ条件が必要なのか — 直感的な理解

マルチンゲールの定義 $E[M_{n+1} | \mathcal{F}_n] = M_n$ は、固定された時刻 $n$ での性質です。停止時刻 $\tau$ はランダムなので、「$\tau$ の時点でマルチンゲール性が保たれるか」は自明ではありません。

問題は、$\tau$ が大きな値をとる可能性がある場合に起こります。$\tau$ が大きな値をとるパスでは $M_\tau$ も大きな値をとり得るため、期待値の計算において「レアだが極端に大きい値」が影響を及ぼします。条件1, 2, 3は、このような極端なケースを排除する役割を果たしています。

証明のエッセンスを見た後、具体的な応用に進みましょう。

証明のエッセンス

有界な停止時刻の場合

最もクリーンな場合である「$\tau \leq N$ a.s.」の証明を示します。

$\tau \leq N$ のとき、停止された過程 $M_{n \wedge \tau}$($n \wedge \tau = \min(n, \tau)$)もマルチンゲールであることを示します。

$$ E[M_{(n+1) \wedge \tau} | \mathcal{F}_n] = E[M_{(n+1) \wedge \tau} \mathbf{1}_{\{\tau \leq n\}} + M_{(n+1) \wedge \tau} \mathbf{1}_{\{\tau > n\}} | \mathcal{F}_n] $$

$\{\tau \leq n\}$ のとき $(n+1) \wedge \tau = \tau = n \wedge \tau$ なので $M_{(n+1) \wedge \tau} = M_{n \wedge \tau}$。$\{\tau > n\}$ のとき $(n+1) \wedge \tau = n + 1$, $n \wedge \tau = n$ なので $M_{(n+1) \wedge \tau} = M_{n+1}$。

$$ = M_{n \wedge \tau} \mathbf{1}_{\{\tau \leq n\}} + E[M_{n+1} | \mathcal{F}_n] \mathbf{1}_{\{\tau > n\}} $$

$\{\tau \leq n\} \in \mathcal{F}_n$ と $\{\tau > n\} \in \mathcal{F}_n$(停止時刻の定義)であること、そしてマルチンゲール性 $E[M_{n+1} | \mathcal{F}_n] = M_n$ を使うと、

$$ = M_{n \wedge \tau} \mathbf{1}_{\{\tau \leq n\}} + M_n \mathbf{1}_{\{\tau > n\}} = M_{n \wedge \tau} $$

したがって $M_{n \wedge \tau}$ はマルチンゲールです。

$M_{n \wedge \tau}$ がマルチンゲールなので $E[M_{n \wedge \tau}] = E[M_0]$ が任意の $n$ で成り立ちます。$n = N$ とすると $N \wedge \tau = \tau$($\tau \leq N$ なので)であり、

$$ E[M_\tau] = E[M_{N \wedge \tau}] = E[M_0] $$

が得られます。$\square$

この証明の鍵は、停止された過程 $M_{n \wedge \tau}$ がマルチンゲールであるという事実です。停止時刻の定義($\{\tau \leq n\} \in \mathcal{F}_n$)がここで本質的に使われています。

では、この定理を具体的な問題に応用してみましょう。

応用1: ギャンブラーの破産問題

問題の設定

ギャンブラーが初期資金 $a$ ドルを持っています。公平なコイン投げを繰り返し、表が出たら1ドル勝ち、裏が出たら1ドル負けます。資金が $a + b$ ドル(目標達成)に到達するか、0ドル(破産)に到達したらゲームを終了します。

このゲームでの破産確率を求めましょう。

マルチンゲールによる解法

資金を $S_n$ とすると、$S_0 = a$ であり、$S_n$ はマルチンゲールです。停止時刻 $\tau = \min\{n : S_n = 0 \text{ or } S_n = a + b\}$ は有界ではありませんが、$S_{n \wedge \tau}$ は $[0, a+b]$ に有界なマルチンゲールです。

$P(\tau < \infty) = 1$ であることが知られています(対称ランダムウォークは有界な区間を有限時間で脱出する)。有界な停止マルチンゲールに対して任意停止定理を適用すると、

$$ E[S_\tau] = E[S_0] = a $$

$S_\tau$ は $0$ か $a + b$ のどちらかの値しかとらないので、破産確率を $q$ とすると、

$$ E[S_\tau] = q \cdot 0 + (1 – q)(a + b) = a $$

$q$ について解くと、

$$ \begin{equation} q = \frac{b}{a + b} \end{equation} $$

つまり、初期資金 $a$ で目標 $a + b$ に到達するか破産するかのゲームでは、破産確率は $b/(a+b)$ です。直感的にも、$a$ が小さい(資金が少ない)ほど破産確率は高くなります。

ゲームの所要時間

ゲームが終了するまでの期待時間も、マルチンゲールを使って求められます。$M_n = S_n^2 – n$ は($S_n$ がマルチンゲールなので)マルチンゲールであることが確認できます。

$$ E[S_{n+1}^2 | \mathcal{F}_n] = E[(S_n + X_{n+1})^2 | \mathcal{F}_n] = S_n^2 + 2S_n E[X_{n+1}] + E[X_{n+1}^2] = S_n^2 + 1 $$

ここで $E[X_{n+1}] = 0$, $E[X_{n+1}^2] = 1$ を使いました。したがって $M_n = S_n^2 – n$ に対して $E[M_{n+1} | \mathcal{F}_n] = S_n^2 + 1 – (n+1) = M_n$。

$M_{n \wedge \tau}$ は有界なので($|S_{n \wedge \tau}| \leq a+b$, $n \wedge \tau \leq \tau$)、任意停止定理を適用すると、

$$ E[S_\tau^2 – \tau] = E[S_0^2 – 0] = a^2 $$

$S_\tau$ の値は $0$ か $a+b$ なので、$E[S_\tau^2] = (1-q)(a+b)^2 = a(a+b)$。

$$ E[\tau] = E[S_\tau^2] – a^2 = a(a+b) – a^2 = ab $$

$$ \begin{equation} E[\tau] = ab \end{equation} $$

初期資金 $a$、目標利益 $b$ のゲームの期待所要時間は $ab$ です。$a = b$ の場合、期待所要時間は $a^2$ と初期資金の2乗に比例して増大します。

次に、不公平なゲームの場合を考えてみましょう。

応用2: 不公平なゲームの破産確率

指数マルチンゲールの利用

コインの表の確率が $p \neq 1/2$ のとき、$S_n$ 自体はマルチンゲールではありません。しかし、指数マルチンゲールを構成することで、任意停止定理を適用できます。

$X_k = +1$ w.p. $p$, $X_k = -1$ w.p. $q = 1 – p$ のとき、パラメータ $\theta > 0$ に対して

$$ M_n = \left(\frac{q}{p}\right)^{S_n} $$

がマルチンゲールであることを確認します。$r = q/p$ と置くと、

$$ E[r^{S_{n+1}} | \mathcal{F}_n] = r^{S_n} E[r^{X_{n+1}}] = r^{S_n}(p \cdot r + q \cdot r^{-1}) = r^{S_n}\left(\frac{pq}{p} + \frac{qp}{q}\right) = r^{S_n} \cdot 2\sqrt{pq} $$

これは一般には $M_n$ と等しくなりませんが、実は $E[r^{X_{n+1}}] = p \cdot (q/p) + q \cdot (p/q) = q + p = 1$ なので、

$$ E[M_{n+1} | \mathcal{F}_n] = r^{S_n} = M_n $$

が成り立ちます。したがって $M_n = (q/p)^{S_n}$ はマルチンゲールです。

不公平なゲームの破産確率

停止時刻 $\tau$ での任意停止定理($M_{n \wedge \tau}$ は有界なので適用可能)を使うと、

$$ E[M_\tau] = E[M_0] = r^a $$

$S_\tau = 0$ または $S_\tau = a + b$ なので、

$$ q_{\text{ruin}} \cdot r^0 + (1 – q_{\text{ruin}}) \cdot r^{a+b} = r^a $$

$q_{\text{ruin}}$ について解くと、

$$ \begin{equation} q_{\text{ruin}} = \frac{r^a – r^{a+b}}{1 – r^{a+b}} = \frac{(q/p)^a – (q/p)^{a+b}}{1 – (q/p)^{a+b}} \end{equation} $$

$p = q = 1/2$ のとき $r = 1$ となり、この式は $0/0$ の不定形になりますが、ロピタルの定理を適用すると $q_{\text{ruin}} = b/(a+b)$ に帰着し、公平なゲームの結果と一致します。

$p < 1/2$(不利なゲーム)のとき $r > 1$ なので $q_{\text{ruin}} > b/(a+b)$、つまり公平なゲームよりも破産確率が高くなります。逆に $p > 1/2$(有利なゲーム)のとき $r < 1$ なので破産確率は低くなります。

では、任意停止定理が適用できない典型例として、倍々賭け戦略を分析しましょう。

応用3: 倍々賭け戦略はなぜ失敗するのか

戦略の説明

倍々賭け戦略(martingale betting strategy, doubling strategy)は次のようなものです。

  1. 最初に1単位を賭ける
  2. 勝ったら1単位の利益を得てゲーム終了
  3. 負けたら賭け金を倍にして再度賭ける
  4. 2, 3を繰り返す

$k$ 回連続で負けた後に初めて勝つと、累積賭け金は $1 + 2 + \dots + 2^{k-1} = 2^k – 1$ ですが、$k$ 回目の勝ちで $2^k$ を受け取るので、利益は $2^k – (2^k – 1) = 1$ です。何回負けても、最終的に勝てば利益は必ず1です。

なぜ任意停止定理が適用できないのか

公平なゲームでの累積損益はマルチンゲールです。停止時刻 $\tau$(初めて勝つ時刻)は $P(\tau < \infty) = 1$ なので確実に有限ですが、$\tau$ は有界ではありません。

$\tau$ 時点での累積賭け金は $2^\tau – 1$ であり、$E[2^\tau – 1] = \sum_{k=1}^\infty (2^k – 1)(1/2)^k = \infty$ です。したがって、任意停止定理の条件(停止されたマルチンゲールの有界性)が満たされません。

直感的に言えば、倍々賭け戦略は「ほぼ確実に1単位勝つ」けれども、「非常に小さな確率で天文学的な額を失う」のです。期待値を計算すると、

$$ E[\text{利益}] = 1 \cdot P(\text{いつか勝つ}) – \text{(無限大の損失)} \cdot P(\text{一度も勝たない}) $$

$P(\text{一度も勝たない}) = 0$ ですが、損失の条件付き期待値が発散するため、期待利益はゼロ(マルチンゲール性の帰結)に留まります。

教訓: 停止時刻に対してマルチンゲール性を維持するには、適切な条件(有界性や可積分性)が必要です。倍々賭け戦略は「無限の資金と無限の賭け限度額」がなければ実行不可能であり、現実の有限な制約のもとでは必勝法にはなりません。

Pythonによるシミュレーション

ギャンブラーの破産問題の検証

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)

# --- パラメータ ---
a = 10   # 初期資金
b = 20   # 目標利益
n_sim = 100000

# --- 公平なゲーム (p = 0.5) ---
ruin_count = 0
times = []

for _ in range(n_sim):
    S = a
    t = 0
    while 0 < S < a + b:
        S += np.random.choice([-1, 1])
        t += 1
    if S == 0:
        ruin_count += 1
    times.append(t)

ruin_prob_sim = ruin_count / n_sim
ruin_prob_theory = b / (a + b)
E_tau_sim = np.mean(times)
E_tau_theory = a * b

# --- 不公平なゲーム: 複数のpで破産確率 ---
p_values = np.linspace(0.3, 0.7, 50)
ruin_sim_list = []
ruin_theory_list = []

for p in p_values:
    count = 0
    for _ in range(10000):
        S = a
        while 0 < S < a + b:
            S += 1 if np.random.random() < p else -1
        if S == 0:
            count += 1
    ruin_sim_list.append(count / 10000)
    r = (1 - p) / p
    if abs(r - 1) < 1e-10:
        ruin_theory_list.append(b / (a + b))
    else:
        ruin_theory_list.append((r**a - r**(a+b)) / (1 - r**(a+b)))

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# 左: サンプルパス
ax = axes[0]
for i in range(15):
    S = a
    path = [S]
    while 0 < S < a + b:
        S += np.random.choice([-1, 1])
        path.append(S)
    color = 'red' if S == 0 else 'green'
    ax.plot(range(len(path)), path, linewidth=0.7, alpha=0.6, color=color)
ax.axhline(0, color='red', linestyle='--', linewidth=1, alpha=0.5, label='Ruin')
ax.axhline(a + b, color='green', linestyle='--', linewidth=1, alpha=0.5, label='Target')
ax.axhline(a, color='k', linestyle=':', linewidth=1, alpha=0.3)
ax.set_xlabel('Step', fontsize=12)
ax.set_ylabel('Fortune $S_n$', fontsize=12)
ax.set_title(f"Gambler's ruin (a={a}, b={b})", fontsize=13)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# 中: 破産確率 vs p
ax = axes[1]
ax.plot(p_values, ruin_sim_list, 'bo', markersize=3, alpha=0.6, label='Simulation')
ax.plot(p_values, ruin_theory_list, 'r-', linewidth=2, label='Theory')
ax.axvline(0.5, color='gray', linestyle=':', linewidth=1, alpha=0.5)
ax.set_xlabel('Win probability $p$', fontsize=12)
ax.set_ylabel('Ruin probability', fontsize=12)
ax.set_title(f'Ruin probability (a={a}, b={b})', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# 右: ゲーム所要時間のヒストグラム
ax = axes[2]
ax.hist(times, bins=100, density=True, alpha=0.7, color='steelblue',
        edgecolor='white', linewidth=0.5, range=(0, min(max(times), 2000)))
ax.axvline(E_tau_sim, color='b', linestyle='-', linewidth=2,
           label=f'Mean = {E_tau_sim:.0f}')
ax.axvline(E_tau_theory, color='r', linestyle='--', linewidth=2,
           label=f'Theory = {E_tau_theory}')
ax.set_xlabel('Game duration $\\tau$', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title('Distribution of game duration', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('gamblers_ruin.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"破産確率 - シミュレーション: {ruin_prob_sim:.4f}, 理論: {ruin_prob_theory:.4f}")
print(f"期待所要時間 - シミュレーション: {E_tau_sim:.1f}, 理論: {E_tau_theory}")

ギャンブラーの破産問題のシミュレーション結果から、以下のことが確認できます。

  1. 左図: サンプルパスが0(破産)または $a+b$(目標達成)のいずれかに到達している。赤いパスは破産($S_n = 0$ に到達)、緑のパスは目標達成($S_n = a + b$ に到達)を表しています。初期資金 $a = 10$ で目標利益 $b = 20$ の場合、破産するパスが多いことが視覚的に分かります

  2. 中図: 破産確率がシミュレーション(青い点)と理論(赤い曲線)で正確に一致している。$p = 0.5$(公平なゲーム)では破産確率は $b/(a+b) = 2/3 \approx 0.667$ です。$p$ が大きくなる(有利になる)と破産確率は急速に低下し、$p$ が小さくなる(不利になる)と破産確率は1に近づきます

  3. 右図: ゲームの所要時間の分布が右に長い裾を持つ。期待所要時間 $E[\tau] = ab = 200$ とシミュレーションの平均が一致しています。分布は指数的に減衰する長い裾を持ち、非常に長いゲームが稀に発生することを示しています

倍々賭け戦略のシミュレーション

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(123)

# --- 倍々賭け戦略のシミュレーション ---
n_trials = 100000
max_rounds = 30  # 最大ラウンド数(有限資金の制約)

profits = []
max_bets = []

for _ in range(n_trials):
    bet = 1
    total_loss = 0
    rounds = 0
    while rounds < max_rounds:
        rounds += 1
        if np.random.random() < 0.5:  # 勝ち
            profit = bet - total_loss
            profits.append(profit)
            max_bets.append(bet)
            break
        else:  # 負け
            total_loss += bet
            bet *= 2
    else:
        # max_rounds回連続で負けた場合
        profits.append(-total_loss)
        max_bets.append(bet // 2)

profits = np.array(profits)
max_bets = np.array(max_bets)

# --- 資金制限ありの場合 ---
budget_limits = [100, 1000, 10000, 100000]

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# 左上: 利益の分布(制限なし、max_rounds=30)
ax = axes[0, 0]
ax.hist(profits, bins=100, density=True, alpha=0.7, color='steelblue',
        edgecolor='white', linewidth=0.5)
ax.set_xlabel('Profit', fontsize=12)
ax.set_ylabel('Density', fontsize=12)
ax.set_title(f'Doubling strategy (max {max_rounds} rounds)', fontsize=13)
ax.set_xlim(-500, 50)
ax.grid(True, alpha=0.3)
info = f"Mean profit: {np.mean(profits):.2f}\nP(profit > 0): {np.mean(profits > 0):.4f}"
ax.text(0.95, 0.95, info, transform=ax.transAxes, fontsize=10,
        verticalalignment='top', horizontalalignment='right',
        bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))

# 右上: 必要な最大賭け金の分布
ax = axes[0, 1]
ax.hist(np.log2(max_bets), bins=range(max_rounds + 1), density=True,
        alpha=0.7, color='coral', edgecolor='white', linewidth=0.5)
ax.set_xlabel('Max bet size ($\\log_2$)', fontsize=12)
ax.set_ylabel('Probability', fontsize=12)
ax.set_title('Distribution of max bet required', fontsize=13)
ax.grid(True, alpha=0.3)

# 左下: 資金制限ありの場合の平均利益
ax = axes[1, 0]
mean_profits = []
for budget in budget_limits:
    trial_profits = []
    for _ in range(50000):
        bet = 1
        total_loss = 0
        while bet <= budget - total_loss:
            if np.random.random() < 0.5:
                trial_profits.append(1)
                break
            else:
                total_loss += bet
                bet *= 2
        else:
            trial_profits.append(-total_loss)
    mean_profits.append(np.mean(trial_profits))

ax.bar(range(len(budget_limits)), mean_profits, color='steelblue', alpha=0.7)
ax.set_xticks(range(len(budget_limits)))
ax.set_xticklabels([f'${b:,}' for b in budget_limits])
ax.set_xlabel('Budget limit', fontsize=12)
ax.set_ylabel('Mean profit', fontsize=12)
ax.set_title('Mean profit with finite budget', fontsize=13)
ax.axhline(0, color='r', linestyle='--', linewidth=1)
ax.grid(True, alpha=0.3)

# 右下: 累積利益の推移
ax = axes[1, 1]
for budget in [100, 1000]:
    cumulative = []
    total = 0
    for _ in range(5000):
        bet = 1
        total_loss = 0
        while bet <= budget - total_loss:
            if np.random.random() < 0.5:
                total += 1
                break
            else:
                total_loss += bet
                bet *= 2
        else:
            total -= total_loss
        cumulative.append(total)
    ax.plot(range(len(cumulative)), cumulative, linewidth=1,
            label=f'Budget = ${budget}')

ax.set_xlabel('Game number', fontsize=12)
ax.set_ylabel('Cumulative profit', fontsize=12)
ax.set_title('Cumulative profit over many games', fontsize=13)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.axhline(0, color='k', linestyle='-', linewidth=0.5)

plt.tight_layout()
plt.savefig('doubling_strategy.png', dpi=150, bbox_inches='tight')
plt.show()

倍々賭け戦略のシミュレーション結果から、以下の重要な教訓が得られます。

  1. 左上: ほとんどの試行で利益は1だが、稀に巨額の損失が発生する。分布は $+1$ に巨大なスパイクを持ち、負の方向に長い裾を引いています。「ほぼ確実に勝つ」という直感は正しいのですが、平均利益は(任意停止定理の条件が満たされないため)ゼロに近い値になります

  2. 右上: 必要な最大賭け金が指数的に大きくなる可能性がある。$k$ 回連続で負ける確率は $(1/2)^k$ と小さいですが、そのとき $2^k$ の賭け金が必要です。10回連続の負け(確率 $\approx 0.1\%$)で賭け金は1024倍になります

  3. 左下: 有限の資金制限のもとでは、平均利益はゼロ(またはわずかにマイナス)。どんなに大きな資金を用意しても、長期的な期待利益はゼロに収束します。これは任意停止定理の帰結です — 有限の資金制限は停止されたマルチンゲールの有界性を保証するため、定理が正しく適用できるのです

  4. 右下: 累積利益は階段状に上昇するが、まれに大きく落ち込む。多くのゲームで1ずつ利益が積み上がりますが、連敗時の損失で一気に帳消しになります。「コツコツ勝ってドカンと負ける」パターンが明確に見えます

任意停止定理の条件の重要性

任意停止定理が成り立つための条件を改めて整理しましょう。条件が満たされない場合にどのような問題が生じるかを理解することは、この定理を正しく使うために不可欠です。

ドゥーブの任意停止定理の精密な条件

定理: $\{M_n\}$ がマルチンゲール、$\tau$ が停止時刻のとき、以下のいずれかの条件が成り立てば $E[M_\tau] = E[M_0]$ です。

  1. $\tau$ がほぼ確実に有界: $P(\tau \leq N) = 1$ となる定数 $N$ が存在する
  2. $\tau$ がほぼ確実に有限で、$M_{\tau \wedge n}$ が一様可積分: $P(\tau < \infty) = 1$ かつ $\{M_{\tau \wedge n}\}_{n \geq 0}$ が一様可積分
  3. $E[\tau] < \infty$ かつ増分が有界: $E[\tau] < \infty$ で $E[|M_{n+1} - M_n| \mid \mathcal{F}_n] \leq c$(定数)

条件3はウォルドの恒等式(Wald’s identity)の一般化に対応します。ギャンブラーの破産問題では、停止時刻が有限であることの証明が非自明ですが、ランダムウォークの再帰性から $E[\tau] < \infty$ が保証されます。

連続時間への拡張

連続時間のマルチンゲール(たとえばブラウン運動 $B_t$)に対しても任意停止定理は成り立ちます。ブラウン運動が区間 $[-a, b]$ の境界に初めて到達する時刻 $\tau$ に対して、$E[B_\tau] = 0$ から $P(B_\tau = b) = a/(a+b)$ が得られます。

さらに、$B_t^2 – t$ もマルチンゲールであるため、$E[B_\tau^2] = E[\tau]$ が成り立ち、$E[\tau] = ab$ が導けます。これは離散の場合のギャンブラーの破産問題の連続版です。

まとめ

本記事では、任意停止定理の理論と応用について解説しました。

  • 停止時刻は「過去と現在の情報のみに基づいてゲームを止めるタイミング」であり、$\{\tau \leq n\} \in \mathcal{F}_n$ で定式化されます
  • 任意停止定理: マルチンゲール $\{M_n\}$ と停止時刻 $\tau$ に対して、適切な条件(有界性、一様可積分性、期待値の有限性のいずれか)のもとで $E[M_\tau] = E[M_0]$ が成り立ちます
  • ギャンブラーの破産問題: 任意停止定理を公平なランダムウォークに適用して、破産確率 $q = b/(a+b)$ と期待所要時間 $E[\tau] = ab$ を導出しました
  • 不公平なゲーム: 指数マルチンゲール $(q/p)^{S_n}$ を用いて、一般の $p$ での破産確率を求めました。マルチンゲールの選択が問題に応じて異なることがポイントです
  • 倍々賭け戦略: 任意停止定理の条件が満たされない場合の反例として分析しました。有限の資金制限のもとでは必勝法は存在しないことが、定理から厳密に示されます
  • 条件の精密化: 一様可積分性やウォルドの恒等式との関係を通じて、定理が適用可能かどうかを判定する方法を整理しました

次のステップとして、以下の記事も参考にしてください。