0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

期待値プラスでも破産する?Kelly基準と機械学習モデルの確率校正

0
Posted at

Kelly基準入門:確率予測・資金管理・モデル校正まで

0. この記事の目的

Kelly基準は、一言でいえば「勝てる可能性がある勝負に、資金の何割を投じるべきか」を決める考え方です。

ただし、Kelly基準は単なる賭け金計算式ではありません。重要なのは、次の3点です。

  1. 期待値がプラスでも、賭けすぎると長期的には破産に近づくことがある。
  2. Kelly基準は、資金の対数成長率を最大化する考え方である。
  3. 機械学習モデルと組み合わせる場合、正解率よりも「確率の当たり具合」が重要である。

この記事では、古典的なKelly基準から使い方、機械学習モデルとの接続、そして危険な落とし穴までを整理します。

1. Kelly基準とは何か

Kelly基準は、1956年にJohn L. Kelly Jr.が発表した論文に由来します。もともとは通信理論の文脈で、「情報がどれだけ資金成長に役立つか」を説明するために提案されました。

現在では、カジノ、スポーツベッティング、投資、ポートフォリオ最適化などで、「資金配分の基準」として語られます。

Kelly基準の中心思想は、次のとおりです。

1回ごとの利益額ではなく、長期的な資金の成長率を最大化する。

ここでいう成長率は、単純な平均利益ではなく、資金が何倍になっていくかという複利の成長率です。したがって、Kelly基準は「一撃で大勝ちする方法」ではありません。むしろ、「賭けすぎて退場することを避けながら、長期的に増やす」ための考え方です。

2. なぜ期待値最大化だけでは危ないのか

まず、単純なコイントスを考えます。

勝つ確率が60%、負ける確率が40%で、勝てば賭け金と同額の利益が得られ、負ければ賭け金を失うとします。

この勝負の期待値はプラスです。

1円賭けた場合、期待利益は次のようになります。

$$
0.6 \times 1 + 0.4 \times (-1) = 0.2
$$

つまり、1円あたり平均0.2円の利益が見込めます。

では、期待値がプラスなら毎回全財産を賭ければよいのでしょうか。

答えは明確に「いいえ」です。

全財産を賭け続けると、どこかで1回負けた瞬間に資金はゼロになります。勝率が60%でも、十分長く続ければ負けはほぼ確実に発生します。つまり、期待値だけを見ると合理的に見える行動が、長期的には破滅的になります。

ここがKelly基準の出発点です。

資金管理では、「平均的に儲かるか」だけでなく、「負けたときにゲームから退場しないか」を同時に考える必要があります。

3. 固定割合で賭けるという考え方

Kelly基準では、毎回の賭け金を固定額ではなく、現在資金に対する割合で考えます。

たとえば、資金が100万円で、10%を賭けるなら10万円を賭けます。次に資金が110万円になれば11万円、資金が90万円になれば9万円を賭けます。

このように、現在の資金に対して一定割合を賭ける方法を「固定割合賭け」と呼びます。

勝ったとき、資金は増えます。負けたとき、資金は減ります。しかし、全額を賭けない限り、一度の負けで資金がゼロになることはありません。

この「何割を賭けるべきか」を決めるのがKelly基準です。

4. 最も基本的なKelly公式

二択の勝負を考えます。

勝つ確率を p、負ける確率を q = 1 - p とします。勝ったとき、賭け金1に対して b の利益が得られるとします。たとえば、賭け金1に対して利益1なら b = 1 です。賭け金1に対して利益1.5なら b = 1.5 です。

このとき、Kelly基準での最適な賭け割合 f* は次の式になります。

$$
f^* = \frac{bp - q}{b}
$$

ここで、f* は現在資金のうち何割を賭けるべきかを表します。

たとえば、f* = 0.1 なら資金の10%を賭ける、f* = 0.25 なら資金の25%を賭ける、という意味です。

もし f* <= 0 なら、その勝負には賭けないほうがよいという意味です。

5. 小数オッズで書くKelly公式

スポーツベッティングなどでは、小数オッズがよく使われます。

小数オッズ odds は、「1賭けたときに、当たれば合計いくら返ってくるか」を表します。

たとえば、小数オッズが2.5なら、1を賭けて当たると2.5返ってきます。このうち1は元本なので、利益は1.5です。

したがって、先ほどの b は次のように書けます。

$$
b = odds - 1
$$

これをKelly公式に代入すると、次の形になります。

$$
f^* = \frac{odds \times p - 1}{odds - 1}
$$

この式は実装しやすいです。

例として、勝率の見積もりが55%、小数オッズが2.10の場合を考えます。

$$
f^* = \frac{2.10 \times 0.55 - 1}{2.10 - 1}
$$

$$
f^* = \frac{1.155 - 1}{1.10} = 0.1409...
$$

つまり、理論上は資金の約14.1%を賭ける計算になります。

ただし、これはかなり大きい値です。理由は後で説明しますが、確率の見積もりが少し外れるだけで、Kelly基準は危険になります。

6. なぜ対数を最大化するのか

Kelly基準は、期待利益ではなく、期待対数成長率を最大化します。

勝てば資金が 1 + bf 倍になり、負ければ 1 - f 倍になるとします。ここで、f は資金のうち賭ける割合です。

このとき、1回あたりの期待対数成長率 G(f) は次のようになります。

$$
G(f) = p \log(1 + bf) + (1 - p) \log(1 - f)
$$

Kelly基準は、この G(f) が最大になる f を選びます。

対数を使う理由は、複利の世界では足し算ではなく掛け算で資金が変わるからです。

たとえば、資金が2倍になった後に半分になると、最終的には元に戻ります。

$$
2 \times 0.5 = 1
$$

しかし、単純平均では「+100%と-50%なので平均+25%」に見えてしまいます。これは長期の資金成長を正しく表していません。

対数で見ると、掛け算の変化を足し算として扱えます。

$$
\log(2 \times 0.5) = \log 2 + \log 0.5 = \log 1 = 0
$$

つまり、対数成長率を見ることで、複利で本当に増えているかを評価できます。

7. 期待値がプラスでも、賭けすぎると負ける

Kelly基準の重要な性質は、「最適割合を超えて賭けると危険が急激に増える」ことです。

勝率60%、勝てば賭け金と同額の利益、負ければ賭け金を失う場合を考えます。

この場合、p = 0.6, q = 0.4, b = 1 なので、Kelly割合は次のようになります。

$$
f^* = \frac{1 \times 0.6 - 0.4}{1} = 0.2
$$

つまり、資金の20%を賭けるのがKelly基準です。

では、30%や40%を賭けたらどうなるでしょうか。

期待値はまだプラスに見えるかもしれません。しかし、対数成長率は下がります。さらに賭け割合を増やしすぎると、対数成長率はマイナスになります。

この状態では、短期的には勝つことがあっても、長期的には資金が減っていく方向に進みます。

ここで間違えてはいけないのは、Kelly基準は「勝てる勝負なら強気に賭けろ」という話ではないことです。むしろ逆で、Kelly基準は「賭けすぎると、期待値がプラスでも死ぬ」と教えてくれる基準です。

8. Full Kelly、Half Kelly、Quarter Kelly

理論上のKelly割合をそのまま使うことを、Full Kellyと呼びます。

しかし、現実にはFull Kellyをそのまま使うのは危険です。理由は、勝率 p の見積もりが完全ではないからです。

たとえば、本当の勝率が55%なのに、モデルが60%と見積もったとします。この場合、Kelly割合は過大になります。過大な賭け金は、資金変動を激しくし、最悪の場合は長期成長率をマイナスにします。

そのため、実際はKelly割合に係数をかけて小さくすることがよくあります。

$$
f = c \times f^*
$$

ここで c は 0 から 1 の間の値です。

代表例は次のとおりです。

呼び方 係数 c 意味
Full Kelly 1.0 理論上のKelly割合をそのまま使う
Half Kelly 0.5 Kelly割合の半分だけ賭ける
Quarter Kelly 0.25 Kelly割合の4分の1だけ賭ける
1/8 Kelly 0.125 Kelly割合の8分の1だけ賭ける

現実のデータ分析では、まずHalf Kelly以下を検討するほうが安全です。モデルの確率推定には誤差があるためです。

雑に言うなら、Kelly基準は切れ味が鋭い包丁です。よく切れますが、確率推定が雑だと自分の指を切ります。

9. 機械学習とKelly基準の接続

機械学習モデルを使う場合、Kelly基準にはモデルが出力する確率が入ります。

たとえば、あるチームが勝つ確率をモデルが55%と予測し、ブックメーカーの小数オッズが2.10だったとします。このとき、Kelly公式に p = 0.55 と odds = 2.10 を入れて、賭け割合を決めます。

ここで重要なのは、モデルが単に「勝つか負けるか」を当てるだけでは不十分だということです。

Kelly基準に必要なのは、分類結果ではなく、確率です。

正解率が高いモデルでも、確率がずれていればKelly基準では危険です。

たとえば、実際には60%程度の確率で起きる事象に対して、モデルが毎回80%と出してしまう場合を考えます。このモデルは方向性としては当たっているかもしれません。しかし、Kelly基準では80%という数字を信じて大きく賭けるため、過剰なリスクを取ってしまいます。

したがって、Kelly基準と機械学習を組み合わせるなら、正解率よりも確率の校正が重要になります。

10. 確率の校正とは何か

確率の校正とは、モデルが出した確率と、実際の発生頻度が合っているかを見る考え方です。

たとえば、モデルが「70%で勝つ」と予測した試合を100件集めたとします。そのうち本当に70件前後勝っていれば、そのモデルは70%付近でよく校正されていると言えます。

逆に、モデルが70%と言っているのに実際には55%しか勝っていないなら、そのモデルは自信過剰です。

Kelly基準では、自信過剰なモデルが特に危険です。なぜなら、確率が高く見積もられるほど、賭け割合も大きくなるからです。

分類モデルでは、次のような評価指標を使い分ける必要があります。

指標 何を見るか Kelly基準との関係
Accuracy 予測ラベルが当たった割合 方向性を見るには使えるが、賭け金決定には弱い
Log Loss 確率予測の悪さ 確率が外れると強く罰するので重要
Brier Score 確率と結果の二乗誤差 確率のずれを見やすい
ECE 予測確率と実際頻度のずれ 校正の確認に使える
Calibration Curve 確率帯ごとのずれ 視覚的に理解しやすい

Kelly基準を使うなら、「分類として当たったか」よりも「確率としてどれだけ正しかったか」を見るべきです。

11. ブックメーカーのオッズと暗黙確率

小数オッズからは、暗黙確率を計算できます。

小数オッズを odds とすると、暗黙確率は次のようになります。

$$
p_{implied} = \frac{1}{odds}
$$

たとえば、小数オッズが2.00なら暗黙確率は50%です。

$$
\frac{1}{2.00} = 0.5
$$

小数オッズが1.80なら、暗黙確率は約55.6%です。

$$
\frac{1}{1.80} = 0.556
$$

モデルの予測確率が、この暗黙確率よりも十分に高い場合、その賭けは価値がある可能性があります。

ただし、実際のオッズには運営側の取り分が含まれます。したがって、単純に 1 / odds を比較するだけでは不十分な場合があります。

二択の試合で、Aのオッズが1.90、Bのオッズも1.90だとします。

それぞれの暗黙確率は次のとおりです。

$$
\frac{1}{1.90} = 0.5263
$$

両方を足すと、

$$
0.5263 + 0.5263 = 1.0526
$$

100%を超えています。この超過分が、運営側の取り分に相当します。

この取り分を考慮しないと、モデルがわずかに有利に見えるだけの場面で誤って価値があると判断してしまいます。

12. 実装:Kelly割合を計算するPython関数

以下は、小数オッズと予測確率からKelly割合を計算する関数です。

from __future__ import annotations


def kelly_fraction(
    p: float,
    odds: float,
    fraction: float = 1.0,
    cap: float | None = None,
) -> float:
    """
    小数オッズに対するKelly賭け割合を計算する。

    Parameters
    ----------
    p : float
        モデルが見積もった勝率。0から1の範囲。
    odds : float
        小数オッズ。勝った場合の総返戻倍率。
    fraction : float
        フラクショナルKellyの係数。Half Kellyなら0.5。
    cap : float | None
        賭け割合の上限。例: 0.05なら最大5%。

    Returns
    -------
    float
        現在資金に対して賭ける割合。
    """
    if not 0 <= p <= 1:
        raise ValueError("p must be between 0 and 1")
    if odds <= 1:
        raise ValueError("odds must be greater than 1")
    if not 0 <= fraction <= 1:
        raise ValueError("fraction must be between 0 and 1")

    b = odds - 1
    f = (odds * p - 1) / b
    f = max(0.0, f)
    f *= fraction

    if cap is not None:
        f = min(f, cap)

    return f

使い方は次のとおりです。

p = 0.55
odds = 2.10

f_full = kelly_fraction(p, odds)
f_half = kelly_fraction(p, odds, fraction=0.5)
f_capped = kelly_fraction(p, odds, fraction=0.5, cap=0.05)

print(f_full)    # 約0.1409
print(f_half)    # 約0.0705
print(f_capped)  # 0.05

fraction と cap を入れることがほぼ必須です。モデルの確率推定に誤差があるからです。

13. 期待対数成長率を計算する

Kelly割合だけでなく、その割合で賭けたときの期待対数成長率も計算できます。

import math


def expected_log_growth(p: float, odds: float, f: float) -> float:
    """
    期待対数成長率を計算する。
    """
    if not 0 <= p <= 1:
        raise ValueError("p must be between 0 and 1")
    if odds <= 1:
        raise ValueError("odds must be greater than 1")
    if not 0 <= f < 1:
        raise ValueError("f must be in [0, 1)")

    b = odds - 1
    return p * math.log(1 + b * f) + (1 - p) * math.log(1 - f)

例として、勝率60%、等倍払いの勝負で、賭け割合を変えてみます。

p = 0.60
odds = 2.00

for f in [0.05, 0.10, 0.20, 0.30, 0.40, 0.50]:
    g = expected_log_growth(p, odds, f)
    print(f"f={f:.2f}, growth={g:.4f}")

この例では、Kelly割合は20%です。20%を超えて賭けると、期待対数成長率は下がっていきます。

14. バックテストの最小構成

機械学習モデルとKelly基準を組み合わせる場合、最低限次の流れが必要です。

  1. 過去データを時系列順に分割する。
  2. 学習期間でモデルを作る。
  3. 検証期間でモデルの校正を確認する。
  4. テスト期間で一切再学習せずに予測する。
  5. 予測確率とオッズを比較し、価値がある場合だけ賭ける。
  6. Kelly割合を計算する。
  7. フラクショナルKellyと上限を適用する。
  8. 資金推移、最大下落率、ROI、賭け回数を評価する。

ここで特に重要なのは、時系列を崩さないことです。

未来の情報が学習に混ざると、バックテストは簡単に良く見えます。これは金融やスポーツ予測では致命的です。モデルの腕ではなく、未来を覗いているだけになります。そこまで来ると、もはや機械学習ではなく反則です。

簡単な資金シミュレーションは次のように書けます。

from dataclasses import dataclass


@dataclass
class BetResult:
    bankroll: float
    stake: float
    won: bool
    f: float


def simulate_bankroll(
    probabilities: list[float],
    odds_list: list[float],
    outcomes: list[int],
    initial_bankroll: float = 10000.0,
    fraction: float = 0.25,
    cap: float = 0.05,
) -> list[BetResult]:
    """
    単純なKellyベースの資金推移を計算する。

    outcomesは、賭け対象が勝ったら1、負けたら0とする。
    """
    bankroll = initial_bankroll
    history: list[BetResult] = []

    for p, odds, outcome in zip(probabilities, odds_list, outcomes):
        f = kelly_fraction(p, odds, fraction=fraction, cap=cap)
        stake = bankroll * f

        if stake <= 0:
            history.append(BetResult(bankroll=bankroll, stake=0.0, won=False, f=0.0))
            continue

        if outcome == 1:
            bankroll += stake * (odds - 1)
            won = True
        else:
            bankroll -= stake
            won = False

        history.append(BetResult(bankroll=bankroll, stake=stake, won=won, f=f))

    return history

このようなシミュレーションでは、最終資金だけを見るのは不十分です。少なくとも次の指標を見るべきです。

指標 意味
最終資金 最後にいくら残ったか
ROI 初期資金に対する増減率
最大下落率 過去最高資金から最大で何%落ちたか
賭け回数 どれだけ頻繁に賭けたか
平均賭け割合 どれだけリスクを取ったか
連敗時の資金推移 心理的に耐えられるか

Kelly基準は長期成長を最大化する考え方ですが、短期の資金変動はかなり大きくなり得ます。したがって、最終利益だけで「良い戦略」と判断するのは危険です。

15. よくある失敗パターン

15.1 予測確率を信じすぎる

Kelly基準の入力は確率です。確率が間違っていれば、出力される賭け割合も間違います。

特に危険なのは、モデルが自信過剰な場合です。実際には55%の事象を70%と見積もると、Kelly基準はかなり大きな賭け割合を出します。

そのため、モデルの正解率だけでなく、確率の校正を確認する必要があります。

15.2 Full Kellyをそのまま使う

Full Kellyは、確率推定が正しいという前提では理論的に優れています。しかし、確率推定が少し過大になるだけで、過剰に賭けることになります。特に金融市場やスポーツでは、環境が変化します。過去に効いたモデルが、将来も同じように効くとは限りません。

したがって、Half Kelly、Quarter Kelly、1/8 Kelly、上限付きKellyなどを使うほうが現実的です。

15.3 オッズの取り分を無視する

オッズには運営側の取り分が含まれます。小数オッズの逆数だけで単純に比較すると、価値があるように見えても、実際には取り分を超えられていないことがあります。

なので、複数選択肢の暗黙確率を合計し、取り分を補正してから比較するほうが安全です。

15.4 バックテストで未来情報を混ぜる

時系列データでランダム分割を使うと、未来の傾向が学習に混ざることがあります。これはスポーツ予測や金融では特に危険です。

学習、検証、テストは時系列順に分ける必要があります。

15.5 相関のある賭けを独立とみなす

複数の賭けが独立していない場合、個別にKelly割合を計算して合計すると、リスクを取りすぎることがあります。

たとえば、同じチーム、同じ市場、同じマクロ要因に依存する複数の賭けは、同時に負ける可能性があります。

この場合は、個別Kellyではなく、ポートフォリオ全体で考える必要があります。

16. 複数資産・複数賭けのKelly基準

投資や複数同時ベットでは、1つの賭けだけを考えるのではなく、資金全体を複数の対象に配分します。

この場合、基本形は次のようになります。

$$
\max_w E[\log(1 + w^T r)]
$$

ここで、w は各対象への配分割合、r は各対象のリターンです。

この問題では、次のような制約が入ります。

  • 空売りを許すか
  • レバレッジを許すか
  • 各対象への最大配分をいくらにするか
  • 現金を残すか
  • 取引コストをどう扱うか

この形は、単純な二択のKelly公式より難しくなります。ただし、目的関数は対数なので、条件がよければ数値最適化で解けます。いきなり複数資産Kellyを使うより、まず単一ベットのKelly、フラクショナルKelly、上限設定、バックテスト、校正確認をきちんと作るほうがよいと思います。

17. Kelly基準を使うときのチェックリスト

Kelly基準を使う前に、少なくとも次を確認するべきです。

確認項目 内容
確率推定 モデルの確率は校正されているか
データ分割 時系列順に学習・検証・テストを分けているか
取引コスト 手数料、スプレッド、控除率を入れているか
オッズ補正 運営側の取り分を考慮しているか
Fractional Kelly Full Kellyを避けているか
上限設定 1回あたりの最大賭け割合を制限しているか
相関 同時に負けるリスクを見ているか
最大下落率 資金の落ち込みに耐えられるか
検証期間 たまたま勝っただけではないか
非定常性 市場や環境の変化を考えているか

このチェックリストを通らないKelly戦略は、数式が正しくても危険です。

18. まとめ

Kelly基準は、期待値がプラスの勝負に対して、長期的な資金成長率を最大化するための資金配分ルールです。

基本公式は次のとおりです。

$$
f^* = \frac{bp - q}{b}
$$

小数オッズで書くと、次の形になります。

$$
f^* = \frac{odds \times p - 1}{odds - 1}
$$

ただし、最も重要なのは公式そのものではありません。

重要なのは、次の理解です。

  • Kelly基準は期待利益ではなく、期待対数成長率を最大化する。
  • 期待値がプラスでも、賭けすぎると長期的に資金が減る。
  • Full Kellyは理論上強いが、確率推定がずれると危険になる。
  • 機械学習と組み合わせる場合、正解率より確率の校正が重要になる。
  • Half Kelly以下、上限付きKelly、厳格なバックテストが必要になる。

Kelly基準は、魔法の勝ち方ではありません。むしろ、「どこまで賭けると危険か」を数式で示すための道具です。

機械学習モデルを使う場合、最大のポイントは、モデルが出した確率をどこまで信じられるかです。ここを誤ると、Kelly基準は合理的な資金管理ではなく、ただの過剰ベット計算機になります。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?