На перший погляд, ринки прогнозів — найлегше у світі для бектестування. Ціна перебуває в діапазоні [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.33 | 6.7% |
| 10¢ | 0.63¢ | 0.63 | 6.3% |
| 25¢ | 1.31¢ | 1.31 | 5.3% |
| 50¢ | 1.75¢ | 1.75 | 3.5% |
| 75¢ | 1.31¢ | 1.31 | 1.8% |
| 90¢ | 0.63¢ | 0.63 | 0.7% |
| 95¢ | 0.33¢ | 0.33 | 0.35% |
Зверніть увагу на третій стовпець: щоб вийти в нуль, купивши за 50¢ і тримаючи контракт до визначення результату, ваша оцінка ймовірності має перевищувати ринкову на 1.75 пункту. Не на 1.75% відносно, а на 1.75 пункту. Якщо ви закриваєте позицію до визначення результату, а не тримаєте її, то сплачуєте цю комісію двічі, плюс спред.
Історично комісії CLOB Polymarket були зовсім іншими: ближчими до нуля за саму угоду, а основні витрати припадали на спред і глибину. Тож одна й та сама логіка стратегії має зовсім різну економіку залежно від платформи, і будь-яке порівняння платформ з однією моделлю комісій — вигадка. Тепер для кожної платформи ми задаємо окрему функцію комісії, а не одне число.
Якщо ви читаєте у звіті про бектест ринку прогнозів лише один рядок, нехай це буде комісія, виражена в пунктах ймовірності. Стратегія із заявленою перевагою прогнозу в 1.2 пункту на ринках за 50¢ програє на Kalshi ще до врахування будь-яких інших витрат. Це має бути видно вже на першій сторінці, а не вимагати розрахунків від читача.
День 3: стакан східчастий і неглибокий
Наша модель впливу на ціну була функцією квадратного кореня, відкаліброваною на стаканах безстрокових контрактів BTC. Форма тут неправильна. За кроку ціни 1¢ для інструмента вартістю $1 у всьому стакані лише 99 можливих цінових рівнів, а на ринку із середньою ліквідністю на верхньому рівні може стояти кілька сотень контрактів, а далі — розрив.
Ось знімок стакана ринку економічних даних, який ми відстежували, сторона YES, приблизно за 30 годин до визначення результату:
| Рівень | Обсяг (контракти) | Сукупна вартість купівлі |
|---|---|---|
| 42¢ | 310 | 310 за середньою ціною 42.0¢ |
| 43¢ | 85 | 395 за середньою ціною 42.2¢ |
| 45¢ | 140 | 535 за середньою ціною 42.9¢ |
| 49¢ | 600 | 1,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: визначення результату — теж імовірнісний процес
Про те, чого ми взагалі не врахували й дізналися на власному досвіді:
- Дострокове визначення результату. Ринок із формулюванням «до 31 грудня» може закритися вже 4 серпня, якщо подія справді відбудеться того дня. Капітал повертається раніше, а фактичний період утримання позиції зовсім не відповідає тому, що обіцяла назва контракту.
- Оскарження. Ринки, де результат визначає оракул, мають період для оскарження. Позиція може залишатися невизначеною ще кілька днів після події, а в окремих випадках результат змінюється всупереч очевидному трактуванню.
- Скасування. Через неоднозначні дані першоджерела ринок скасовують, а всім повертають кошти. У нашій вибірці таких ринків менше 1%, але саме вони зосереджені серед неоднозначних запитань, на яких модель знаходить хибно оцінені ціни.
- Замороження капіталу. Перевага в 3 пункти, реалізована за 90 днів, і перевага в 3 пункти, реалізована за 6 годин, — непорівнювані речі. Бектестер, який звітує про загальну перевагу без урахування часу, протягом якого був задіяний капітал, завжди віддаватиме перевагу повільному варіанту.
Ми додали до симулятора витрати на утримання позиції та випадкове відхилення дати визначення результату. Жоден із цих параметрів не точний. Але обидва кращі за неявне припущення, що результат напевно визначатиметься саме у вказану дату.
День 8: що варто пропустити й із чого почати
- Одразу відкиньте всю основу, що спирається на дохідність. Не пристосовуйте модуль керування ризиком із таргетуванням волатильності до інструмента з підсумковою виплатою. Напишіть модуль розміру ставки, що оперує ймовірністю та сумою ставки. Ми втратили 2 дні, намагаючись пристосувати старий модуль.
- Спершу побудуйте функцію комісії, а потім стратегію. Побудуйте криву переваги для виходу в нуль для кожної платформи, на якій плануєте торгувати, і повісьте її над робочим столом. Вона відсіює приблизно половину ідей ще до того, як вони вартуватимуть запуску бектесту.
- Проходьте стакан від самого початку. Будь-яка параметрична модель впливу на ціну, перенесена з безперервного ринку, помилятиметься так, що це прикрашатиме ваші результати.
- Спершу кластеризуйте, потім рахуйте. Визначте ключ кластеризації для ефективного розміру вибірки одночасно з вибором набору ринків, а не після того, як отримаєте прийнятний для себе Sharpe.
- Перевіряйте напрямок заповнення. Один рядок перевірки для кожного об’єднання. Якщо ряд завершується фактичною відповіддю, вважайте заповнення назад помилкою за визначенням, а не чимось, що ви помітите під час перевірки.
Ці 8 днів були варті витраченого часу, головно тому, що ринки прогнозів прибирають неоднозначність, через яку так легко обманути себе під час бектестування криптовалют. Немає ставки фандингу, яку можна відмахнутися, немає суперечок про методику визначення ціни марки. Є лише запитання, дедлайн і відповідь. Коли бектест тут помиляється, можна точно вказати, у чому саме.
← Усі статті


