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

Разбивка заявки по времени — это исполнение одного крупного объёма серией равных частей через фиксированный интервал, при котором цена входа складывается как среднее по периоду, а не как цена одного момента.

Какая задача решается проверкой на истории

Задача узкая. Проверяется не доходность, а устойчивость средней цены исполнения к выбору момента старта.

Логика тут простая. Крупная заявка, поданная целиком, получает цену одного момента. Та же заявка, разбитая на десять частей по дням, получает среднее из десяти моментов. Историческая проверка отвечает на вопрос, насколько сильно результат зависит от даты запуска: если сдвиг старта на три дня меняет вывод, устойчивости нет, и графику верить нельзя.

Второй вопрос об издержках. Серия из десяти частей платит комиссию десять раз и десять раз пересекает спред, а разовая покупка — однажды. Сравнение без этих издержек бессмысленно.

Почему число попыток важнее результата

Тут полезно заглянуть в работу, написанную не про криптовалюты. В статье «The Probability of Backtest Overfitting» Бэйли, Борвейна, Лопеса де Прадо и Чжу в редакции февраля 2015 года сказано прямо: пока исследователь перебирает больше одной конфигурации стратегии, переобучение присутствует всегда, а метод отложенной выборки не учитывает число попыток и потому не способен корректно оценить представительность теста. Там же отмечено, что публикуемые тесты почти никогда не раскрывают число испробованных вариантов. Текст доступен в работе о вероятности переобучения на исторических данных.

Выход авторы предлагают такой. Выборка разбивается на блоки, результаты сравниваются перекрёстно: при 16 блоках и четырёх годах дневных данных блок получается квартальным, что сохраняет структуру последовательной зависимости наблюдений.

Перенос на разбивку заявки нетруден. Вариантов графика у вас немного: число частей, интервал, время суток. Шесть вариантов числа частей на четыре варианта интервала — уже 24 попытки, и лучшая из них будет выглядеть убедительно по чистой случайности.

Как разбить крупную заявку по времени и проверить на истории: шаги с параметрами

  1. Зафиксировать параметры графика до теста: число частей, интервал между ними, тип заявки и срок её жизни.
  2. Записать опорную величину для сравнения — например, среднюю цену закрытий за тот же период.
  3. Разбить историю на непересекающиеся блоки и прогнать график на каждом отдельно.
  4. Посчитать комиссии и пересечение спреда по каждой части, а не по сделке в целом.
  5. Сдвинуть дату старта на несколько интервалов и повторить: разброс результата и есть мера устойчивости.
  6. Записать число перебранных вариантов рядом с результатом — без этой цифры вывод неполон.

Первый шаг хитрее остальных. Он требует параметра, о котором забывают. Срок жизни заявки задаётся отдельным полем протокола: в словаре FIX 4.4 поле TimeInForce принимает значения Day, Good Till Cancel, At the Opening, Immediate or Cancel, Fill or Kill, Good Till Crossing, Good Till Date и At the Close, причём отсутствие поля трактуется как Day. В тесте это значение нужно задать явно, иначе часть, не исполнившаяся за сессию, учтётся неверно. Близкая механика разобрана в материале о том, как настроить сетку заявок.

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

Чего нет в исторических данных

Свечи содержат четыре цены и объём. Стакана в них нет.

Потеря ощутимая. Насколько — видно по тому, как качество исполнения измеряет регулятор. Правило 605 обязывает торговые центры раскрывать средний котируемый спред, средний эффективный спред и реализованный спред с замерами через 50 миллисекунд, 1 секунду, 15 секунд, 1 минуту и 5 минут после сделки, а также долю объёма, исполненного с улучшением цены, и скорость исполнения по корзинам времени — вплоть до категорий менее 100 микросекунд. Разбивка по размеру идёт по условной стоимости: от категории до 250 долларов до категории 200 000 долларов и выше. Текст нормы приведён в параграфе 242.605 раздела 17 Свода федеральных нормативных актов США.

В свечах нет ни одной из этих величин. Значит бэктест по свечам занижает издержки исполнения, и занижает тем сильнее, чем крупнее заявка относительно оборота пары.

Таблица: что нужно проверке и чем это заменить

Что нужно для проверки Есть ли в свечных данных Чем заменить Какую ошибку даёт отсутствие
Цена каждой части в момент исполнения Есть приблизительно: цена закрытия интервала Цена открытия следующего интервала вместо закрытия текущего Исполнение по цене той же свечи даёт заглядывание в будущее
Спред в момент исполнения Нет Фиксированная надбавка к цене, записанная как допущение Издержки серии из многих частей занижаются кратно
Глубина стакана под размер части Нет Ограничение части долей от объёма интервала Крупная часть считается исполненной по одной цене, чего не бывает
Комиссия по роли тейкера или мейкера Нет Два прогона: по верхней и по нижней ставке из тарифа площадки Серия сделок выглядит дешевле разовой покупки
Пары, прекратившие торговаться Нет: в выгрузке остаются выжившие Включение в выборку делистингованных пар, если данные доступны Результат смещён в пользу графика на выживших инструментах

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

Условный расчёт на примере суммы

Все числа ниже условные. Это арифметика метода, а не прогноз и не рекомендация к сделке.

Сумма: условные 300 000 рублей. График: 10 частей по 30 000 рублей с интервалом в сутки.

Опорная величина — средняя цена закрытий за те же 10 дней. Допущение по спреду: 0,05 процента от суммы каждой части. Комиссия: по верхней ставке тарифа в первом прогоне и по нижней во втором.

Издержки серии: 10 комиссий и 10 пересечений спреда против одной комиссии и одного пересечения при разовой покупке. При допущении 0,05 процента разница по спреду составляет около 0,45 процента суммы.

Проверка устойчивости: три непересекающихся блока по 10 дней плюс сдвиг старта на 1, 2 и 3 дня внутри каждого. Перебрано 12 вариантов — цифра записывается рядом с результатом.

Ставки комиссий конкретных площадок в расчёт не подставлены: они меняются и проверяются по тарифу на дату операции.

Вывод тут не о выгоде. Он о чувствительности. Если разница между графиком и разовой покупкой меньше суммарных издержек серии, то проверка показала отсутствие преимущества — и это полноценный результат. Как учитываются расхождения цен между площадками, мы разбирали в материале о том, как сравнить биржевую и ончейн-цену токена и понять причину расхождения.

Ошибки, из-за которых проверка врёт

Главная ошибка — подбор интервала по одному отрезку истории. Лучший из 24 вариантов на одном квартале почти всегда проигрывает на следующем, и работа Бэйли с соавторами описывает это как неизбежное следствие числа попыток, а не как неудачу. Вторая ошибка — исполнение части по цене закрытия той же свечи: это заглядывание в будущее. Третья — перенос результата с одной пары на другую: ликвидность у них разная. Четвёртая — трактовка исторического расчёта как ожидаемой доходности. Ни один тест на истории доходности не обещает.

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

Чек-лист исторической проверки

  • Параметры графика записаны до начала теста и не меняются внутри прогона
  • Опорная величина периода выбрана и зафиксирована
  • История разбита на непересекающиеся блоки, прогон идёт по каждому
  • Исполнение части считается по следующему интервалу, а не по текущему
  • Спред задан как явное допущение, комиссии прогнаны по двум ставкам
  • Старт сдвинут минимум на три шага, разброс результата посчитан
  • Число перебранных вариантов записано рядом с результатом
  • В тексте вывода отмечено, что расчёт описывает прошлое

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

Итог

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

Материалы по теме:

Частые вопросы

Сколько истории нужно для проверки расписания?

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

Можно ли проверять расписание на свечах?

Можно с оговорками. В свечах нет спреда и глубины стакана, а именно они определяют издержки серии из многих частей. Регулятор при оценке качества исполнения опирается на эффективный и реализованный спред с замерами через 50 миллисекунд, 1 секунду, 15 секунд, минуту и 5 минут. В свечном тесте эти величины задаются допущением.

Почему нужно записывать число перебранных вариантов?

Потому что лучший из многих вариантов выглядит убедительно случайно. Авторы работы о переобучении указывают: пока перебирается больше одной конфигурации, переобучение присутствует всегда, а отложенная выборка число попыток не учитывает. Запись перебора позволяет оценить результат честно и сравнить два теста между собой.

Какой параметр заявки чаще всего забывают задать в тесте?

Срок жизни. В словаре FIX 4.4 поле TimeInForce принимает значения Day, GTC, OPG, IOC, FOK, GTX, Good Till Date и At the Close, а отсутствие поля трактуется как Day. Без явного значения неисполненная часть учитывается неверно: тест либо отменит её, либо перенесёт на следующий интервал.

Исторический результат означает, что так будет и дальше?

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

Вердикт

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

Разборы механик исполнения заявок обсуждаем в Telegram-канале Cryptium.