7 Ноября 2026 · микроструктура

Бэктест взял правильную цену не с того рынка

Бэктест взял правильную цену не с того рынка

В 10:14 UTC простая стратегия на пробой купила криптовалютный perpetual-контракт после того, как цена превысила максимум за 20 минут. Бэктест показал исполнение по $64,210. Эта цена была в данных, сигнал получил правильную временную метку, а симулированный ордер поступил на следующем баре. Мы уже почти решили, что результат чистый.

Затем мы сверили идентификаторы инструментов. Сигнал был рассчитан по perpetual-контракту BTCUSDT. Исполнение — по инверсному контракту BTCUSD. Оба торговались около $64,210, и оба рынка были ликвидными. Но это были разные стаканы с разными ценами, шагами цены, глубиной и комиссиями. Бэктест склеил рынок, на котором не мог торговать ни один трейдер.

Сама стратегия была заурядной: войти при закрытии выше скользящего максимума, выйти при закрытии ниже скользящего минимума, а размер каждой позиции определить исходя из фиксированного долларового риска. Проблема обнаружилась, когда мы задали вопрос точнее, чем «сколько стоил BTC?»: «Что мог бы купить этот ордер по этому конкретному контракту в тот момент?»

До запуска стратегии график уже был составным

Наша исследовательская лента упрощала сравнение площадок. Она нормализовала символы и показывала сводный ценовой ряд. Для анализа рынка это было удобно, но для оценки исполнения такой ряд не годился. Составной ряд может показывать лучшую цену на нескольких биржах, хотя стратегия может отправить ордер только на одну площадку.

В момент пробоя максимум сводного бара составлял $64,205. Последняя сделка по выбранному контракту к тому времени уже прошла по $64,218. При этом в кэше всё ещё хранилась котировка инверсного контракта с предложением по $64,210. Симулятор взял сигнал о пробое из одного ряда, а привлекательное предложение — из другого. Каждое значение было реальным. Их сочетание — вымышленным.

Входные данныеЧто использовал бэктестЧто требовалось для ордера
Максимум для пробояСводная цена BTCИстория цен выбранного контракта
Цена для входаКэшированное предложение по инверсному контрактуСвежая цена предложения по торгуемому инструменту
Объём исполненияЗапрошенный размер позицииДоступный объём на каждом ценовом уровне

Строка таблицы рыночных данных может выглядеть полной, хотя её поля описывают разные рынки. Совпадение псевдонимов символов не доказывает, что у двух инструментов общий стакан. Идентификатор контракта, площадка, валюта котировки и временная метка должны передаваться вместе от генерации сигнала до исполнения.

Мы воспроизвели исполнение ордера по стакану

Мы повторно смоделировали вход, используя лучшую цену предложения по выбранному perpetual-контракту и обновления стакана, доступные на момент принятия решения. Котировка была свежей, но на верхнем уровне находилось всего 0.18 BTC. Размер нашего симулированного ордера составлял 0.50 BTC. Оставшиеся 0.32 BTC пришлось бы исполнить по более высоким ценам предложения.

$64,218лучшая цена предложения на момент поступления ордера
0.18 BTCдоступно по этой цене предложения
$64,231цена исполнения по объёмно-взвешенному воспроизведению

Скорректированная цена входа была на $21 за BTC выше цены в отчёте об исполнении — ещё до комиссий. Разница в одной сделке невелика. Однако за весь период тестирования основная часть валовой прибыли стратегии пришлась на несколько быстрых пробоев. Воспроизведение этих входов по правильным стаканам снизило результат до вычета расходов на 31%; комиссии taker и влияние на цену уменьшили его ещё сильнее.

Мы также нашли два случая, когда котировка верхнего уровня стакана поступила позже момента принятия решения по сигналу. Бэктест, который сопоставляет данные по ближайшей временной метке, может незаметно выбрать будущее обновление. Теперь мы выполняем сопоставление только назад во времени: котировка должна быть получена не позже отправки ордера, а её возраст фиксируется. Если последняя пригодная котировка слишком старая, симулятор помечает ордер как неисполнимый или применяет явное правило для устаревших данных.

Что нужно для цены, по которой можно торговать

Цена закрытия бара полезна для расчёта сигнала. Но она не доказывает, что конкретный ордер мог исполниться по этой цене. Для этого цена должна относиться к точному инструменту и площадке, быть доступна к моменту поступления ордера, а встречного объёма должно хватать на запрошенный размер. Если данные не позволяют ответить на эти вопросы, честный результат — диапазон или отсутствие исполнения, а не выдуманная точная цена.

Мы оставили сводный ряд для общего контекста рынка, но убрали его из цепочки исполнения. Теперь сигналы опираются на историю выбранного контракта, а ордера воспроизводятся по его стакану; комиссии и размер позиции учитываются после расчёта исполнения. Немного больше технической работы — и кривая доходности выглядит куда скромнее.

Пробой действительно произошёл. Просто бэктест предоставил стратегии рынок получше того, который она выбрала.

криптофьючерсыбиржевые стаканырыночные данныебэктестисполнение
ПоделитьсяXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← Все статьи