Strasmore Research
Aprendizado Matt ConnorPor Matt Connor

Brier score: como avaliar uma previsão

Entenda como o Brier score mede previsões de probabilidade pelo erro quadrático médio, por que menor é melhor e como o 0,25 serve de referência.

O Brier score avalia uma previsão de probabilidade em comparação com o que de fato aconteceu. Pegue a probabilidade informada, subtraia o resultado observado (1 se o evento ocorreu, 0 se não ocorreu), eleve essa diferença ao quadrado e depois calcule a média dos quadrados em todas as previsões feitas. Quanto menor, melhor: 0 representa um histórico perfeito, e 0,25 é o score obtido ao dizer “50%” para tudo.

O que é o Brier score?

Uma previsão é uma afirmação sobre probabilidade, e uma probabilidade isolada nunca pode estar certa ou errada. Você atribuiu a algo uma probabilidade de 30% e o evento aconteceu. Você estava errado? Ainda não. Glenn Brier, ao escrever para meteorologistas em 1950, contornou esse problema ao se recusar a avaliar qualquer previsão isolada. O score avalia todo o conjunto de previsões de uma só vez.

Veja um conjunto fictício com dez previsões. Nenhum destes números vem de um mercado. Eles foram inventados para mostrar o cálculo.

  • Probabilidade indicada de 90%; o evento aconteceu. Erro ao quadrado: 0,01.
  • Probabilidade indicada de 80%; o evento aconteceu. 0,04.
  • Probabilidade indicada de 70%; o evento não aconteceu. 0,49.
  • Probabilidade indicada de 60%; o evento aconteceu. 0,16.
  • Probabilidade indicada de 50%; o evento não aconteceu. 0,25.
  • Probabilidade indicada de 40%; o evento não aconteceu. 0,16.
  • Probabilidade indicada de 30%; o evento aconteceu. 0,49.
  • Probabilidade indicada de 20%; o evento não aconteceu. 0,04.
  • Probabilidade indicada de 10%; o evento não aconteceu. 0,01.
  • Probabilidade indicada de 95%; o evento aconteceu. 0,0025.

A soma dos dez erros ao quadrado é 1,6525. Dividindo por dez, o Brier score é 0,165. Esse é todo o cálculo. Ele pode ser executado no python3, que já vem instalado em qualquer máquina Mac ou Linux. Não é preciso instalar nada nem usar bibliotecas.

  • 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

Por que 0,25 é o número a superar

Diga 50% para tudo e cada erro quadrático será 0,25, independentemente do resultado. Esse 0,25 fixo é a referência sem informação para qualquer conjunto de perguntas com resposta sim ou não. O skill score transforma esse resultado em um único número: um menos a sua pontuação dividida pela pontuação da referência. O log fictício, com pontuação de 0,165, corresponde a um skill score de 0,34.

Uma ressalva elimina muitos erros de avaliação. Se os eventos avaliados só ocorrerem 10% das vezes, declarar 10% em todas as respostas gera uma pontuação de 0,09 sem exigir qualquer conhecimento sobre as perguntas individuais. Uma pontuação inferior a 0,25 não é evidência de habilidade em um conjunto de perguntas desequilibrado. A referência correta é a taxa-base das perguntas que você realmente respondeu.

Calibração e confiança são avaliadas em conjunto

Calibração significa que, de tudo o que você classificou com probabilidade de 70%, cerca de 70% realmente acontece. Confiança, que os estatísticos chamam de resolução, é o quanto você está disposto a se afastar da taxa-base quando conhece alguma informação. Um analista que atribui 50% a todas as perguntas é perfeitamente calibrado e completamente inútil. O Brier score precifica as duas propriedades ao mesmo tempo: a falta de calibração aumenta a pontuação, enquanto a confiança justificada a reduz.

Agrupar o log fictício pela probabilidade declarada mostra como funciona uma verificação de calibração. Em Python, isso significa uma linha por grupo, hits = [o for p, o in rows if p >= 0.8], seguida da média de hits.

  • Probabilidade declarada de 10% a 30%, média de 20%: 1 de 3 aconteceu, 33%.
  • Probabilidade declarada de 40% a 50%, média de 45%: 0 de 2 aconteceu, 0%.
  • Probabilidade declarada de 60% a 70%, média de 65%: 1 de 2 aconteceu, 50%.
  • Probabilidade declarada de 80% a 95%, média de 88%: 3 de 3 aconteceram, 100%.

Dez previsões estão muito longe de ser suficientes para extrair qualquer conclusão desses grupos. A calibração exige centenas de perguntas resolvidas por grupo. O restante desta página usa um log de previsões com milhões de registros.

Avaliando a própria previsão do mercado

Cada opção listada traz um número que funciona como uma probabilidade declarada. O delta mede quanto o preço da opção varia para uma alta de um dólar na ação subjacente. Em contratos que terminam dentro do dinheiro (com algum valor no vencimento) ou sem valor, o valor absoluto do delta fica próximo da probabilidade implícita pelo mercado de a opção terminar dentro do dinheiro. Ele vem da mesma superfície que determina a volatilidade implícita de AAPL. Todo contrato vence. Portanto, todas essas previsões são avaliadas.

O painel abaixo reúne todas as opções de SPY observadas aproximadamente um mês antes do vencimento, de janeiro de 2025 a maio de 2026. As opções são agrupadas pelo delta declarado, e o painel contabiliza com que frequência cada contrato terminou dentro do dinheiro.

QueryDeltas das opções de SPY versus frequência de fechamento desses contratos dentro do dinheiro
O SQL exato por trás de cada número
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

Compare as duas séries. No grupo mais baixo, o mercado indicou uma média de 5.2%, e esses contratos terminaram dentro do dinheiro em 3.7% dos casos. No grupo mais alto, um valor declarado de 94% veio acompanhado de 96.5% de contratos terminando dentro do dinheiro. Nos 10 grupos, a frequência observada fica na mesma faixa do valor declarado. Essa é a função de uma tabela de calibração: mostrar, grupo a grupo, a diferença entre o que o previsor indica e o que acontece, em vez de ocultá-la em uma única média.

O mercado supera o cara ou coroa?

Agora, a pontuação em si. A construção é a mesma: vários nomes conhecidos, com a pontuação de Brier de cada um ao lado da linha de base fixa de 50%, calculada sobre exatamente os mesmos contratos.

QueryScore de Brier da probabilidade declarada pelo próprio mercado, por ativo subjacente
O SQL exato por trás de cada número
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

NVDA marcou 0.1122 em 28.54 thousand contratos avaliados, contra 0.25 da linha de base fixa no mesmo conjunto. O pior desempenho entre os 6 nomes, SPY, ainda ficou em 0.1375. As opções não são mágicas neste caso. Contratos muito fora do dinheiro têm deltas próximos de 0,02 e na maioria expiram sem valor. Acertar essa previsão é fácil, e essa facilidade está incorporada no número. Essa é a principal razão pela qual uma pontuação de Brier apresentada isoladamente diz muito pouco.

O mesmo previsor tem pontuações diferentes em perguntas diferentes

Aplique o mesmo método separando as perguntas pelo prazo até a resolução. A pontuação varia conforme esse prazo.

QueryScore de Brier do mercado por horizonte de vencimento, SPY
O SQL exato por trás de cada número
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

O delta do mercado marcou 0.1084 nos contratos com 1 to 7 days até o vencimento e 0.1218 nos contratos com 121 to 250 days até o vencimento. É o mesmo previsor, com o mesmo método, mas em dois conjuntos diferentes de perguntas. A referência fixa de 50% está em 0.25 na primeira linha e em 0.25 na última. Por isso, ela é a única referência constante em todos os horizontes. Qualquer comparação entre dois previsores precisa usar as mesmas perguntas no mesmo intervalo. Caso contrário, a comparação mede a dificuldade das perguntas, e não a capacidade do previsor.

Por que as regras de pontuação próprias importam

O erro absoluto médio, que mede a distância absoluta média entre a sua probabilidade e o resultado, parece uma alternativa razoável, mas avalia mal as previsões. Suponha que você realmente acredite que a probabilidade de um evento seja de 70%. Atribua 70% e o erro absoluto esperado será de 0.7 x 0.3 + 0.3 x 0.7 = 0.42. Atribua 100% e ele cai para 0.7 x 0 + 0.3 x 1 = 0.30. Pelo erro absoluto, o número honesto prejudica você. Uma métrica que recompensa o excesso de confiança não está medindo a qualidade da previsão.

O Brier score não tem essa distorção. Acredite em 70% e atribua 70%; a pontuação esperada será de 0.7 x 0.09 + 0.3 x 0.49 = 0.21. Atribua 100% e ela sobe para 0.30. Atribua 60% e ela sobe para 0.22. O mínimo ocorre exatamente na probabilidade em que você acredita. Uma regra com essa propriedade é chamada de própria. Essa é a razão pela qual o Brier score se tornou o padrão em torneios de previsão.

O log score é a outra regra própria comum. Calcule o logaritmo natural da probabilidade atribuída ao resultado que ocorreu e depois inverta o sinal. Atribuir 1% a algo que ocorre custa 4.6. Atribuir 0% custa infinito. No exemplo fictício de dez previsões, o log score chega a 0.483, contra 0.693 para o baseline constante. O Brier score fica entre 0 e 1, o que funciona de forma mais intuitiva como um scorecard. O log score não tem limite superior. Isso é adequado para avaliações em que os eventos extremos concentram o risco.

O que isso significa para contratos de eventos

Um contrato de eventos que paga US$ 1 se algo acontecer e US$ 0 caso contrário é negociado a um preço que já expressa uma probabilidade. Sessenta e dois centavos correspondem a uma previsão de 62%, antes da dedução do spread e das taxas. O nosso guia sobre preços de contratos de eventos como probabilidades explica essa conversão, enquanto como os contratos de eventos são liquidados explica o que significa “isso aconteceu” nos termos do próprio contrato.

Esse preço é uma previsão com histórico público e data de liquidação. Por isso, é o benchmark que o seu próprio registo precisa superar. Avalie as suas previsões com base nas mesmas perguntas e no mesmo período. Um trader cujo Brier score fique acima do valor implícito no preço não demonstrou vantagem nesse conjunto de perguntas, por melhor que seja a narrativa associada à operação. O mesmo teste pode ser aplicado às odds esportivas depois de remover o vig das odds de apostas, e aos mercados de juros, nos quais as odds de juros do Fed fornecem uma probabilidade datada para uma pergunta com dia de resolução conhecido.

Como estes painéis avaliam o mercado

O Delta vem do registo diário dos greeks de opções de cada contrato. Só entram na amostra contratos com volume no dia de observação e uma solução de volatilidade convergente. O resultado é determinado pelo fechamento do ativo subjacente na data de vencimento do contrato: uma call é considerada in the money quando esse fechamento fica acima do strike; uma put, quando fica abaixo. A liquidação efetiva ocorre após o fechamento, por meio de uma decisão de exercício. Por isso, contratos cujo preço fica a poucos centavos do strike podem ser liquidados de forma diferente desta simplificação. Todos os contratos destes painéis já venceram. Os intervalos de prazo mais longo necessariamente usam datas de observação anteriores dentro da janela. Um desdobramento de ações entre a data de observação e o vencimento colocaria o strike e o preço de liquidação em escalas diferentes. Esse é mais um motivo para cada intervalo apresentar o tamanho da amostra.

O Delta aproxima uma probabilidade neutra ao risco, não uma probabilidade do mundo real. As duas diferem pelo prémio de risco embutido nos preços das opções. Uma tabela de calibração é o instrumento que mede essa diferença, em vez de presumir que ela não existe.

Perguntas frequentes

Um Brier score mais baixo é melhor?

Sim. O Brier score mede erros. Portanto, 0 representa um histórico perfeito e 1, o pior resultado possível. Esse resultado ocorre quando se atribui 100% de probabilidade a todos os eventos que não aconteceram. Qualquer valor abaixo de 0,25 supera o resultado obtido ao responder 50% a todas as perguntas.

O que é um bom Brier score?

Não existe um valor universalmente bom, porque o score depende do grau de dificuldade das perguntas. Um meteorologista com score de 0,10 para a chuva de amanhã e um analista político com score de 0,18 em eleições disputadas não podem ser comparados diretamente. Compare os scores apenas entre analistas que responderam às mesmas perguntas durante o mesmo período.

O que significa um Brier score de 0,25?

É o score de um analista que responde 50% a tudo, pois cada erro ao quadrado será então 0,25, qualquer que seja o resultado. Esse é o benchmark padrão sem informação para um conjunto de perguntas com respostas sim ou não. Um conjunto de perguntas desequilibrado, porém, deve usar a taxa-base como benchmark.

Qual é a diferença entre o Brier score e o log score?

Ambos são regras de pontuação próprias. Isso significa que cada uma é minimizada quando o analista declara a probabilidade em que realmente acredita. O Brier scoreva ao quadrado o erro e fica entre 0 e 1. O log score penaliza muito mais os erros cometidos com alta convicção. Declarar 0% para um evento que ocorre gera um custo infinito.

O delta de uma opção pode ser interpretado como uma probabilidade?

O valor absoluto do delta fica próximo da probabilidade implícita no mercado de que a opção termine in the money. Trata-se de uma probabilidade neutra ao risco, e não de uma probabilidade do mundo real. Os painéis acima avaliam o delta como uma previsão: o delta declarado aparece em um eixo, e a parcela dos contratos que de fato terminou in the money aparece no outro.


Cada painel inclui o SQL exato logo abaixo. Assim, a avaliação pode ser auditada linha a linha. Para comparar seu próprio registro de previsões com o do mercado nas mesmas perguntas, solicite os números em inglês simples no terminal da Strasmore.

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