Бэктест отвечает на вопрос, что дало бы заданное торговое правило на конкретном наборе исторических наблюдений при конкретной модели исполнения. Работа начинается до первого графика доходности: сформулируйте правило, которое могло бы оказаться неверным, проверьте, какие цены были доступны в момент каждого решения, и держите допущения рядом с результатами.
«Покупать, когда график выглядит сильным» воспроизвести нельзя. «Если завершённое закрытие часовой свечи превышает предыдущий 20-баровый максимум, моделируем вход на открытии следующего доступного бара» — уже достаточно конкретно для проверки. Ему всё ещё нужны условие выхода, определение рынка, издержки и эталон для сравнения, но другой исследователь сможет понять, какие доказательства изменили бы вывод.
1. Зафиксируйте гипотезу и правило
Запишите инструмент и контракт, площадку или поставщика данных, интервал бара, часовой пояс, событие входа, условия выхода и отмены, направление, правило определения количества, максимальное время удержания и эталон для сравнения. Объясните, почему правило может работать и какая закономерность свидетельствовала бы против него. Пробой может не сработать, если закрытия быстро возвращаются внутрь прежнего диапазона; правило возврата к среднему может не сработать, когда цена продолжает уходить от своего среднего.
Храните датированную версию каждого правила. Если вы тестируете 20 комбинаций периода ретроспективы и выхода, зафиксируйте все 20 и то, почему они были выбраны. Лучшая строка из большого перебора — не доказательство того, что настройка была выбрана заранее. Статья Probability of Backtest Overfitting на странице издателя объясняет, почему многократный отбор лучшего кандидата может сделать результаты в выборке более убедительными, чем их последующая доходность.
2. Проверьте, что на самом деле сообщает каждая свеча
Храните вместе с набором данных поставщика, продукт, символ, тип контракта, запрошенные даты, время получения, интервал свечей, исходные временны́е метки, единицы объёма и все преобразования. Проверьте наличие дублирующихся или пропущенных интервалов, некорректных значений high/low, резких смен символа и последнего бара, который ещё не закрылся на момент получения. Сохраните исходный файл или стабильный отпечаток, чтобы можно было воспроизвести входные данные.
Например, представим вымышленную часовую свечу с open $100, high $108, low $97 и close $105. Правило входит в сделку, когда завершённое закрытие превышает предыдущий 20-баровый максимум $104.50. Сигнал становится известен только на закрытии свечи. Тест, который видит это закрытие, но исполняется по цене открытия той же свечи $100, использует более позднюю информацию, чтобы выбрать более раннюю цену. Причинная модель бара могла бы использовать вымышленное открытие следующего бара $105.20, но при этом по-прежнему обозначать это открытие как ценовой прокси, а не как гарантированное исполнение. Для стоп-лосса или пробоя внутри бара нужны данные достаточно мелкого масштаба, чтобы установить последовательность событий.
Текущая справочная документация Binance Spot API описывает GET /api/v3/klines и определяет временны́е метки открытия и закрытия наряду с полями OHLC и объёма. Относитесь к этим полям как к фактам поставщика, которые следует сохранить, а затем определите, была ли каждая свеча завершена на момент вашего получения данных. Данные одной площадки не являются автоматически историей всего рынка, и бар спота не заменяет бессрочный контракт. Документация Binance Spot по klines.
3. Внесите в журнал все существенные издержки
Смоделируйте комиссии за вход и выход, спред, неблагоприятное проскальзывание, заимствование или финансирование, где это применимо, а также минимальные шаги объёма и цены инструмента. Укажите, какой уровень аккаунта и роль ордера предполагает комиссия. Для бессрочного фьючерса привяжите каждую позицию к выплатам по финансированию, которые действительно попадают в её окно удержания, используя их временны́е метки и знак; пропущенный интервал остаётся неизвестным, а не нулевой выплатой.
Также решите, что происходит, когда одна и та же свеча OHLC пересекает и стоп-лосс, и цель. Данные свечи не могут сказать, что произошло первым. Используйте консервативное допущение, более мелкомасштабные данные или классифицируйте результат как неоднозначный. Затем повторите тест с повышенными издержками и сообщите, когда кажущийся результат перестаёт выдерживать проверку. Одна необъяснённая «консервативная комиссия» сама по себе не делает модель исполнения реалистичной.
4. Отделите выбор правила от последующей оценки
Используйте более ранние наблюдения, чтобы сформировать и настроить правило. Отложите хронологический период до настройки и используйте его один раз для вопроса, ради которого он предназначался. Если вы просматриваете этот период и меняете параметр, отметьте его как использованный; многократно просмотренная отложенная выборка теперь является частью процесса исследования.
Повторяющиеся хронологические окна могут показать, как фиксированная процедура ведёт себя по мере накопления истории. В walk-forward тесте определите, что переобучается на каждой границе и какие настройки остаются замороженными. Текущая документация Scikit-learn по TimeSeriesSplit описывает расширяющиеся, упорядоченные по времени фолды и необязательный разрыв, измеряемый в выборках. Она также требует равноотстоящих выборок, чтобы тестовые фолды представляли сопоставимые длительности; поэтому часовые данные по криптовалютам с пропущенными интервалами нуждаются в явной политике обработки пропущенного времени. Разрыв — это количество строк, поэтому выбирайте его в соответствии с горизонтом исхода и перекрытием в ваших собственных метках, а не копируйте значение по умолчанию. Документация TimeSeriesSplit.
Отслеживайте количество сделок, а также количество свечей. Сообщайте чистый результат после издержек, траекторию просадки, самую длинную серию убытков, время нахождения в позиции и вклад нескольких крупнейших сделок. Если два события объясняют большую часть прибыли, эта концентрация должна быть отражена в выводе. Сравнивайте с эталоном, используя тот же рынок, даты и соглашение о капитале.
5. Проверьте реализацию на прочность, прежде чем доверять графику
Попробуйте намеренно неблагоприятную проверку: увеличьте издержки, сдвиньте окно оценки, слегка измените параметр и изучите отдельные записи о сделках в районах пропущенных интервалов или высокой волатильности. Убедитесь, что будущие наблюдения не могут изменить сигнал, который уже должен быть зафиксирован. Храните проваленные проверки и негативные результаты вместе с запуском, а не только выигрышный график.
Сохраняйте точную версию стратегии, снимок данных, конфигурацию, график издержек, эталон для сравнения и журнал результатов вместе. Полезный финальный вопрос: «Что заставило бы меня перестать верить этому результату?» Запишите ответ до запуска другой вариации. Когда последующая проверка меняет ваше мнение, создайте новую версию вместо переписывания первоначальной записи.
После исторического тестирования демо-торговля или перспективное наблюдение могут проверить другие вопросы, например, можно ли следовать правилу и поступают ли записанные данные вовремя. Эти упражнения по-прежнему не подтверждают, что биржа исполнила бы реальный ордер по смоделированной цене.
Встроенные в SuperQuant истории бэктестов синтетические. Его часовой исследовательский процесс и журнал помогают изучить, как программное обеспечение применяет правило, но упрощённые допущения движка об исполнении и марже не воспроизводят глубину стакана, частичные исполнения или уровни ликвидации каждой биржи. Воспроизводимый запуск на синтетических свечах — это программная репетиция, а не результат по крипторынку.
Воспользуйтесь контрольным списком для аудита бэктеста, затем прочитайте руководства по качеству данных, чувствительности к издержкам и переобучению. Это метод исследования, а не инвестиционная рекомендация и не утверждение о будущей прибыльности.