Самая опасная ошибка в тайминге бэктеста может остаться незамеченной даже при идеальной проверке временных меток. У двух событий может стоять время 10:00:00.000, хотя в действительности они произошли в порядке, который симулятор просто угадал.
Это важно для любой стратегии, которая реагирует не только на закрытые бары: на обновление котировки, сделку, уведомление о фандинге, изменение статуса биржи или подтверждение собственного ордера. Временная метка показывает, когда событие было помечено. Но она может не сказать, когда стратегия получила возможность на него отреагировать.
Как порядок событий меняет результат?
Представьте стратегию, которая покупает, когда лучшая цена продажи опускается ниже $100.00. В одну и ту же миллисекунду в ленте появляются обновление цены продажи до $99.99 и сделка по $99.99. Если бэктест сначала обрабатывает сделку, а потом котировку, стратегия видит новую цену продажи и отправляет ордер. Если сначала обработать котировку, это тоже может быть корректно — при условии, что событие действительно уже было доступно. Но если сделка поглотила выставленную ликвидность до поступления ордера, исполнение по $99.99 — выдумка.
Если сортировать строки только по временной метке, симулятору приходится самому выбирать порядок событий с одинаковым временем. Случайным правилом исполнения могут стать порядок строк в файле, порядок символов или план запроса к базе данных. Кривая капитала может измениться, хотя исходные данные остались прежними.
Вот простой способ увидеть, насколько произвольным может быть такой порядок: отсортируйте события с одинаковым временем по названию символа, а не по последовательности поступления. Тогда стратегия для нескольких активов может вести себя иначе просто потому, что один тикер стоит в сортировке раньше другого.
Какие часы нужно учитывать в бэктесте?
В обработке рыночных данных и ордеров обычно задействовано несколько разных моментов времени. Сохраняйте поля, которые предоставляет источник, и точно указывайте, что каждое из них означает. Во многих лентах полезны и временная метка биржи, и локальное время получения данных; ни одно из них не является универсальной истиной о том, что видел каждый участник.
| Часы | Что фиксируют | Чего сами по себе не доказывают |
|---|---|---|
| Время события на бирже | Когда, по данным площадки, произошло событие | В каком порядке его увидели другая лента или ваш процесс |
| Время получения | Когда ваш сборщик получил сообщение | Когда стратегия завершила его обработку |
| Время принятия решения | Когда ваш код оценил сигнал | Что указанная цена всё ещё была доступна |
| Время поступления ордера на биржу | Когда площадка могла исполнить ордер | Что ордер будет исполнен: для этого должны позволять правила матчинга и ликвидность |
Если для исторических данных нет времени получения, укажите, что вы предполагаете. Например, бэктест может обрабатывать события биржи в заданной последовательности и добавлять фиксированную задержку 5 ms между решением и поступлением ордера на биржу. Это модель, а не восстановленная история. Если для событий с одинаковыми биржевыми временными метками нет номеров последовательности, правило разрешения таких совпадений — тоже допущение.
Как моделировать события с одинаковым временем?
Для начала сохраняйте исходные номера последовательности, если они есть. Внутри одной ленты такой номер задаёт более надёжный порядок, чем временная метка, хотя у разных каналов или продуктов нумерация может быть раздельной.
Затем явно задайте правило обработки событий в симуляторе. Для каждого события решите, может ли оно обновить информацию, доступную стратегии, изменить доступную ликвидность, запустить ордер или подтвердить его. Это разные действия: если свести их к «обработке строки», в модель незаметно прокрадутся невозможные исполнения.
- Учитывайте только рыночную информацию, поступившую к моменту принятия решения стратегией.
- Сформируйте ордер, затем переместите его к смоделированному времени поступления на биржу.
- Допускайте исполнение только за счёт подходящей ликвидности после поступления ордера, с учётом предположений об исполнении для этого типа ордера.
- Для каждого смоделированного исполнения записывайте входные данные, порядок событий и использованную задержку.
Для стратегии на основе баров это может оказаться избыточной сложностью. Если сигнал использует закрытые 1-минутные бары, а ордера исполняются на открытии следующего бара с консервативной моделью издержек, порядок событий с точностью до миллисекунд, скорее всего, не изменит вывод исследования. Важно, чтобы точность моделирования времени соответствовала тому, что обещает ваш бэктест.
Можно ли доверять бэктесту без данных о времени поступления?
Да, им можно пользоваться, если ясно обозначить границы его точности. Для стратегии с редкими сделками и широкими риск-лимитами несколько миллисекунд могут ничего не значить. Но если стратегия реагирует на мимолётные котировки, борется за позицию в очереди или опирается на сигнал опережения и запаздывания между биржами, отсутствие данных о времени поступления может оказаться ключевым для результата.
Критики справедливо замечают, что точное время событий может создавать иллюзию точности. Исторические ленты неполны, часы расходятся, а временные метки площадок не показывают каждый участок сетевого пути. Симулятор с наносекундными метками всё равно может опираться на грубое допущение об исполнении.
Поэтому проверяйте чувствительность результатов, а не заявляйте о достоверности: повторите симуляцию с правдоподобными правилами разрешения совпадений и задержками ордеров, затем сравните число сделок, цену исполнения и сигналы, которые сохраняются. Если результат зависит от порядка, который невозможно установить по данным, укажите эту зависимость в отчёте об исследовании. Бэктест может быть полезен и с несовершенными часами. Нужно лишь честно указать, какое время вам действительно известно.
← Все статьи


