О 10:14 UTC проста стратегія на пробій купила криптовалютний безстроковий ф’ючерс після того, як ціна перетнула максимум за 20 хвилин. Бектест показав виконання за $64,210. Це число було в даних, сигнал мав правильну часову позначку, а змодельований ордер надійшов на наступному барі. Ми вже майже назвали результат бездоганним.
Тоді ми звірили ідентифікатори інструментів. Сигнал надійшов із безстрокового ф’ючерсу BTCUSDT. Виконання — з інверсного контракту BTCUSD. Обидва торгувалися поблизу $64,210, і обидва були ліквідними ринками. Але це були різні книги ордерів із різними цінами, кроками ціни, глибиною та тарифами. Бектест з’єднав дані з ринку, якого не міг отримати жоден трейдер.
Сама стратегія була цілком звичайною: входити після закриття вище ковзного максимуму, виходити після закриття нижче ковзного мінімуму, а розмір кожної позиції визначати за фіксованим ризиком у доларах. Проблема проявилася лише тоді, коли ми поставили точніше запитання, ніж «скільки коштував BTC?». Ми запитали: «Скільки можна було купити цим ордером за цим конкретним контрактом у той момент?»
Ще до запуску стратегії графік був зведеним
Наш дослідницький потік даних спрощував порівняння торговельних майданчиків. Він уніфікував символи й показував зведений ціновий ряд. Для огляду ринку це було зручно, але для моделювання виконання — ненадійно. Зведений ряд може показувати найкращу ціну серед бірж, хоча стратегія може надіслати ордер лише на один майданчик.
Під час пробою максимум зведеного бара становив $64,205. Ціна останньої угоди за вибраним контрактом уже сягнула $64,218. Водночас кешоване котирування інверсного контракту все ще показувало ціну продажу $64,210. Симулятор узяв пробій з одного ряду, а привабливу ціну продажу — з іншого. Кожне значення було реальним. Разом вони утворювали вигадку.
| Вхідні дані | Що використовував бектест | Що було потрібно для ордера |
|---|---|---|
| Максимум пробою | Зведена ціна BTC | Історія цін вибраного контракту |
| Ціна для входу | Кешована ціна продажу інверсного контракту | Свіже котирування продажу для торговельного інструмента |
| Кількість для виконання | Запитаний розмір позиції | Кількість, доступна на кожному ціновому рівні |
Рядок у таблиці ринкових даних може здаватися повним, хоча його поля описують різні ринки. Спільний псевдонім символу не доводить, що два інструменти використовують одну книгу ордерів. Ідентифікатор контракту, майданчик, валюта котирування та часова позначка мають передаватися разом на всіх етапах — від генерації сигналу до виконання ордера.
Ми відтворили виконання ордера за книгою
Ми повторно змоделювали вхід, використавши найкращу ціну продажу самого вибраного безстрокового ф’ючерсу й оновлення книги ордерів, доступні на момент ухвалення рішення. Котирування було свіжим, але на найкращому рівні було лише 0.18 BTC. Наш змодельований ордер становив 0.50 BTC. Решта 0.32 BTC мала б пройти за вищими цінами продажу.
Скоригована ціна входу була на $21 за BTC вищою за вказану ціну виконання — ще до врахування комісій. Для однієї угоди різниця невелика. Але за весь період тестування більшу частину валового прибутку стратегія отримала від кількох швидких пробоїв. Відтворення цих входів за правильними книгами зменшило валовий результат на 31%; комісії taker і вплив на ціну знизили його ще більше.
Ми також знайшли два випадки, коли котирування найкращих цін надійшло після моменту ухвалення рішення за сигналом. Бектест, який приєднує дані за найближчою часовою позначкою, може непомітно вибрати майбутнє оновлення. Тепер ми виконуємо з’єднання лише з попередніми даними: котирування має бути отримане до надсилання ордера, а його вік ми фіксуємо. Якщо останнє придатне котирування застаріло, симулятор позначає ордер як невиконуваний або застосовує явне правило для застарілих даних.
Що потрібно, аби ціна була доступною для торгівлі
Ціна закриття бара корисна для обчислення сигналу. Але вона не доводить, що конкретний ордер можна було виконати за цією ціною. Для цього ціна має стосуватися точного інструмента й майданчика, бути доступною на момент надходження ордера та мати достатню кількість зустрічних ордерів для запитаного обсягу. Якщо дані не дають відповіді на ці запитання, коректний результат — це діапазон або відсутність виконання, а не вигадана точна ціна.
Ми залишили зведений ряд для загального огляду ринку, але прибрали його зі шляху виконання. Тепер сигнали спираються на власну історію вибраного контракту, а виконання ордерів відтворюється за його книгою з урахуванням комісій та обсягу після розрахунку ціни виконання. Трохи більше технічної роботи — і значно менш приваблива крива капіталу.
Той пробій справді стався. Просто бектест дав йому вигідніший ринок, ніж той, який вибрала стратегія.
← Усі статті


