本アプリでは、高速フォールド形式のオンラインポーカーにおけるプレイヤーの実力差を反映するため、EV bb/100 に基づくベイズ型レーティングを採用しています。この形式は毎ハンド対戦相手がランダムに入れ替わるため、固定テーブルに基づく順位評価や単純な勝敗集計では実力を正確に評価できません。そこで、「順位は使わず、観測された EV bb/100 を絶対値として推定する」アプローチをとっています。
1. レーティングの構造
各プレイヤーのレーティングは、次の連続値の組で表現されます。
- 推定実力(μ, mu):単位は bb/100。バッチ内のプール平均を補正した「超過実力」を示し、値が高いほど強いと推定されます。初期値は 0 とし、新規プレイヤーは不確実性を大きく持たせます。
- 不確実性(σ, sigma):μ の推定の信頼度を表します。プレイが増えるにつれて σ は小さく収束します。初期値は 50 とし、長期間更新がない場合は時間減衰により増加させ、下限 σ_min = 5 を設けて過収束を防ぎます。
- ボラティリティ(ν, volatility):プレイヤーごとの観測変動のスケールです。直近の観測 bb/100 の変動を基に計算し、観測分散に反映します。ステークスごとの標準偏差と組み合わせ、ばらつきの大きいプレイヤーを過小評価しないようにします。
- 累積ハンド数(hands):更新に使用した総ハンド数で、μ・σ・ν の更新精度に直接関与します。
ランクや勝率ではなく、連続的な実力推定と不確実性を組み合わせた構造にしています。
2. 観測モデル:EV 補正済み bb/100 のみ使用
高速フォールド形式では短期の運によるブレが大きいため、実収支による評価は誤差が大きくなります。そのため、EV 補正済み収支(All-in EV adjusted)のみを観測値として利用します。これはオールインが発生したハンドではエクイティに基づく期待値で結果を置換し、それ以外のハンドは実際の結果をそのまま用いた収支です。
- 観測値 y_i =(バッチ内 EV 補正済み収支)÷(ハンド数)× 100
- 例:500 ハンドで EV 補正済み収支が +250 bb → 観測値 y_i = 50 bb/100
- この観測値をガウス分布の観測として、μ・σ をベイズ更新により推定します。
3. バッチ強度(μ_batch)の同時推定
同一バッチ内では対戦相手がランダムに入れ替わるため、観測値をそのまま反映すると「強いプレイヤーが多いテーブル」「弱いプレイヤーが多いテーブル」で偏差が生じます。そこでバッチ強度 μ_batchを導入し、各バッチの平均的強さを推定します。
- μ_batch は、各プレイヤーの事前推定 μ_i と観測分散を考慮した重み付き平均で推定します。
- 外れ値の影響を抑えるため、観測値の上下 10% をトリムしてから推定します。
- 補正:y_i_corrected = y_i − μ_batch。μ_i の更新はこの補正後の値を用います。
これにより、バッチごとの相対偏りを除去し、絶対的な実力差のみを評価できます。
4. プレイヤー別ボラティリティと観測分散
観測値の分散はプレイヤーごとに異なるため、ボラティリティ ν_i を導入します。
- ν_i = 直近 N 回の観測 bb/100 の標準偏差 ÷ ステークス基準(本実装では N=20、clamp で 0.5〜2.0 に制限)。
- 観測分散 V_i =(ステークス基準 × ν_i)² ÷(ハンド数/100)。
- ばらつきの大きいプレイヤーは分散が大きくなるため、ベイズ更新で急激な下振れによる過小評価を防ぎます。
この手法はLAG プレイヤーや高変動プレイヤーを保護する効果があります。
5. 時間減衰(ドリフト)
長期間更新がないプレイヤーは推定が古くなる可能性があるため、σ に対して時間減衰を適用します。
- σ² ← σ² + k × Δt(日数)。μ は更新せず、σ のみ増加します。
- 短期間ではほぼ変化なし、数十日で σ が増加するよう k を設定しています。
これによりメタ変化や休止期間の影響を反映できます。
6. ステークス別分散補正
異なるステークスではプレイヤーの振る舞いが異なります。観測分散はステークスごとの基準値(σ_stake)を持たせ、ボラティリティと組み合わせます。
- V_i =(σ_stake × ν_i)² ÷(ハンド数/100)。
- 現在は基準ステークス 50/100(NL100)の値を設定しています。
7. ベイズ更新手順
- プレイヤーの観測 y_i と観測分散 V_i を計算
- μ_batch をトリム+加重平均で推定
- 観測値を補正:y_i_corrected = y_i − μ_batch
- 時間減衰の適用(必要に応じて σ 増加)
- μ_i, σ_i をベイズ更新
- ボラティリティ ν_i を更新
更新後、プレイヤーの累積ハンド数も加算します。
8. 更新タイミングとバッチ設計
- ストリーミング対応:各プレイヤーが累積 500 ハンドを超えたタイミングで更新します。全員のバッチを揃える必要はありません。
- μ_batch は同じバッチに参加したプレイヤー間で共有します。
- 500 ハンド未満のバッチでは更新を行いません(分散が大きすぎるため)。
9. 表示レーティング
- 表示レーティング = μ − 2σ。μ はバッチ平均との差なので、プール平均に対する超過実力を表します。
- 信頼区間(約 95%):μ ± 2σ で表示可能です。
- 最終更新日時を表示することで、推定の鮮度も確認できます。
例:「+25 bb/100 over pool」→ そのバッチの平均より 100 ハンドあたり 25 bb 多く稼いでいることを示します。
10. メリットと特徴
- 運の影響を排除:実収支ではなく EV 補正済み収支を使用します。
- 小規模バッチや偏りへの耐性:μ_batch 同時推定と外れ値トリム。
- LAG プレイヤーの過小評価防止:プレイヤー別ボラティリティを反映。
- 長期放置への対応:時間減衰による σ 増加。
- ステークス別分散補正:異なるステークスでのばらつきを考慮。
- 連続値レーティング:ランクではなく連続的な実力指標として解釈可能です。
総括
本レーティング設計は、高速フォールド形式のオンラインポーカーに特化しており、短期的な運ノイズを排除しつつ、プール補正・プレイヤー別ボラティリティ・時間減衰・ステークス別分散を組み合わせることで、長期的な実力差を推定します。ストリーミング対応と累積ハンドベースの更新により、過小評価・過信・バッチ偏り・休止期間の影響を最小化する構造になっています。