Brier score: come valutare una previsione
Il Brier score misura le previsioni probabilistiche come errore quadratico medio rispetto agli esiti. Più è basso, meglio è: 0,25 equivale a dire sempre «50%».
Il Brier score valuta una previsione probabilistica rispetto a ciò che è effettivamente accaduto. Si prende la probabilità dichiarata, si sottrae l’esito (1 se l’evento si è verificato, 0 in caso contrario), si eleva al quadrato la differenza e poi si calcola la media dei quadrati su tutte le previsioni formulate. Più il punteggio è basso, meglio è: 0 indica un record perfetto, mentre 0,25 è il punteggio ottenuto dichiarando «50%» per ogni evento.
Che cos’è il Brier score?
Una previsione esprime una probabilità, e una singola probabilità non può essere corretta o errata in sé. Hai indicato una probabilità del 30% e l’evento si è verificato. Ti sei sbagliato? Non ancora. Nel 1950 Glenn Brier, scrivendo per i previsori meteorologici, risolse il problema rifiutandosi di valutare una singola previsione. Il punteggio valuta l’intero registro in una volta sola.
Ecco un registro fittizio di dieci previsioni. Nessuno di questi numeri proviene da un mercato: sono inventati per mostrare il calcolo.
- Probabilità indicata: 90%; l’evento si è verificato. Errore quadratico: 0,01.
- Probabilità indicata: 80%; si è verificato. 0,04.
- Probabilità indicata: 70%; non si è verificato. 0,49.
- Probabilità indicata: 60%; si è verificato. 0,16.
- Probabilità indicata: 50%; non si è verificato. 0,25.
- Probabilità indicata: 40%; non si è verificato. 0,16.
- Probabilità indicata: 30%; si è verificato. 0,49.
- Probabilità indicata: 20%; non si è verificato. 0,04.
- Probabilità indicata: 10%; non si è verificato. 0,01.
- Probabilità indicata: 95%; si è verificato. 0,0025.
La somma dei dieci errori quadratici è 1,6525. Dividendo per dieci, il Brier score è 0,165. Questo è l’intero calcolo e può essere eseguito con python3, già incluso in qualsiasi macchina Mac o Linux. Non serve installare nulla e non servono librerie.
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))print0.165 0.25
Perché 0,25 è il valore di riferimento
Assegnate il 50% a ogni evento e ogni errore al quadrato vale 0,25, indipendentemente dall’esito. Questo valore fisso di 0,25 è il benchmark senza informazioni per qualsiasi insieme di domande con risposta sì o no. Lo skill score lo sintetizza in un unico numero: 1 meno il proprio punteggio diviso per quello del benchmark. Il log simulato con un punteggio di 0,165 corrisponde a uno skill score di 0,34.
Una precisazione evita molti errori di valutazione. Se gli eventi analizzati si verificano solo il 10% delle volte, indicare sempre il 10% produce un punteggio di 0,09 anche senza sapere nulla delle singole domande. Un punteggio inferiore a 0,25 non dimostra quindi alcuna abilità quando l’insieme delle domande è sbilanciato. Il benchmark corretto è il tasso di base delle domande a cui si è effettivamente risposto.
Calibrazione e confidenza vengono valutate insieme
La calibrazione indica che, su tutti gli eventi a cui hai assegnato una probabilità del 70%, si verifica circa il 70%. La confidenza, che gli statistici chiamano risoluzione, misura quanto sei disposto ad allontanarti dal tasso di base quando disponi di nuove informazioni. Un previsore che assegna il 50% a ogni domanda è perfettamente calibrato, ma del tutto inutile. Il Brier score tiene conto di entrambe le proprietà: la mancata calibrazione lo aumenta, mentre la confidenza corretta lo riduce.
Raggruppare il log fittizio per probabilità dichiarata mostra come funziona un controllo della calibrazione. In Python si scrive una riga per ogni gruppo, hits = [o for p, o in rows if p >= 0.8], poi si calcola la media di hits.
- Probabilità dichiarata tra il 10% e il 30%, media 20%: l’evento si è verificato 1 volta su 3, pari al 33%.
- Probabilità dichiarata tra il 40% e il 50%, media 45%: l’evento non si è verificato nessuna volta su 2, pari allo 0%.
- Probabilità dichiarata tra il 60% e il 70%, media 65%: l’evento si è verificato 1 volta su 2, pari al 50%.
- Probabilità dichiarata tra l’80% e il 95%, media 88%: l’evento si è verificato 3 volte su 3, pari al 100%.
Dieci previsioni sono del tutto insufficienti per trarre conclusioni da questi gruppi. Per valutare la calibrazione servono centinaia di domande risolte per ciascun gruppo. Il resto di questa pagina utilizza un forecast log che ne contiene milioni.
La previsione del mercato sotto esame
Ogni opzione quotata incorpora un numero che si comporta come una probabilità dichiarata. Il delta misura di quanto varia il prezzo dell’opzione per una variazione di un dollaro del titolo sottostante. Per un contratto che alla scadenza termina in the money, cioè con un valore, oppure senza valore, il valore assoluto del delta è vicino alla probabilità implicita nel mercato che l’opzione termini in the money. Il delta deriva dalla stessa superficie che determina la volatilità implicita di AAPL. Ogni contratto giunge a scadenza, quindi ogni previsione viene verificata.
Il grafico seguente prende in esame tutte le opzioni SPY osservate circa un mese prima della scadenza, da gennaio 2025 a maggio 2026. Le raggruppa per delta dichiarato e conta con quale frequenza il contratto è terminato in the money.
L'esatto SQL dietro ogni numero
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 bucketConfrontate le due serie. Nel bucket più basso il mercato indicava una media di 5.2% e quei contratti sono terminati in the money nel 3.7% dei casi. Nel bucket più alto, a un valore dichiarato di 94% corrispondeva una frequenza del 96.5% di contratti terminati in the money. In tutti i 10 bucket, la frequenza realizzata si colloca nella stessa area di quella indicata. Questo è l’obiettivo di una tabella di calibrazione: mostrare, bucket per bucket, la distanza tra ciò che dichiara un previsore e ciò che accade, invece di nasconderla in una singola media.
Il mercato batte il testa o croce?
Ecco ora il punteggio vero e proprio. La costruzione è la stessa: diversi nomi molto noti, con il Brier score di ciascuno affiancato al baseline piatto del 50%, calcolato sugli stessi identici contratti.
L'esatto SQL dietro ogni numero
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_brierNVDA segna 0.1122 su 28.54 thousand contratti valutati, contro 0.25 del baseline piatto sullo stesso insieme. Anche il peggiore tra i 6 nomi, SPY, arriva a 0.1375. Qui le opzioni non hanno nulla di magico. I contratti deep out of the money hanno delta vicino a 0,02 e nella maggior parte dei casi scadono senza valore. Prevederne correttamente l’esito è quindi facile, e questa facilità è incorporata nel numero. È il motivo principale per cui un Brier score preso da solo dice ben poco.
Lo stesso previsore ottiene punteggi diversi a seconda delle domande
Applicando lo stesso metodo, il punteggio varia in base al tempo necessario perché la domanda trovi una risposta.
L'esatto SQL dietro ogni numero
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_rankIl delta del mercato ha ottenuto 0.1084 sui contratti con 1 to 7 days ancora da risolvere e 0.1218 sui contratti con 121 to 250 days ancora da risolvere. Lo stesso previsore e lo stesso metodo, ma due insiemi diversi di domande. Il riferimento fisso del 50% si colloca a 0.25 nella prima riga e a 0.25 nell’ultima. Per questo rappresenta l’unico riferimento invariato su tutti gli orizzonti temporali. Qualsiasi confronto tra due previsori deve basarsi sulle stesse domande e sulla stessa finestra temporale. In caso contrario, si confronta la difficoltà delle domande, non la capacità.
Perché le proper scoring rules sono importanti
L’errore assoluto medio, cioè la media della distanza semplice tra la probabilità indicata e l’esito, sembra un’alternativa ragionevole, ma produce valutazioni distorte. Supponiamo che tu ritenga davvero che un evento abbia una probabilità del 70%. Indicare 70% porta a un errore assoluto atteso pari a 0,7 x 0,3 + 0,3 x 0,7 = 0,42. Indicare invece 100% lo riduce a 0,7 x 0 + 0,3 x 1 = 0,30. Con l’errore assoluto, il numero espresso in buona fede viene penalizzato. Una metrica che incentiva a sovrastimare la propria sicurezza non misura la qualità delle previsioni.
Il Brier score non presenta questo difetto. Se ritieni che la probabilità sia del 70% e indichi 70%, il punteggio atteso è 0,7 x 0,09 + 0,3 x 0,49 = 0,21. Se indichi 100%, sale a 0,30. Se indichi 60%, sale a 0,22. Il minimo coincide esattamente con il numero che ritieni corretto. Una regola con questa proprietà si definisce proper ed è il motivo per cui il Brier score è diventato lo standard nei forecasting tournament.
Il log score è l’altra proper scoring rule più comune: si calcola il logaritmo naturale della probabilità assegnata all’esito verificatosi e poi se ne cambia il segno. Indicare l’1% per un evento che si verifica comporta un costo di 4,6; indicare lo 0% comporta un costo infinito. Nel set fittizio di dieci previsioni, il log score è pari a 0,483, contro 0,693 per la baseline uniforme. Il Brier score resta compreso tra 0 e 1, un intervallo più intuitivo in una scheda di valutazione. Il log score non ha un limite superiore, caratteristica utile nei sistemi di valutazione in cui il rischio è concentrato negli eventi estremi.
Cosa significa per gli event contract
Un event contract che paga 1 dollaro se si verifica un evento e 0 dollari in caso contrario viene scambiato a un prezzo che esprime già una probabilità. Sessantadue centesimi equivalgono a una previsione del 62%, prima di escludere spread e commissioni. La nostra guida a prezzi degli event contract come probabilità illustra questa conversione, mentre come si regolano gli event contract spiega che cosa significhi «si è verificato» secondo il testo del contratto.
Quel prezzo è una previsione con uno storico pubblico e una data di regolamento. Per questo rappresenta il benchmark che il proprio registro deve superare. Valutate le previsioni sulle stesse domande e nello stesso intervallo temporale. Un trader il cui Brier score è superiore a quello implicito nel prezzo non ha un edge misurabile su quel gruppo di domande, per quanto convincente sia la narrativa associata al trade. Lo stesso test si applica alle quote sportive dopo aver rimosso il vig dalle quote di scommessa e ai rate market, dove le probabilità sui tassi della Fed forniscono una probabilità datata per una domanda con un giorno di risoluzione noto.
Come questi pannelli valutano il mercato
Il delta deriva dallo storico giornaliero delle greche delle opzioni per ciascun contratto. Sono inclusi solo i contratti con volume nel giorno di osservazione e con una soluzione della volatilità convergente. L’esito viene ricavato dalla chiusura del sottostante alla data di scadenza del contratto: una call è considerata in the money quando la chiusura è superiore allo strike, una put quando è inferiore. Il regolamento effettivo avviene tramite una decisione di esercizio dopo la chiusura. Di conseguenza, i contratti con il prezzo ancorato a pochi centesimi dallo strike possono essere regolati in modo diverso da questa semplificazione. Tutti i contratti presenti in questi pannelli sono già scaduti. Le fasce con orizzonte più lungo attingono necessariamente da date di osservazione precedenti all’interno dell’intervallo. Un frazionamento azionario tra la data di osservazione e la scadenza porrebbe strike e prezzo di regolamento su scale diverse. È un ulteriore motivo per cui ogni fascia riporta la numerosità del campione.
Il delta approssima una probabilità risk-neutral, non una probabilità real-world. Le due grandezze differiscono per il premio per il rischio incorporato nei prezzi delle opzioni. Una tabella di calibrazione misura questa differenza invece di darla per scontata.
FAQ
Un punteggio Brier più basso è migliore?
Sì. Il punteggio Brier misura l’errore: 0 indica un record perfetto, mentre 1 è il peggior risultato possibile e si ottiene assegnando il 100% a ogni evento che non si verifica. Qualsiasi valore inferiore a 0,25 è migliore del punteggio ottenuto rispondendo 50% a ogni domanda.
Qual è un buon punteggio Brier?
Non esiste un valore universalmente buono, perché il punteggio dipende dalla difficoltà delle domande. Un previsore meteorologico con 0,10 sulla pioggia di domani e un previsore politico con 0,18 su elezioni combattute non sono confrontabili. I punteggi vanno confrontati solo tra previsori che rispondono alle stesse domande nello stesso intervallo di tempo.
Che cosa significa un punteggio Brier di 0,25?
È il punteggio di un previsore che risponde 50% a tutto, perché ogni errore al quadrato vale allora 0,25, qualunque sia l’esito. È il benchmark standard privo di informazioni per un insieme di domande con risposta sì o no. Tuttavia, un insieme di domande sbilanciato richiede come benchmark il tasso di base.
In che cosa differisce il punteggio Brier dal log score?
Entrambi sono proper scoring rules, cioè regole di valutazione che vengono minimizzate quando si indica la probabilità realmente ritenuta corretta. Il Brier eleva al quadrato l’errore e resta compreso tra 0 e 1. Il log score penalizza molto più severamente gli errori commessi con elevata sicurezza. Assegnare 0% a un evento che si verifica comporta un costo infinito.
Il delta di un’opzione può essere interpretato come una probabilità?
Il valore assoluto del delta è vicino alla probabilità implicita dal mercato che l’opzione finisca in the money. Si tratta di una probabilità risk-neutral, non di una probabilità del mondo reale. I pannelli precedenti lo valutano come una previsione: su un asse è indicato il delta dichiarato, sull’altro la quota di quei contratti che è effettivamente finita in the money.
Ogni pannello qui riportato include l’SQL esatto sottostante, così la valutazione è verificabile riga per riga. Per confrontare un proprio registro di previsioni con quello del mercato sulle stesse domande, chiedi i dati in linguaggio naturale sul terminale Strasmore.