Чотири числа, усі виміряні на нашому стеку паперової торгівлі, для однієї стратегії, сигналів на безстрокових ф’ючерсах BTCUSDT з інтервалом 1-minute, за 31 день і 1,418 ордерами. Медіанний час від закриття свічки до підтвердження ордера біржею: 195 ms. 99-й перцентиль: 2,970 ms. Медіана в 1% хвилин із найвищою реалізованою волатильністю: 840 ms. А затримка, задана в конфігурації бектесту більшу частину попереднього року: 0.
Три з цих чисел нудні. Усі знають, що нуль — це неправильно, і зрештою замінюють його на якесь значення, яке майже завжди обирають навмання. 100 ms, 250 ms, «будьмо обережними — 500». Насправді важливе число — 840: воно показує, що затримка залежить від стану ринку, а стани ринку, за яких вона різко зростає, — саме ті, коли сигнал вважає, що знайшов можливість.
Куди йдуть 195 мілісекунд
Ось повний бюджет затримки, виміряний поетапно за часовими мітками монотонного годинника, записаними на кожному кроці. Сервер — інстанс AWS в ap-northeast-1, у тому самому регіоні, що й кінцеві точки біржі. Це майже найкращий результат для звичайної роздрібної інфраструктури без колокації.
| Етап | p50 | p95 | p99 |
|---|---|---|---|
| Закриття свічки → отримання події WS kline-closed | 128 ms | 402 ms | 1,940 ms |
| Парсинг і оновлення стану ознак | 3 ms | 9 ms | 28 ms |
| Прийняття рішення: оцінювання моделлю й перевірки ризику | 11 ms | 22 ms | 60 ms |
| Надсилання ордера → підтвердження біржі | 47 ms | 180 ms | 1,100 ms |
| Повний шлях (виміряний, а не підсумований) | 195 ms | 690 ms | 2,970 ms |
Перед тим як перейти до цікавого, зверніть увагу на дві речі. По-перше, медіани не підсумовуються: 128 + 3 + 11 + 47 = 189, а виміряна медіана повного шляху — 195. Перцентилі не є адитивними, і якщо оцінювати затримку сумою p99 для кожного етапу, вийде 3,128 ms, тоді як реальний p99 становить 2,970. Тут різниця невелика, але коли етапи корелюють в інший бік, похибка може бути величезною. Вимірюйте весь шлях.
По-друге, погляньте на верхній рядок. Дві третини медіанного бюджету йде на очікування, поки біржа повідомить про закриття свічки. Це не мережа, не ваш код і не маршрутизація ордерів. Біржа агрегує угоди в kline, визначає, що хвилина завершилася, і надсилає повідомлення. Перед ним є черга, спільна для всіх інших підписників цього потоку.
Число 840
Розподілімо всі 1,418 ордерів за реалізованою волатильністю хвилини, що породила сигнал, — і картина зміниться.
| Кошик волатильності свічки сигналу | Ордери | p50 повного шляху | p99 повного шляху |
|---|---|---|---|
| Нижній квартиль | 201 | 141 ms | 488 ms |
| Два середні квартилі | 796 | 183 ms | 1,210 ms |
| Верхній квартиль | 407 | 312 ms | 2,880 ms |
| Топ-1% усіх хвилин | 14 | 840 ms | 4,100 ms |
Усі етапи сповільнюються разом, і тому ефект накопичується. Черга агрегації та трансляції біржі залежить від навантаження на matching engine: хвилина з 11,000 угодами надходить пізніше, ніж хвилина з 600. У той самий час ваш процес обробляє більше оновлень глибини ринку та більше угод, тож оновлення ознак, яке зазвичай триває 3 ms, займає 28. Шлях ордера через REST конкурує з панічними запитами інших учасників, і часом виникає помилка 503 із повторною спробою, яка сама по собі коштує цілої секунди. Коефіцієнт кореляції між кількістю угод у свічці сигналу та затримкою повного шляху в нашій вибірці дорівнював 0.41. Не надто великий. Але достатній, щоб зруйнувати припущення про сталу затримку.
Стратегії, які проходять первинний відбір, переважно торгують пробої, розвороти, дислокації та каскади ліквідацій. Вони спрацьовують саме в кошику з найбільшою затримкою. Імпульсний сигнал, що спрацьовує лише тоді, коли ціна за хвилину змінюється на 40 bps, структурно влаштований так, що його завжди обслуговує найповільніша версія вашого стека.
Одного разу ми витратили цілий день, шукаючи причину викиду на 3.6 секунди, який з’являвся приблизно в один і той самий час щоночі. Виявилося, що це був logrotate: він копіював і обрізав файл розміром 2 GB на тому самому томі EBS, куди процес записував дані, блокуючи цикл подій. Ринок був ні до чого. Спершу вимірюйте, а тоді звинувачуйте мікроструктуру.
Як це впливає на виконання ордера
Поки ви чекаєте, ціна рухається. У випадкову хвилину середній несприятливий рух за наші медіанні 195 ms становив приблизно 1.1 bps проти напрямку сигналу. У хвилинах верхнього квартиля, за 312 ms, — 5.8 bps. У хвилинах топ-1%, за 840 ms, — близько 14 bps несприятливого руху ще до того, як ордер потрапить у книгу заявок.
На безстрокових ф’ючерсах BTC спред майже не впливає на це: один крок ціни в котируванні 84,000 — це 0.012 bps, тож збитки спричиняє несприятливий рух ціни, а не витрати на перетин спреду. Перейдіть із тією самою стратегією на безстроковий ф’ючерс із середньою капіталізацією — і другий чинник дасться взнаки: спред найкращих цін у нашій вибірці зростав із 1.4 bps у спокійні хвилини до 6.2 bps у верхньому квартилі, а глибина на цих цінах скорочувалася більш ніж удвічі. Ви одночасно платите за рух ціни, ширший спред і меншу глибину — усе через спільну причину.
Коли ми повторно прогнали ті самі 31 день із затримкою, що залежала від кожної свічки, замість сталої 200 ms, середня ціна входу в бектесті погіршилася на 3.1 bps. Майже весь цей ефект припав на 9% угод. Розбіжність ціни входу між бектестом і паперовою торгівлею скоротилася з 4.2 bps до 0.9 bps. Sharpe цієї стратегії на IS знизився з 1.7 до 1.1 — це чесне значення, яким воно мало бути від самого початку.
Що ж указати в конфігурації
Не одне число. Ось що ми робимо зараз:
- Вимірюйте, а не задавайте значення. Для кожного змодельованого ордера вибирайте затримку з емпіричного розподілу, зумовленого активністю відповідної свічки: достатньо кількості угод і абсолютної дохідності, які вже є у стандартному kline. Окремо налаштовуйте для кожної біржі та типу ордера, оновлюйте щомісяця.
- Зберігайте хвіст розподілу. Не апроксимуйте логнормальним розподілом і не вважайте, що цього досить: p99 формується сплесками повторних спроб і паузами GC, яких не відтворить жоден гладкий розподіл. Ми використовуємо емпіричні квантилі з повторно вибраним хвостом вище p95.
- Затримка стосується і скасування ордерів. Заміна стопа або скасування хеджу підпадають під ту саму затримку, а на швидкому ринку ваш ордер на скасування змагається з виконанням. Якщо симулятор скасовує ордер миттєво, ваша модель ризику — вигадка.
- Додайте перевірку застарілості сигналу й симулюйте її. Ми відкидаємо сигнали, якщо на момент отримання їм понад 1.5 секунди. Це реальна поведінка з реальною ціною: вона непомітно прибирає угоди, і бектест має прибирати ті самі угоди.
- Перекалібруйте за даними паперової торгівлі. Паперова торгівля дає змогу отримати еталонні дані. Записуйте часові мітки всіх чотирьох етапів для кожного ордера та щотижня порівнюйте розподіли з припущеннями симулятора.
В інших класах активів — та сама проблема. Акції США: консолідована стрічка додає власну затримку агрегації поверх затримки брокера, і вона зростає під навантаженням повідомленнями з тієї самої структурної причини. Ринки прогнозів: на більшості майданчиків ордери подаються лише через REST, і ми вимірювали медіанну затримку менш ніж 100 ms, яка зростала до кількох секунд під час події визначення результату, коли всі приходили одночасно. Криптоопціони: котирування, на основі якого ви визначаєте ціну, може відставати на дві секунди саме в ту хвилину, коли рухається базовий актив.
Загальна суть помилки — вважати параметр виконання незалежною сталою, хоча він залежить від тієї самої змінної стану, що й сигнал. Комісії поводяться передбачувано, фінансування — теж, а затримка — ні. Якщо після всього цього ви запам’ятаєте лише одне число, нехай це буде співвідношення: наш p99 у п’ятнадцять разів перевищує медіану, а сигнали непропорційно часто надходять ближче до p99.
Виміряйте затримку на всіх чотирьох етапах. Це займе один робочий день і розповість про вашу стратегію більше, ніж ще тиждень пошуку параметрів.
← Усі статті


