Оцінка Brier: як оцінити прогноз
Оцінка Brier вимірює ймовірнісні прогнози як середню квадратичну помилку щодо фактичного результату. Що нижче значення, то краще: 0,25 дає сталий прогноз 50%.
Оцінка Brier порівнює ймовірнісний прогноз із фактичним результатом. Від зазначеної вами ймовірності відніміть результат (1, якщо подія відбулася, і 0, якщо ні), піднесіть різницю до квадрата, а потім усередніть отримані квадрати за всіма зробленими прогнозами. Що нижче значення, то краще: 0 — ідеальний результат, а 0,25 — оцінка, яку ви отримаєте, якщо щоразу казатимете «50%».
Що таке оцінка Brier?
Прогноз — це твердження про ймовірність. Окремо взята ймовірність не може бути правильною або неправильною. Ви оцінили ймовірність події у 30%, і вона сталася. Ви помилилися? Поки що ні. Гленн Брієр у 1950 році, працюючи над прогнозами погоди, вирішив цю проблему, відмовившись оцінювати окремий прогноз. Оцінка охоплює весь журнал прогнозів.
Нижче наведено умовний журнал із десяти прогнозів. Жодне з цих чисел не взято з ринку. Їх вигадано, щоб показати розрахунок.
- Зазначено 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.
Сума десяти квадратів помилки дорівнює 1.6525. Поділіть її на десять — і оцінка Brier становитиме 0.165. Це весь розрахунок. Його можна виконати в python3, який уже встановлено на будь-якому комп’ютері Mac або Linux. Нічого не потрібно встановлювати, зокрема бібліотеки.
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))угоди0.165 0.25
Чому 0,25 — це орієнтир для порівняння
Якщо щоразу вказувати ймовірність 50% для будь-якої події, кожна помилка у квадраті дорівнюватиме 0,25 — незалежно від результату. Це фіксований орієнтир без інформації для будь-якого набору запитань із відповідями «так» або «ні». Показник майстерності зводить результат до одного числа: одиниця мінус ваш бал, поділений на бал орієнтира. Для вигаданого журналу з балом 0,165 показник майстерності становить 0,34.
Є один нюанс, який допомагає уникати багатьох помилок в оцінюванні. Якщо події, які ви оцінюєте, відбуваються лише у 10% випадків, постійне зазначення ймовірності 10% дає бал 0,09, навіть якщо ви нічого не знаєте про окремі запитання. Бал нижче 0,25 не свідчить про майстерність, якщо набір запитань має нерівномірний розподіл результатів. Коректним орієнтиром є базова частота подій у тих запитаннях, на які ви фактично відповіли.
Калібрування та впевненість оцінюються разом
Калібрування означає, що з усіх подій, яким ви надали ймовірність 70%, відбувається приблизно 70%. Впевненість, яку статистики називають роздільною здатністю, показує, наскільки ви готові відхилитися від базової частоти, коли маєте додаткову інформацію. Прогнозист, який на кожне запитання відповідає «50%», ідеально калібрований, але повністю марний. Показник Brier одночасно враховує обидві властивості: помилки калібрування підвищують його значення, а обґрунтована впевненість його знижує.
Розподіл вигаданого журналу за заявленою ймовірністю показує, як виглядає перевірка калібрування. У Python це один рядок на кожен діапазон, hits = [o for p, o in rows if p >= 0.8], а потім середнє значення hits.
- Заявлена ймовірність від 10% до 30%, середнє значення 20%: подія відбулася в 1 випадку з 3, тобто у 33%.
- Заявлена ймовірність від 40% до 50%, середнє значення 45%: подія не відбулася в жодному з 2 випадків, тобто 0%.
- Заявлена ймовірність від 60% до 70%, середнє значення 65%: подія відбулася в 1 випадку з 2, тобто у 50%.
- Заявлена ймовірність від 80% до 95%, середнє значення 88%: подія відбулася у 3 випадках із 3, тобто у 100%.
Десяти прогнозів недостатньо, щоб робити висновки за цими діапазонами. Для перевірки калібрування потрібні сотні прогнозів із відомим результатом у кожному діапазоні. Далі на цій сторінці використовується журнал прогнозів із мільйонами таких записів.
Оцінювання власного прогнозу ринку
Кожен біржовий опціон має показник, що поводиться як заявлена ймовірність. Delta вимірює, наскільки змінюється ціна опціону за руху базової акції на один долар. Для контракту, який або завершується in the money (має вартість на дату експірації), або стає нічого не вартим, абсолютне значення delta близьке до ринкової імплайд-ймовірності завершення in the money. Воно розраховується з тієї самої поверхні, яка визначає імплайд-волатильність AAPL. Кожен контракт має дату експірації, тому кожен із цих прогнозів можна перевірити.
На графіку нижче наведено всі опціони SPY, зафіксовані приблизно за місяць до експірації, у період із січня 2025 року до травня 2026 року. Їх розподілено за заявленою delta та підраховано, як часто контракти завершувалися in the money.
Точний 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Порівнюйте ці два ряди даних. У найнижчому діапазоні ринок заявляв у середньому 5.2%, а ці контракти завершувалися in the money у 3.7% випадків. У найвищому діапазоні заявленому показнику 94% відповідала фактична частота завершення in the money на рівні 96.5%. У всіх 10 діапазонах реалізована частота перебуває приблизно на тому самому рівні, що й заявлена. Саме для цього потрібна таблиця калібрування: вона показує розрив між прогнозом і фактичним результатом у кожному діапазоні, а не приховує його в одному середньому значенні.
Чи перевершує ринок підкидання монети?
Тепер — сам показник. Та сама методика, кілька відомих компаній, а Brier score кожної розміщено поруч із незмінним базовим рівнем 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Показники NVDA становлять 0.1122 за 28.54 thousand контрактами з визначеним результатом проти 0.25 незмінного базового рівня на тому самому наборі. Найслабший із 6 назв, SPY, усе одно показує 0.1375. Тут опціони не є магією. Глибоко out-of-the-money контракти мають delta близько 0.02 і здебільшого завершуються без вартості. Це простий для правильного прогнозування результат, і ця простота врахована в показнику. Саме тому Brier score без порівняння майже нічого не говорить.
Один і той самий прогнозист має різні оцінки для різних запитань
Однаковий метод потрібно розглядати окремо залежно від того, через який строк запитання отримує остаточну відповідь: його оцінка за такого підходу змінюється.
Точний 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Показник ринку становив 0.1084 для контрактів, до завершення яких залишалося 1 to 7 days, і 0.1218 для контрактів, до завершення яких залишалося 121 to 250 days. Той самий прогнозист, той самий метод, але два різні набори запитань. Фіксований базовий рівень у 50% становить 0.25 у першому рядку та 0.25 в останньому, тому він є єдиною незмінною точкою відліку для всіх горизонтів. Порівнювати двох прогнозистів можна лише за однаковими запитаннями та за однаковий період. Інакше порівнюється складність запитань, а не майстерність.
Чому важливі коректні scoring rules
Mean absolute error — середнє абсолютне відхилення між вашою ймовірністю та результатом — здається розумною альтернативою, але оцінює прогнози некоректно. Припустімо, ви справді вважаєте, що ймовірність події становить 70%. Якщо вказати 70%, очікувана абсолютна помилка дорівнює 0.7 x 0.3 + 0.3 x 0.7 = 0.42. Якщо натомість вказати 100%, вона зменшується до 0.7 x 0 + 0.3 x 1 = 0.30. За абсолютної помилки чесна оцінка погіршує результат. Метрика, яка винагороджує завищену впевненість, не вимірює якість прогнозування.
У Brier score такого недоліку немає. Якщо ви вважаєте ймовірність події рівною 70% і вказуєте 70%, очікуване значення score становить 0.7 x 0.09 + 0.3 x 0.49 = 0.21. Якщо вказати 100%, показник зростає до 0.30. Якщо вказати 60%, він зростає до 0.22. Мінімальне значення точно відповідає вашій оціненій імовірності. Правило з такою властивістю називається proper. Саме тому Brier score став стандартом у forecasting tournaments.
Log score — інше поширене proper rule. Спочатку потрібно взяти натуральний логарифм імовірності, яку ви присвоїли результату, що відбувся, а потім змінити знак на протилежний. Якщо подія відбулася, а ви вказали для неї ймовірність 1%, це коштує 4.6, а значення 0% дає нескінченність. Для умовного прогнозу з десяти подій log score становить 0.483 проти 0.693 для незмінного базового прогнозу. Brier score перебуває в діапазоні від 0 до 1, тому його зручніше сприймати як показник у scorecard. Log score не має верхньої межі, що відповідає оцінюванню, де основний ризик припадає на крайні значення.
Що це означає для event contracts
Event contract, який виплачує $1, якщо подія відбувається, і $0, якщо ні, торгується за ціною, що вже відображає ймовірність. Шістдесят два центи — це прогноз із імовірністю 62% до вирахування bid-ask spread і комісій. У нашому поясненні, як ціни event contracts перетворюються на ймовірності описано цю конвертацію, а матеріал про те, як здійснюється розрахунок за event contracts пояснює, що саме означає «подія відбулася» за умовами конкретного контракту.
Ця ціна є прогнозом із публічною історією результатів і визначеною датою розрахунку. Саме її має перевершити ваш власний журнал прогнозів. Оцінюйте прогнози за однаковими питаннями та за однаковий період. Якщо Brier score трейдера виявляється вищим за Brier score, що відповідає ціні, вимірюваної переваги на цьому наборі питань немає, незалежно від якості обґрунтування угоди. Такий самий тест можна застосувати до спортивних коефіцієнтів після того, як ви вилучите vig зі ставок, а також до ринків процентних ставок, де котирування щодо ставки ФРС дають датовану ймовірність для питання з відомою датою розрахунку.
Як ці панелі оцінюють ринок
Delta розраховується на основі щоденного запису опціонних greeks для кожного контракту. До вибірки включаються лише контракти, за якими в день спостереження був обсяг торгів і для яких було отримано збіжне рішення щодо волатильності. Результат визначається за ціною закриття базового активу в дату експірації контракту: call вважається in the money, якщо ціна закриття перевищує strike, а put — якщо вона нижча за strike. Фактичний розрахунок відбувається після закриття через рішення про виконання, тому контракти, ціна яких опинилася за кілька центів від strike, можуть бути розраховані інакше, ніж передбачає це спрощення. Усі контракти в цих панелях уже експірували, а довші горизонти обов’язково охоплюють більш ранні дати спостереження в межах періоду. Якщо між датою спостереження та експірацією відбувається split акцій, strike і ціна розрахунку опиняються в різних масштабах. Це ще одна причина, чому для кожного сегмента вказується розмір вибірки.
Delta є наближенням до risk-neutral probability, а не до ймовірності в реальному світі. Ці показники відрізняються на величину risk premium, закладеної в ціни опціонів. Calibration table дає змогу виміряти цю різницю, а не припускати, що її немає.
Поширені запитання
Чи кращий нижчий Brier score?
Так. Brier score вимірює похибку, тому 0 означає ідеальний результат, а 1 — найгірший можливий результат, якого можна досягти, вказавши 100% для подій, що не відбулися. Будь-яке значення нижче 0,25 перевищує результат, який ви отримали б, вказуючи 50% для кожного запитання.
Який Brier score вважається хорошим?
Універсального хорошого значення не існує, оскільки score залежить від складності запитань. Метеоролога з показником 0,10 для прогнозу дощу завтра та політичного прогнозиста з показником 0,18 для напружених виборів не можна порівнювати між собою. Порівнюйте score лише для прогнозистів, які відповідали на ті самі запитання протягом того самого періоду.
Що означає Brier score 0,25?
Це score прогнозиста, який вказує 50% для кожного запитання, оскільки тоді квадрат кожної похибки дорівнює 0,25 незалежно від результату. Це стандартний орієнтир без інформації для набору запитань із відповідями «так» або «ні». Водночас для набору запитань із нерівномірним розподілом результатів орієнтиром має бути базова частота подій.
Чим Brier score відрізняється від log score?
Обидва є proper scoring rules. Це означає, що мінімальне значення кожного з них досягається тоді, коли ви вказуєте ймовірність, у яку насправді вірите. Brier зводить похибку в квадрат і перебуває в діапазоні від 0 до 1. Log score значно сильніше штрафує надто впевнені помилкові прогнози, а вказівка 0% для події, яка відбулася, дає нескінченний штраф.
Чи можна трактувати delta опціону як імовірність?
Абсолютне значення delta близьке до implied probability, яку ринок оцінює для завершення опціону in the money. Це risk-neutral probability, а не ймовірність у реальному світі. На наведених вище панелях delta оцінюється як прогноз: на одній осі показано вказану delta, а на іншій — частку цих контрактів, які фактично завершилися in the money.
Під кожною панеллю наведено точний SQL-запит, тому оцінювання можна перевірити на кожному рядку. Щоб порівняти власний журнал прогнозів із ринковим журналом за тими самими запитаннями, попросіть вивести цифри звичайною англійською мовою на терміналі Strasmore.