Brier score: cómo evaluar un pronóstico
El Brier score mide pronósticos probabilísticos como error cuadrático medio frente a lo ocurrido. Menor es mejor: decir siempre 50 % da 0.25.
El Brier score evalúa un pronóstico probabilístico frente a lo que ocurrió. Toma la probabilidad indicada, réstale el resultado (1 si el evento ocurrió, 0 si no ocurrió), eleva esa diferencia al cuadrado y luego calcula el promedio de los cuadrados para todos los pronósticos realizados. Cuanto menor sea el resultado, mejor: 0 representa un historial perfecto y 0.25 es la puntuación que se obtiene al decir «50 %» sobre todo.
¿Qué es el Brier score?
Un pronóstico es una afirmación sobre una probabilidad, y una probabilidad por sí sola nunca puede ser correcta o incorrecta. Usted estimó que algo tenía una probabilidad del 30% y ocurrió. ¿Se equivocó? Todavía no. Glenn Brier, quien escribió para pronosticadores meteorológicos en 1950, resolvió el problema al negarse a evaluar un pronóstico aislado. El score evalúa todo el registro de una vez.
Este es un registro ficticio de diez pronósticos. Ninguna de estas cifras proviene de un mercado. Se inventaron para mostrar el cálculo.
- Se indicó 90% y el evento ocurrió. Error al cuadrado: 0.01.
- Se indicó 80% y ocurrió. 0.04.
- Se indicó 70% y no ocurrió. 0.49.
- Se indicó 60% y ocurrió. 0.16.
- Se indicó 50% y no ocurrió. 0.25.
- Se indicó 40% y no ocurrió. 0.16.
- Se indicó 30% y ocurrió. 0.49.
- Se indicó 20% y no ocurrió. 0.04.
- Se indicó 10% y no ocurrió. 0.01.
- Se indicó 95% y ocurrió. 0.0025.
Los diez errores al cuadrado suman 1.6525. Al dividir entre diez, el Brier score es 0.165. Ese es todo el cálculo, y puede ejecutarse en python3, que ya viene incluido en cualquier equipo Mac o Linux. No hay que instalar nada ni usar librerías.
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))prints0.165 0.25
Por qué 0.25 es la cifra que hay que superar
Asigne 50% a cada resultado y cada error cuadrático será 0.25, sin importar lo que ocurra. Ese 0.25 fijo es la referencia sin información para cualquier conjunto de preguntas de sí o no. El skill score lo convierte en una sola cifra: uno menos su puntuación dividida por la de la referencia. El registro hipotético con una puntuación de 0.165 equivale a un skill score de 0.34.
Una salvedad evita muchos errores al calcular puntuaciones. Si los eventos que está evaluando solo ocurren 10% de las veces, indicar siempre 10% da una puntuación de 0.09 sin aportar ningún conocimiento sobre las preguntas individuales. Una puntuación inferior a 0.25 no demuestra habilidad cuando el conjunto de preguntas está desequilibrado. La referencia correcta es la tasa base de las preguntas que realmente respondió.
La calibración y la confianza se evalúan juntas
La calibración significa que, de todo lo que asignaste una probabilidad del 70%, cerca del 70% ocurre. La confianza, que los estadísticos denominan resolución, mide cuánto estás dispuesto a alejarte de la tasa base cuando conoces cierta información. Un pronosticador que asigna 50% a todas las preguntas está perfectamente calibrado, pero es completamente inútil. El Brier score valora ambas propiedades al mismo tiempo: la mala calibración lo eleva y la confianza bien fundamentada lo reduce.
Agrupar el registro ficticio por probabilidad declarada muestra cómo funciona una comprobación de calibración. En Python, se usa una línea por grupo, hits = [o for p, o in rows if p >= 0.8], y después se calcula el promedio de hits.
- Probabilidad declarada de 10% a 30%, promedio de 20%: ocurrió 1 de 3 veces, 33%.
- Probabilidad declarada de 40% a 50%, promedio de 45%: no ocurrió ninguna de 2 veces, 0%.
- Probabilidad declarada de 60% a 70%, promedio de 65%: ocurrió 1 de 2 veces, 50%.
- Probabilidad declarada de 80% a 95%, promedio de 88%: ocurrió 3 de 3 veces, 100%.
Diez pronósticos están muy lejos de ser suficientes para extraer conclusiones de esos grupos. La calibración requiere cientos de preguntas resueltas por grupo. El resto de esta página utiliza un registro de pronósticos con millones de observaciones.
Evaluación del pronóstico del propio mercado
Cada opción listada incluye un número que se comporta como una probabilidad declarada. Delta mide cuánto cambia el precio de la opción ante un movimiento de un dólar en la acción subyacente. En un contrato que termina in the money —con algún valor al vencimiento— o sin valor, el valor absoluto de delta se aproxima a la probabilidad implícita de mercado de que termine in the money. Ese dato proviene de la misma superficie que determina la volatilidad implícita de AAPL. Todos los contratos vencen. Por eso, todos esos pronósticos pueden evaluarse.
El panel siguiente toma cada opción de SPY observada aproximadamente un mes antes del vencimiento, desde enero de 2025 hasta mayo de 2026. Las agrupa por delta declarada y cuenta con qué frecuencia el contrato terminó in the money.
El SQL exacto detrás de cada cifra
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 bucketCompare ambas series. En el bucket más bajo, el mercado indicó un promedio de 5.2% y esos contratos terminaron in the money 3.7% del tiempo. En el bucket más alto, una cifra declarada de 94% coincidió con un 96.5% de contratos que terminaron in the money. En los 10 buckets, la frecuencia observada se mantiene cerca de la cifra declarada. Esa es precisamente la función de una tabla de calibración: mostrar, bucket por bucket, la diferencia entre lo que afirma un pronosticador y lo que ocurre, en lugar de ocultarla dentro de un solo promedio.
¿El mercado supera el azar?
Ahora, el resultado en sí. La construcción es la misma para varios nombres conocidos. El Brier score de cada nombre aparece junto a la línea base plana de 50%, calculada sobre exactamente los mismos contratos.
El SQL exacto detrás de cada cifra
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 obtiene un score de 0.1122 en 28.54 thousand contratos evaluados, frente a 0.25 de la línea base plana sobre el mismo conjunto. Incluso el más débil de los 6 nombres, SPY, registra 0.1375. Aquí las opciones no tienen nada de mágico. Los contratos muy out of the money tienen deltas cercanas a 0.02 y en su mayoría vencen sin valor. Es una previsión fácil de acertar, y esa facilidad queda incorporada en la cifra. Es la principal razón por la que un Brier score citado por sí solo dice muy poco.
El mismo pronosticador obtiene resultados distintos según la pregunta
La misma metodología produce resultados diferentes según cuánto falte para que se resuelva la pregunta.
El SQL exacto detrás de cada cifra
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_rankEl delta del mercado obtuvo 0.1084 en contratos a los que les quedaban 1 to 7 days y 0.1218 en contratos a los que les quedaban 121 to 250 days. Es el mismo pronosticador y la misma metodología, pero se trata de dos conjuntos de preguntas diferentes. La referencia plana del 50% se sitúa en 0.25 en la primera fila y en 0.25 en la última. Por eso, es el único punto de referencia fijo para todos los horizontes. Toda comparación entre dos pronosticadores debe hacerse sobre las mismas preguntas y durante la misma ventana. De lo contrario, se compara la dificultad de las preguntas, no la habilidad.
Por qué importan las reglas de puntuación propias
El error absoluto medio, el promedio de la distancia simple entre tu probabilidad y el resultado, parece una alternativa razonable, pero funciona mal. Supón que realmente crees que un evento tiene una probabilidad del 70%. Si declaras 70%, tu error absoluto esperado es 0.7 x 0.3 + 0.3 x 0.7 = 0.42. Si declaras 100%, baja a 0.7 x 0 + 0.3 x 1 = 0.30. Con el error absoluto, decir la cifra honesta te perjudica. Una métrica que te recompensa por exagerar la confianza no está midiendo la calidad de los pronósticos.
El Brier score no tiene esa falla. Si crees que la probabilidad es del 70% y declaras 70%, tu puntuación esperada es 0.7 x 0.09 + 0.3 x 0.49 = 0.21. Si declaras 100%, sube a 0.30. Si declaras 60%, sube a 0.22. El mínimo se encuentra exactamente en la cifra que consideras correcta. Una regla con esa propiedad se denomina propia. Esa es la razón por la que el Brier score se convirtió en el estándar de los torneos de pronósticos.
El log score es la otra regla propia habitual. Consiste en tomar el logaritmo natural de la probabilidad que asignaste al resultado que ocurrió y cambiarle el signo. Declarar 1% para algo que ocurre cuesta 4.6. Declarar 0% cuesta infinito. En el conjunto ficticio de diez pronósticos, el log score es de 0.483, frente a 0.693 para la referencia plana. El Brier score se mantiene entre 0 y 1, lo que resulta más natural en una tabla de puntuaciones. El log score no tiene límite superior. Eso resulta adecuado cuando se evalúa un modelo en el que los extremos concentran el riesgo.
Qué significa esto para los contratos de eventos
Un contrato de eventos que paga $1 si ocurre algo y $0 si no ocurre cotiza a un precio que ya expresa una probabilidad. Sesenta y dos centavos representan un pronóstico del 62%, antes de descontar el spread y las comisiones. Nuestra guía sobre los precios de los contratos de eventos como probabilidades explica esa conversión, y cómo se liquidan los contratos de eventos explica qué significa «ocurrió» según el texto del propio contrato.
Ese precio es un pronóstico con un historial público y una fecha de liquidación. Por eso, es el benchmark que debe superar el registro de tus propios pronósticos. Evalúa tus pronósticos sobre las mismas preguntas y durante el mismo periodo. Si el Brier score de un trader es superior al del precio, no tiene una ventaja medida en ese conjunto de preguntas, por muy convincente que sea la narrativa asociada a la operación. La misma prueba puede aplicarse a las cuotas deportivas una vez que eliminas el vig de las cuotas de apuestas, y a los mercados de tasas, donde las probabilidades sobre las tasas de la Fed proporcionan una probabilidad fechada para una pregunta con un día de resolución conocido.
Cómo estos paneles evalúan al mercado
Delta proviene del registro diario de las griegas de opciones de cada contrato. Solo se incluyen los contratos con volumen en el día de observación y con una solución de volatilidad convergente. El resultado se determina a partir del cierre del subyacente en la fecha de vencimiento del contrato: una call se considera in the money cuando ese cierre está por encima del strike, y una put, cuando está por debajo. La liquidación real se realiza mediante una decisión de ejercicio después del cierre. Por ello, los contratos cuyo precio queda a pocos centavos del strike pueden liquidarse de forma distinta a esta simplificación. Todos los contratos de estos paneles ya vencieron, y las categorías de horizontes más largos necesariamente toman datos de fechas de observación anteriores dentro del periodo analizado. Una división de acciones entre la fecha de observación y el vencimiento haría que el strike y el precio de liquidación estuvieran expresados en escalas distintas. Es otra razón por la que cada categoría incluye el tamaño de su muestra.
Delta aproxima una probabilidad neutral al riesgo, no una probabilidad del mundo real. Ambas difieren por la prima de riesgo incorporada en los precios de las opciones. Una tabla de calibración mide esa diferencia en lugar de asumir que no existe.
Preguntas frecuentes
¿Es mejor un Brier score más bajo?
Sí. El Brier score mide errores. Cero representa un historial perfecto y uno es el peor resultado posible. Este último se obtiene al asignar 100% de probabilidad a todos los eventos que no ocurrieron. Cualquier resultado inferior a 0.25 supera el que se obtendría al responder 50% en todas las preguntas.
¿Qué es un buen Brier score?
No existe un valor universalmente bueno, porque el resultado depende de la dificultad de las preguntas. Un pronosticador meteorológico con un resultado de 0.10 para la lluvia de mañana y un pronosticador político con 0.18 en elecciones reñidas no pueden compararse entre sí. Compare los resultados únicamente entre pronosticadores que respondan las mismas preguntas durante el mismo periodo.
¿Qué significa un Brier score de 0.25?
Es el resultado de un pronosticador que responde 50% en todos los casos, porque cada error al cuadrado es entonces 0.25, sin importar cuál sea el resultado. Es el benchmark estándar sin información para un conjunto de preguntas de sí o no. Sin embargo, un conjunto de preguntas desequilibrado debe utilizar la tasa base como benchmark.
¿En qué se diferencia el Brier score del log score?
Ambos son reglas de puntuación propias. Esto significa que cada una alcanza su valor mínimo cuando se declara la probabilidad que realmente se considera válida. El Brier score eleva el error al cuadrado y se mantiene entre 0 y 1. El log score penaliza mucho más los errores con alta convicción. Asignar 0% a un evento que ocurre tiene un costo infinito.
¿Puede interpretarse el delta de una opción como una probabilidad?
El valor absoluto del delta se aproxima a la probabilidad implícita por el mercado de que la opción termine in the money. Se trata de una probabilidad neutral al riesgo, no de una probabilidad del mundo real. Los paneles anteriores lo evalúan como un pronóstico: el delta declarado aparece en un eje y la proporción de esos contratos que efectivamente terminaron in the money, en el otro.
Cada panel incluye el SQL exacto debajo. Por eso, la evaluación puede auditarse línea por línea. Para comparar su propio registro de pronósticos con el del mercado sobre las mismas preguntas, solicite las cifras en lenguaje sencillo en la terminal de Strasmore.