Strasmore Research
学習 Matt Connor著者: Matt Connor

Brierスコアとは?確率予測の評価方法

Brierスコアは、確率予測と実際の結果の二乗誤差を平均した指標です。低いほど優れ、常に「50%」と予測すると0.25になります。

ブライアスコアは、確率予測を実際の結果と照らして評価する指標です。提示した確率から結果(事象が起きた場合は1、起きなかった場合は0)を引き、その差を二乗します。これを行ったすべての予測について平均します。数値が低いほど優れています。0は完全な予測実績を示し、すべてについて「50%」と答えた場合のスコアは0.25です。

Brierスコアとは何か

予測とは確率についての主張であり、単独の確率が正しいか間違っているかを判断することはできない。ある事象が起きる確率を30%と予測し、実際に起きたとする。その予測は間違いだったのか。まだ判断できない。1950年、気象予報士向けに執筆したGlenn Brierは、個々の予測を採点しないことでこの問題に対処した。Brierスコアは、予測記録全体をまとめて評価する。

以下は、10件の予測を仮に並べた記録である。これらの数値は市場データではなく、計算方法を示すために作ったものである。

  • 90%と予測し、事象が起きた。二乗誤差は0.01。
  • 80%と予測し、起きた。0.04。
  • 70%と予測し、起きなかった。0.49。
  • 60%と予測し、起きた。0.16。
  • 50%と予測し、起きなかった。0.25。
  • 40%と予測し、起きなかった。0.16。
  • 30%と予測し、起きた。0.49。
  • 20%と予測し、起きなかった。0.04。
  • 10%と予測し、起きなかった。0.01。
  • 95%と予測し、起きた。0.0025。

10件の二乗誤差を合計すると1.6525になる。これを10で割ると、Brierスコアは0.165である。計算はこれで全てだ。MacやLinuxに標準搭載されているpython3で実行できる。インストールもライブラリも必要ない。

  • rows = [(0.90, 1), (0.80, 1), (0.70, 0), (0.60, 1), (0.50, 0), (0.40, 0), (0.30, 1), (0.20, 0), (0.10, 0), (0.95, 1)]
  • brier = sum((p - o) * (p - o) for p, o in rows) / len(rows)
  • flat = sum((0.5 - o) * (0.5 - o) for _, o in rows) / len(rows)
  • print(round(brier, 3), round(flat, 3)) prints 0.165 0.25

0.25が基準となる理由

すべての事象について50%と予測すると、どのような結果になっても、二乗誤差は0.25になります。この固定された0.25が、あらゆるイエス・ノー形式の質問における無情報ベンチマークです。スキルスコアは、1から自分のスコアをベンチマークのスコアで割った値を引いて算出します。架空のログである0.165は、スキルスコア0.34に相当します。

ただし、スコア管理では重要な注意点があります。評価対象の事象が発生する確率が10%しかない場合、個々の質問について何も知らなくても、毎回一律に10%と答えればスコアは0.09になります。偏りの大きい質問群では、0.25未満のスコアだけでスキルがあるとは判断できません。適切なベンチマークは、実際に回答した質問のベースレートです。

キャリブレーションと確信度は同時に評価される

キャリブレーションとは、70%と予測した事象のうち、実際に約70%が起きることを指す。統計学で分解能と呼ばれる確信度は、何らかの情報を得たときに、基準率からどの程度離れた予測をするかを示す。すべての質問に50%と答える予測者は、キャリブレーションは完全だが、まったく役に立たない。ブライアスコアは、この二つの性質を同時に評価する。キャリブレーションのずれはスコアを押し上げ、確信度が高いほどスコアは低下する。

作成したログを予測確率ごとに区分すると、キャリブレーションの確認方法が分かる。Pythonでは、区分ごとに一行、hits = [o for p, o in rows if p >= 0.8]とし、その後にhitsの平均を求める。

  • 予測確率10%~30%、平均20%:3件中1件が発生し、33%。
  • 予測確率40%~50%、平均45%:2件中0件が発生し、0%。
  • 予測確率60%~70%、平均65%:2件中1件が発生し、50%。
  • 予測確率80%~95%、平均88%:3件中3件が発生し、100%。

予測が10件では、これらの区分から意味のある傾向を読み取るにはまったく不十分である。キャリブレーションの確認には、区分ごとに解決済みの質問が数百件必要となる。このページの残りの部分では、数百万件の予測を含むログを使用する。

市場自身の予測を検証する

上場オプションには、明示された確率のように機能する数値が付いています。デルタは、原資産株が一ドル動いたときにオプション価格がどれだけ動くかを示します。満期時にイン・ザ・マネー(価値がある状態)になるか、無価値になるかのいずれかである契約では、デルタの絶対値が、イン・ザ・マネーになる市場のインプライド確率に近い水準になります。これはAAPLのインプライド・ボラティリティを決めるのと同じボラティリティ・サーフェスから導かれます。すべての契約には満期があるため、これらの予測はすべて検証されます。

下のパネルでは、満期のおよそ一カ月前に観測されたSPYの全オプションを、2025年1月から2026年5月まで、表示されたデルタ別に区分しています。そして、各契約がイン・ザ・マネーで満期を迎えた頻度を集計しています。

クエリSPYオプションのデルタとイン・ザ・マネーで満期を迎えた頻度
各数値の背後にある正確なSQL
WITH settle AS
(
    SELECT
        date                             AS settle_date,
        any(toFloat64(underlying_close)) AS settle_px
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date >= '2025-01-01'
      AND date <  '2026-08-01'
    GROUP BY date
),
scored AS
(
    SELECT
        toUInt8(floor(abs(toFloat64(g.delta)) * 10))    AS bucket,
        abs(toFloat64(g.delta))                         AS stated,
        startsWith(lower(toString(g.option_type)), 'c') AS is_call,
        if(is_call,
           s.settle_px > toFloat64(g.strike_price),
           s.settle_px < toFloat64(g.strike_price))     AS finished_itm
    FROM global_markets.options_greeks AS g
    INNER JOIN settle AS s ON s.settle_date = g.expiration_date
    WHERE g.underlying_symbol = 'SPY'
      AND g.date >= '2025-01-01'
      AND g.date <  '2026-06-01'
      AND g.expiration_date <= '2026-07-31'
      AND g.days_to_expiry BETWEEN 28 AND 35
      AND g.iv_converged = 1
      AND g.volume > 0
      AND abs(g.delta) > 0.02
      AND abs(g.delta) < 0.98
)
SELECT
    concat(toString(bucket * 10), ' to ', toString(bucket * 10 + 10), '%') AS stated_bucket,
    round(avg(stated) * 100, 1)       AS stated_pct,
    round(avg(finished_itm) * 100, 1) AS finished_itm_pct,
    count()                           AS sample_size
FROM scored
GROUP BY bucket
ORDER BY bucket
Run this yourself

二つの系列を比較してください。最も低い区分では、市場が平均5.2%と示し、実際にイン・ザ・マネーとなったのは3.7%でした。最も高い区分では、表示された94%に対し、実際にイン・ザ・マネーとなったのは96.5%でした。10区分全体で見ると、実現頻度は表示された確率と同じ水準にあります。これがキャリブレーション表の役割です。予測値と実際の結果の差を単一の平均値に隠さず、区分ごとに明らかにします。

市場はコイントスを上回るのか

次はスコアそのものです。同じ手法で、いくつかの有名銘柄について、各銘柄のBrierスコアを、まったく同じ契約を対象に算出した一律50%のベースラインと並べています。

クエリ原資産別、市場が示した確率のブライアスコア
各数値の背後にある正確なSQL
WITH settle AS
(
    SELECT
        underlying_symbol                AS sym,
        date                             AS settle_date,
        any(toFloat64(underlying_close)) AS settle_px
    FROM global_markets.options_greeks
    WHERE underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'TSLA')
      AND date >= '2025-01-01'
      AND date <  '2026-08-01'
    GROUP BY sym, settle_date
),
scored AS
(
    SELECT
        g.underlying_symbol                             AS symbol,
        abs(toFloat64(g.delta))                         AS stated,
        startsWith(lower(toString(g.option_type)), 'c') AS is_call,
        if(is_call,
           s.settle_px > toFloat64(g.strike_price),
           s.settle_px < toFloat64(g.strike_price))     AS finished_itm
    FROM global_markets.options_greeks AS g
    INNER JOIN settle AS s
        ON s.sym = g.underlying_symbol AND s.settle_date = g.expiration_date
    WHERE g.underlying_symbol IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'TSLA')
      AND g.date >= '2025-01-01'
      AND g.date <  '2026-06-01'
      AND g.expiration_date <= '2026-07-31'
      AND g.days_to_expiry BETWEEN 28 AND 35
      AND g.iv_converged = 1
      AND g.volume > 0
      AND abs(g.delta) > 0.02
      AND abs(g.delta) < 0.98
)
SELECT
    symbol,
    round(avg((stated - finished_itm) * (stated - finished_itm)), 4) AS market_brier,
    round(avg((0.5 - finished_itm) * (0.5 - finished_itm)), 4)       AS coin_flip_brier,
    formatReadableQuantity(count())                                  AS graded_contracts
FROM scored
GROUP BY symbol
ORDER BY market_brier
Run this yourself

NVDA28.54 thousand件の評価済み契約で0.1122のスコアとなり、同一銘柄群における一律ベースラインの0.25と比較されます。6銘柄のうち最も弱いSPYでも、スコアは0.1375です。ここでオプションに魔法があるわけではありません。ディープ・アウト・オブ・ザ・マネーの契約はデルタが0.02前後で、ほとんどが権利消滅します。これは的中させやすい予測であり、その容易さがスコアに織り込まれています。Brierスコアを単独で示しても、ほとんど意味をなさない主な理由はそこにあります。

同じ予測者でも質問によってスコアは異なります

同一の手法でも、質問が確定するまでの期間で分けると、スコアは変動します。

クエリ満期までの期間別の市場のブライアスコア(SPY)
各数値の背後にある正確なSQL
WITH settle AS
(
    SELECT
        date                             AS settle_date,
        any(toFloat64(underlying_close)) AS settle_px
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'SPY'
      AND date >= '2025-01-01'
      AND date <  '2026-08-01'
    GROUP BY date
),
scored AS
(
    SELECT
        multiIf(g.days_to_expiry <=   7, 1,
                g.days_to_expiry <=  14, 2,
                g.days_to_expiry <=  30, 3,
                g.days_to_expiry <=  60, 4,
                g.days_to_expiry <= 120, 5,
                6)                                      AS horizon_rank,
        abs(toFloat64(g.delta))                         AS stated,
        startsWith(lower(toString(g.option_type)), 'c') AS is_call,
        if(is_call,
           s.settle_px > toFloat64(g.strike_price),
           s.settle_px < toFloat64(g.strike_price))     AS finished_itm
    FROM global_markets.options_greeks AS g
    INNER JOIN settle AS s ON s.settle_date = g.expiration_date
    WHERE g.underlying_symbol = 'SPY'
      AND g.date >= '2025-01-01'
      AND g.date <  '2026-06-01'
      AND g.expiration_date <= '2026-07-31'
      AND g.days_to_expiry BETWEEN 1 AND 250
      AND g.iv_converged = 1
      AND g.volume > 0
      AND abs(g.delta) > 0.02
      AND abs(g.delta) < 0.98
)
SELECT
    multiIf(horizon_rank = 1, '1 to 7 days',
            horizon_rank = 2, '8 to 14 days',
            horizon_rank = 3, '15 to 30 days',
            horizon_rank = 4, '31 to 60 days',
            horizon_rank = 5, '61 to 120 days',
            '121 to 250 days')                                       AS horizon,
    round(avg((stated - finished_itm) * (stated - finished_itm)), 4) AS market_brier,
    round(avg((0.5 - finished_itm) * (0.5 - finished_itm)), 4)       AS coin_flip_brier,
    count()                                                          AS sample_size
FROM scored
GROUP BY horizon_rank
ORDER BY horizon_rank
Run this yourself

市場のデルタは、残存期間が1 to 7 daysの契約で0.1084、残存期間が121 to 250 daysの契約で0.1218となりました。同じ予測者、同じ手法でも、対象となる質問の組み合わせは異なります。一定の50%ベースラインは、最初の行では0.25、最後の行では0.25に位置します。これが、すべての期間を通じて唯一の固定された基準です。二人の予測者を比較する場合は、同じ期間に同じ質問を対象としなければなりません。そうでなければ、予測能力ではなく質問の難易度を比較することになります。

適切なスコアリングルールが重要な理由

平均絶対誤差は、確率予測と結果の単純な距離の平均です。合理的な代替指標に聞こえますが、評価指標としては問題があります。ある事象が起きる確率を自分は70%と本当に考えているとします。70%と予測すると、期待絶対誤差は0.7 × 0.3 + 0.3 × 0.7 = 0.42です。代わりに100%と予測すると、0.7 × 0 + 0.3 × 1 = 0.30に低下します。絶対誤差では、正直な予測ほど不利になります。確信度を過大に示すほど有利になる指標は、予測の質を測っていません。

Brierスコアには、この欠陥がありません。70%と考えて70%と予測すると、期待スコアは0.7 × 0.09 + 0.3 × 0.49 = 0.21です。100%と予測すると0.30に上昇します。60%と予測すると0.22に上昇します。最小値は、自分が考える確率と正確に一致します。この性質を持つルールを適切なルールと呼びます。Brierスコアが予測コンテストの標準になった理由もここにあります。

対数スコアも、一般的な適切なルールです。実際に起きた結果に割り当てた確率の自然対数を取り、符号を反転します。起きた事象に1%を割り当てると4.6の損失になり、0%では無限大になります。架空の10件の予測では、対数スコアは0.483となり、一律のベースラインの0.693を下回ります。Brierスコアは0から1の範囲に収まるため、スコアカードとして直感的です。一方、対数スコアには上限がありません。テール部分にリスクが集中する評価には、こちらが適しています。

イベント契約が示すこと

何かが起きれば1ドル、起きなければ0ドルを支払うイベント契約は、すでに確率を示す価格で取引される。62セントは、スプレッドと手数料を除く前の62%予測に相当する。イベント契約価格を確率として読む方法ではこの換算を、イベント契約の決済方法では「起きた」とは何を意味するのかを契約文言に沿って説明している。

この価格には、公開された実績と決済日を伴う予測が織り込まれている。そのため、自分の予測記録が上回るべきベンチマークとなる。同じ問いについて、同じ期間を対象に予測を採点する。Brierスコアが価格から導かれるスコアを上回るトレーダーは、その問いの集合に測定可能な優位性がない。取引に付随するストーリーがどれほど説得力を持っていても同じである。賭けのオッズからブックメーカーのマージンを除くことで、同じ検証をスポーツオッズにも適用できる。金利市場では、Fedの金利オッズが、決済日が定まった問いに対する日付付きの確率を示す。

これらのパネルによる市場評価方法

Deltaは、各契約について毎日記録されるオプションのグリークスに基づく。観測日に売買高があり、ボラティリティの収束解が得られた契約だけを対象とする。結果は、契約の満期日における原資産の終値から判定する。その終値が行使価格を上回ればコールはイン・ザ・マネー、下回ればプットはイン・ザ・マネーとする。実際の決済は終値後の権利行使判断を通じて行われるため、行使価格の数ペニー以内に張り付いた契約では、この単純化と異なる決済になる可能性がある。これらのパネルに含まれる契約はすべてすでに満期を迎えている。また、より長い期間の区分ほど、対象期間内のより早い観測日から抽出される。観測日と満期日の間に株式分割があれば、行使価格と決済価格の尺度が異なる。そのためにも、各区分ではサンプル数を併記している。

Deltaは、実世界の確率ではなく、リスク中立確率を近似する。両者の差はオプション価格に織り込まれたリスクプレミアムによって生じる。キャリブレーション表は、その差を初めからないものとせず、測定するための手段となる。

FAQ

Brierスコアは低いほうがよいですか?

はい。Brierスコアは誤差の指標です。0は完全な予測、1は起こらなかったすべての事象について100%と予測した場合の最低評価です。すべての質問に50%と答えた場合のスコアは0.25なので、0.25未満ならそれを上回ります。

良いBrierスコアとはどの程度ですか?

質問の難易度によって変わるため、普遍的な基準はありません。明日の降雨を予測する気象予報士が0.10、接戦の選挙を予測する政治予測者が0.18だったとしても、両者を比較することはできません。同じ期間に同じ質問へ回答した予測者同士でのみ、スコアを比較してください。

Brierスコアが0.25の場合、何を意味しますか?

すべての質問に50%と答えた予測者のスコアです。どの結果になっても、予測誤差を二乗した値は0.25になります。これは、イエスかノーで答える質問群における標準的な無情報ベンチマークです。ただし、質問群の結果が一方に偏っている場合は、ベースレートをベンチマークにする必要があります。

Brierスコアはlogスコアとどう違いますか?

どちらも適正スコアリングルールです。実際に信じている確率を提示したときに、スコアが最小になります。Brierスコアは誤差を二乗し、0から1の範囲に収まります。logスコアは、確信度の高い誤予測をはるかに厳しく評価します。起きた事象に対して0%と予測すると、損失は無限大になります。

オプションのデルタを確率として読めますか?

デルタの絶対値は、オプションが満期時にイン・ザ・マネーとなる市場のインプライド確率に近い値です。ただし、これは現実世界の確率ではなく、リスク中立確率です。上のパネルではデルタを予測値として評価しています。一方の軸に提示されたデルタを、もう一方の軸に実際にイン・ザ・マネーで満期を迎えた契約の割合を示しています。


このページの各パネルには、その直下に正確なSQLが掲載されています。そのため、評価結果を一行ずつ監査できます。同じ質問について、自分の予測記録を市場の予測と比較したい場合は、Strasmore terminalで数値を平易な英語で依頼してください。

#prediction markets#forecasting#brier score#calibration#event contracts