31 серпня 2026 · ринки прогнозів

Що ламається під час бектесту ринків прогнозів: щоденник за 8 днів

Що ламається під час бектесту ринків прогнозів: щоденник за 8 днів

На перший погляд, ринки прогнозів — найлегше у світі для бектестування. Ціна перебуває в діапазоні [0, 1]. Виплата — долар або нічого. Немає кредитного плеча, фандингу, базису чи дивних особливостей безстрокових свопів о 00:00 UTC. У нас уже був бектестер, який працював із криптовалютними безстроковими контрактами, комісіями, фандингом і впливом на ціну. План був такий: витратити два дні на адаптацію, а тоді почати генерувати стратегії.

На це пішло 8 днів. Ось журнал подій, приблизно в хронологічному порядку, разом із днем, коли крива капіталу виглядала неймовірно — і справді була такою.

День 1: адаптер, який мав бути тривіальним

Початкове зіставлення було один до одного й здавалося простим. Ринок — це інструмент. Ціна YES — це ціна. Купівля YES — довга позиція, купівля NO — коротка. Під час визначення результату позиція примусово закривається за 1.00 або 0.00. Завантажуємо погодинний ряд цін у той самий цикл подій — готово.

Це зіставлення витримало приблизно 90 хвилин роботи з реальними даними. Першим зламався ряд дохідності. Увесь наш модуль ризиків — розмір позицій, таргетування волатильності, звіти про Sharpe — спирався на логарифмічну дохідність безстрокового інструмента. Для ринку, що падає з 0.04 до 0.00, логарифмічна дохідність не визначена, а збиток цілком реальний. І ринок за ціною 0.04 за 3 дні до визначення результату — це зовсім інший об’єкт, ніж ринок за ціною 0.04 за 4 хвилини до нього, хоча в обох рядках написано 0.04.

Зрештою ми перебудували весь ряд навколо часу до визначення результату, а не календарного часу, і почали враховувати PnL як підсумковий результат, а не поточну оцінку. Це було правильне рішення, але через нього довелося переробити весь код звітності, який від нього залежав.

День 2: формула комісії і є стратегією

На Kalshi торговельна комісія — це не знижка в базисних пунктах. Вона залежить від квадрата ціни: приблизно 0.07 × contracts × P × (1−P), із округленням вгору до цента на рівні заявки. Тобто найбільша комісія саме там, де ринок із шансом 50 на 50 найцікавіший, а на крайніх значеннях вона майже нульова.

ЦінаКомісія за контрактНеобхідна перевага (пункти ймовірності)Комісія як % від ставки
5¢0.33¢0.336.7%
10¢0.63¢0.636.3%
25¢1.31¢1.315.3%
50¢1.75¢1.753.5%
75¢1.31¢1.311.8%
90¢0.63¢0.630.7%
95¢0.33¢0.330.35%

Зверніть увагу на третій стовпець: щоб вийти в нуль, купивши за 50¢ і тримаючи контракт до визначення результату, ваша оцінка ймовірності має перевищувати ринкову на 1.75 пункту. Не на 1.75% відносно, а на 1.75 пункту. Якщо ви закриваєте позицію до визначення результату, а не тримаєте її, то сплачуєте цю комісію двічі, плюс спред.

3.5%комісія за одну сторону за ціни 50¢, як частка ставки
1.75ппперевага за ймовірністю для виходу в нуль за цієї ціни
1визначення результату на інструмент за весь час

Історично комісії CLOB Polymarket були зовсім іншими: ближчими до нуля за саму угоду, а основні витрати припадали на спред і глибину. Тож одна й та сама логіка стратегії має зовсім різну економіку залежно від платформи, і будь-яке порівняння платформ з однією моделлю комісій — вигадка. Тепер для кожної платформи ми задаємо окрему функцію комісії, а не одне число.

Якщо ви читаєте у звіті про бектест ринку прогнозів лише один рядок, нехай це буде комісія, виражена в пунктах ймовірності. Стратегія із заявленою перевагою прогнозу в 1.2 пункту на ринках за 50¢ програє на Kalshi ще до врахування будь-яких інших витрат. Це має бути видно вже на першій сторінці, а не вимагати розрахунків від читача.

День 3: стакан східчастий і неглибокий

Наша модель впливу на ціну була функцією квадратного кореня, відкаліброваною на стаканах безстрокових контрактів BTC. Форма тут неправильна. За кроку ціни 1¢ для інструмента вартістю $1 у всьому стакані лише 99 можливих цінових рівнів, а на ринку із середньою ліквідністю на верхньому рівні може стояти кілька сотень контрактів, а далі — розрив.

Ось знімок стакана ринку економічних даних, який ми відстежували, сторона YES, приблизно за 30 годин до визначення результату:

РівеньОбсяг (контракти)Сукупна вартість купівлі
42¢310310 за середньою ціною 42.0¢
43¢85395 за середньою ціною 42.2¢
45¢140535 за середньою ціною 42.9¢
49¢6001,135 за середньою ціною 46.1¢

Заявка на 1,000 контрактів — ризик у $500, дрібниця в крипті — змінює ефективну ціну на 4 центи. Це більше ніж удвічі перевищує комісію. Тут немає плавної функції, яку можна підібрати: треба проходити рівень за рівнем або вигадувати результат. Ми прибрали модель sqrt для цього класу активів і написали буквальний алгоритм проходження стакана. Він повільніший, зате правильний.

У якийсь момент я спіймав себе на роздратуванні, що ці ринки «надто малі, щоб мати значення». Вони малі, бо ціна стосується одного реального запитання з дедлайном, а людей, які мають думку про первинні заявки на допомогу з безробіття у США в середу, не так уже й багато. Розмір і є суттю ринку. Скаржитися на нього — це як нарікати, що за покерним столом лише 9 місць.

День 4: день, коли крива капіталу була прекрасною

Sharpe 4.1 на 1,400 ринках. Плавна крива. У кожного дослідника від такого має стискатися шлунок — у мене теж стиснувся, щоправда, аж через 40 хвилин після того, як я вже зробив знімок екрана.

Помилка була в модулі ресемплінгу. Для ринків із низькою ліквідністю історія цін надходить із нерегулярними часовими мітками, тож ми привели індекс до рівномірної погодинної сітки. Остання точка кожного архівного ряду — це ціна розрахунку: 1.00 або 0.00. Під час переіндексації ми заповнювали пропуски значенням найближчого сусіда, не обмежуючи напрямок. Тож для ринків, де остання угода відбулася за кілька годин до визначення результату, ціна розрахунку поширювалася назад через увесь проміжок. Модель бачила сьогодні в рядку відповідь на завтрашнє запитання — саме на ринках із низькою ліквідністю, де можна було наростити позицію, не впираючись в обмеження глибини стакана.

Заповнювати пропуски значенням найближчого сусіда — нормально для безперервного інструмента. Але для інструмента, де останнє спостереження є фактичною відповіддю, це механізм підглядання в майбутнє. Тепер ми перевіряємо, що заповнення завжди відбувається лише вперед, а рядок із ціною розрахунку позначений і виключений з обчислення ознак. Ця перевірка займає 9 рядків і це найцінніший код, який ми написали за весь тиждень.

Дні 5–6: 1,412 ринків, приблизно 180 ставок

Розмір вибірки на ринках прогнозів — пастка з привітним обличчям. Ви дочекалися визначення результатів на 1,412 ринках, вважаєте, що маєте 1,412 спостережень, і відповідно обчислюєте t-статистику. Але 14 матчів NFL в одну неділю залежать від однієї погодної системи, одного випуску звіту про травми й спільного потоку ставок. 51 ринок виборів на рівні штатів залежать від одного загальнонаціонального зсуву. Запитання «Чи станеться X до 31 березня?» і «Чи станеться X до 30 червня?» — це та сама ставка з різними строками дії, і результати за ними визначаються одночасно.

Ми згрупували ринки за джерелом базової події та датою визначення результату й отримали приблизно 180 ефективно незалежних спостережень. Цього недостатньо, щоб відрізнити реальну перевагу від шуму за величин ефекту, які ми розглядали. І жоден бутстрепінг окремих ринків цього не виправить, бо повторно вибирати потрібно групи, а не рядки. Якщо це зробити неправильно, статистична значущість тихо завищується в 2–3 рази.

День 7: визначення результату — теж імовірнісний процес

Про те, чого ми взагалі не врахували й дізналися на власному досвіді:

Ми додали до симулятора витрати на утримання позиції та випадкове відхилення дати визначення результату. Жоден із цих параметрів не точний. Але обидва кращі за неявне припущення, що результат напевно визначатиметься саме у вказану дату.

День 8: що варто пропустити й із чого почати

  1. Одразу відкиньте всю основу, що спирається на дохідність. Не пристосовуйте модуль керування ризиком із таргетуванням волатильності до інструмента з підсумковою виплатою. Напишіть модуль розміру ставки, що оперує ймовірністю та сумою ставки. Ми втратили 2 дні, намагаючись пристосувати старий модуль.
  2. Спершу побудуйте функцію комісії, а потім стратегію. Побудуйте криву переваги для виходу в нуль для кожної платформи, на якій плануєте торгувати, і повісьте її над робочим столом. Вона відсіює приблизно половину ідей ще до того, як вони вартуватимуть запуску бектесту.
  3. Проходьте стакан від самого початку. Будь-яка параметрична модель впливу на ціну, перенесена з безперервного ринку, помилятиметься так, що це прикрашатиме ваші результати.
  4. Спершу кластеризуйте, потім рахуйте. Визначте ключ кластеризації для ефективного розміру вибірки одночасно з вибором набору ринків, а не після того, як отримаєте прийнятний для себе Sharpe.
  5. Перевіряйте напрямок заповнення. Один рядок перевірки для кожного об’єднання. Якщо ряд завершується фактичною відповіддю, вважайте заповнення назад помилкою за визначенням, а не чимось, що ви помітите під час перевірки.

Ці 8 днів були варті витраченого часу, головно тому, що ринки прогнозів прибирають неоднозначність, через яку так легко обманути себе під час бектестування криптовалют. Немає ставки фандингу, яку можна відмахнутися, немає суперечок про методику визначення ціни марки. Є лише запитання, дедлайн і відповідь. Коли бектест тут помиляється, можна точно вказати, у чому саме.

ринки прогнозівбектестуваннякомісіїмікроструктура ринкуінженерія даних
ПоділитисяXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← Усі статті