EasyTrading
Разборы20 августа 2026 г. 18 мин

Стратегия выглядит прибыльной. Что проверить, прежде чем ей поверить

Красивый график капитала может быть следствием рабочей идеи, подгонки параметров или невозможного исполнения. Разбираем один бэктест от гипотезы до решения: отклонить, доработать или отправить на форвард-тест.

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

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

Чтобы понять, какая из них перед нами, недостаточно пересчитать доходность. Нужно восстановить весь исследовательский процесс: что проверяли, какие данные были доступны, как моделировали заявки и какое правило принятия решения установили до просмотра результата.

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

Маршрут проверки в восьми шагах

До подробностей зафиксируем карту исследования:

  1. Определить гипотезу и ориентир сравнения (benchmark). Что должно создавать эффект и с чем его сравнивать?
  2. Зафиксировать критерии приёмки. Какой результат будет достаточным, а какой завершит эксперимент?
  3. Сделать данные доступными на конкретный момент времени. Что стратегия действительно знала в момент решения?
  4. Отделить разработку от проверки. Где можно настраивать правило, а какой участок останется невидимым?
  5. Задать контракт исполнения. Когда появляется заявка, по какой цене и в каком объёме она может исполниться?
  6. Учесть весь поиск и проверить устойчивость. Сколько вариантов участвовало и что происходит рядом с победителем?
  7. Один раз открыть контрольную выборку. Выполнены ли заранее записанные условия go/no-go?
  8. Проверить операционный и риск-контур. Что должно сработать до paper trading, малого live и увеличения объёма?

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

Восемь шагов — наша прикладная структура, опирающаяся на опубликованные протоколы проверки бэктестов и model-risk практики [8][9].

Учебная стратегия: что именно мы проверяем

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

До запуска зададим условную базовую конфигурацию:

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

Число 50 здесь не рекомендация и не найденный optimum. Оно нужно, чтобы каждое следующее действие относилось к одной и той же версии гипотезы.

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

Шаг 1. Запишите механизм до оптимизации

Экономическое объяснение не доказывает стратегию. Оно ограничивает пространство решений и позволяет заранее назвать условия провала.

Для нашей стратегии нужно ответить:

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

Последний вопрос важнее формулировки «почему это должно работать». Если любое поведение цены можно объяснить задним числом, гипотеза неуязвима для проверки.

Шаг 2. Зафиксируйте решение до открытия holdout

Фраза «результат сохранил смысл» слишком удобна: после теста под неё можно подвести почти любой исход. Поэтому до контрольной выборки нужна карточка приёмки.

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

Карточка приёмки

Версия гипотезы и кода:
Основная метрика:
Benchmark:
Минимально приемлемый net-результат относительно benchmark:
Метод оценки неопределённости / доверительного интервала:
Минимальный эффективный размер выборки:
Максимальная допустимая просадка:
Максимальная длительность восстановления:
Предельная доля результата от крупнейших сделок:
Base / adverse / severe сценарии издержек:
Максимально допустимое расхождение development / holdout:
Число испытанных семейств и конфигураций:
Коррекция на множественный поиск:
Безусловное правило отклонения:

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

Для стратегии пробоя правило отклонения может относиться не к одной цифре доходности, а к набору условий: отсутствие положительного результата после заданных издержек, недопустимая концентрация P&L, нарушение лимита просадки или распад эффекта на заранее выбранной контрольной выборке. Важно, чтобы после результата нельзя было заменить условия более удобными.

Шаг 3. Соберите данные, которые существовали тогда

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

Доступность на конкретный момент времени, или point-in-time, означает: тест видит только ту версию данных и тот состав инструментов, которые действительно были доступны к моменту решения. Отдельно проверяют утечку будущей информации и смещение из-за отбора только «выживших» инструментов [5][6].

Dataset-integrity checklist

  • источник данных, версия выгрузки и часовой пояс зафиксированы;
  • свечи построены по однозначным границам сессии;
  • пропуски, дубликаты и торговые остановки обработаны явно;
  • корпоративные действия и дивиденды учитываются согласованно с ценами;
  • историческая торговая вселенная не составлена из сегодняшних «выживших» активов;
  • делистинги и финальная доходность выхода не исчезли из выборки;
  • тикеры сопоставлены через устойчивые идентификаторы, а не только строки названий;
  • публикации и пересмотры макро- и фундаментальных данных имеют исторические timestamps;
  • нормализация, заполнение пропусков, PCA и отбор признаков обучаются только на прошлой train-части;
  • признаки не используют будущий состав индекса или будущую классификацию инструмента;
  • начало информации и конец горизонта каждой метки или позиции сохранены.

Для простой стратегии пробоя часть ML-пунктов может не применяться, но временная семантика остаётся. Если текущая свеча закрылась в 18:00:00, сигнал, которому требуется окончательное закрытие, не существовал раньше этого момента.

Три момента одной сделки

Каждую сделку полезно разложить на три временные метки:

  1. Данные: когда стала доступна последняя входная величина.
  2. Решение: когда стратегия закончила расчёт сигнала.
  3. Исполнение: когда заявка после задержки могла попасть на рынок и получить fill.

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

Шаг 4. Разделите разработку и независимую проверку

Development-период нужен для формулировки правила, исправления ошибок и выбора параметров. Контрольная выборка, или holdout, — участок истории, который не используют при выборе и настройке стратегии.

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

Провал holdout завершает подтверждающий эксперимент этой версии. Можно начать новое исследование, но тогда:

  • изменения создают новую версию гипотезы;
  • прежний holdout становится данными для разработки;
  • для нового подтверждения нужен новый не просмотренный участок, lockbox или будущий forward-период;
  • переходы между версиями сохраняются в журнале.

Утечка шире прямого взгляда в будущее

Даже правильная временная граница не спасает, если масштабирование, отбор признаков или заполнение пропусков обучены на всей истории. Все обучаемые преобразования должны заново настраиваться только на прошлой части каждого цикла [5][10].

Если позиции, признаки или ML-метки перекрываются во времени, строки возле границы обучения и проверки могут разделять одну будущую ценовую траекторию. Тогда применяют purging — удаление пересекающихся обучающих наблюдений — и при необходимости embargo, защитный промежуток. Его длину выводят из фактического механизма перекрытия, горизонта позиции или метки и доступности информации, а не выбирают произвольно [11].

Для стратегии пробоя это особенно заметно, если сделка, открытая в development-периоде, закрывается уже внутри holdout. Просто разрезать таблицу по дате входа недостаточно: нужно заранее решить, к какой части относится такой P&L и не переносит ли он информацию через границу.

Шаг 5. Задайте минимальный контракт исполнения

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

Спред между лучшей ценой покупки и продажи (bid–ask spread) — первая разница между условной ценой на графике и доступной ценой немедленной сделки. Marketable-покупка обычно пересекает спред и исполняется по доступному ask, продажа — по bid. Пассивная лимитная заявка может исполниться выгоднее и предоставить ликвидность, но может исполниться частично или не исполниться.

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

Контракт симулятора

  1. Сигнал получает timestamp фактической доступности всех данных.
  2. Заявка появляется не раньше следующего допустимого события после заданной задержки.
  3. Для market, limit, stop и stop-limit отдельно заданы правила цены, объёма и отмены.
  4. Если внутрисвечной путь неизвестен, используется более детальный источник данных или заранее выбранный консервативный порядок — не наиболее выгодный.
  5. При одновременном касании stop и target на OHLC-свече тест не выбирает выгодный исход задним числом.
  6. Исполненный объём ограничен доступным объёмом и заранее заданной долей участия.
  7. Касание лимитной цены не считается гарантированным исполнением всего объёма без модели очереди и ликвидности.
  8. Гэпы, устаревшие котировки, остановки торгов, отклонённые заявки и частичные исполнения имеют явные правила.
  9. Спред, проскальзывание и вероятность исполнения калибруются по котировкам и сделкам либо по собственным исполнениям в paper/live; до калибровки они помечаются как сценарные допущения [12].
  10. Отчёт содержит минимум три сценария исполнения: базовый (base), неблагоприятный (adverse) и стрессовый (severe).

В учебной стратегии решение возникает после закрытия свечи. Поэтому базовый сценарий не может «купить по уже известному close». Следующая доступная котировка, задержка и тип заявки входят в саму спецификацию стратегии, а не добавляются после расчёта красивого P&L.

Издержки зависят от оборота, размера и ликвидности [7]. Масштабировать исторический P&L линейно вместе с капиталом нельзя: более крупная заявка может съесть глубину стакана и изменить собственную цену исполнения.

Шаг 6. Покажите весь поиск, а не только победителя

Одна стратегия пробоя быстро превращается в дерево вариантов:

  • максимум за 10, 20, 50 или 100 свечей;
  • вход сразу после сигнала или с задержкой;
  • фильтры тренда, объёма и волатильности;
  • разные стопы и правила выхода;
  • несколько таймфреймов, рынков и периодов.

Если показать только лучший вариант, теряется статистический объект исследования: весь процесс отбора [4].

Журнал экспериментов — минимальный аудиторский след, но не защита от selection bias сам по себе. В нём нужны все семейства правил, конфигурации, результаты и причины изменений. Коррелированные варианты нельзя механически считать независимыми испытаниями.

Поправка Deflated Sharpe Ratio (DSR) оценивает убедительность выбранного коэффициента Шарпа относительно ожидаемого максимума среди испытаний [1]. Расчёт учитывает эффективное число независимых испытаний и разброс их Sharpe, а также длину ряда, асимметрию и эксцесс доходностей выбранной стратегии. Один счётчик запусков недостаточен.

В факторной литературе проблема видна в большом масштабе. Harvey, Liu и Heqing Zhu составили каталог 316 факторов из 313 опубликованных работ и отобранных working papers [2]. Даже этот каталог отражает только наблюдаемую часть поиска: неудачные неопубликованные тесты в него не попадают. В применённой авторами модели новый фактор для их задачи должен был преодолеть t-ratio выше 3 вместо обычного порога около 2. Это не универсальное пороговое значение для любой торговой стратегии; важен сам принцип повышения доказательного порога при широком поиске.

Проверяйте окрестность победителя

Для периода пробоя 50 свечей заранее проверим соседнюю область — например, 45, 48, 52 и 55. Это не поиск нового победителя на holdout, а sensitivity analysis на development-данных.

Одиночная «игла» требует объяснения. Плавная поверхность также ничего не доказывает: её можно получить высокой корреляцией соседних вариантов или новой формой подгонки. Карта параметров — диагностика. Выбранную область и правило отбора всё равно нужно подтвердить на независимых данных.

Дополнительные стресс-проверки:

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

Сценарии не называют «реалистичными» без калибровки. Они должны быть либо привязаны к наблюдаемым данным, либо честно помечены как гипотетические стрессовые допущения.

Доказательная врезка: что показали 888 алгоритмов Quantopian — и чего не показали

В исследовании Wiecki et al. исходная база содержала 7 152 пользовательских алгоритма Quantopian на американских акциях [3]. После удаления коротких, экстремальных, недостаточно инвестированных и дублирующихся стратегий осталось 888.

Все алгоритмы были зафиксированы между январём и июнем 2015 года и повторно прогнаны в Zipline до конца 2015 года. Поэтому симулированный out-of-sample период составлял лишь 6–12 месяцев, минимум шесть месяцев. Код действительно не изменялся по результатам этого периода, но сделки и доходности оставались симуляцией на минутных исторических данных, а не реальной торговлей. Исследование не проверяло стратегии на многолетнем независимом периоде или в реальной торговле.

В этой отфильтрованной выборке отдельные популярные in-sample метрики, включая коэффициент Шарпа, имели низкую объясняющую способность для соответствующих out-of-sample метрик: авторы сообщают R² ниже 0,025. Прокси исследовательской активности — логарифм суммарного числа дней во всех предыдущих бэктестах — был слабо, хотя статистически значимо, связан с разрывом Sharpe между IS и OOS: Spearman R² = 0,017, p < 0,0001.

Это наблюдательная связь в одной платформенной выборке. Она не доказывает, что дополнительные запуски вызвали ухудшение. Результат мог зависеть от фильтрации, состава стратегий и общей смены режима: development в основном приходился на бычий участок 2010–середины 2015 года, последующий период был иным.

Ограниченный практический вывод: эта выборка не поддерживает использование одного лишь максимального in-sample Sharpe как достаточного критерия отбора.

Шаг 7. Откройте holdout один раз и выполните правило

До открытия контрольного периода должны быть заморожены:

  • версия кода и данных;
  • состав инструментов;
  • параметры и правила выбора;
  • контракт исполнения;
  • сценарии издержек;
  • лимиты риска;
  • карточка приёмки.

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

Возможны три честных решения:

  1. Reject. Нарушено безусловное правило отклонения; эксперимент этой версии завершён.
  2. Research. Результат выявил новую гипотезу или ошибку. Она получает новую версию и новый будущий способ подтверждения.
  3. Promote to forward validation. Все заранее заданные критерии выполнены, но это означает только право на более дорогой этап проверки, а не доказанную будущую прибыльность.

Вот как это замыкает пример пробоя. Допустим, исключительно для иллюстрации процедуры, стратегия превысила заранее заданный net-порог, но нарушила записанный до теста лимит концентрации: результат оказался зависим от нескольких крупнейших сделок. Решение — Reject, хотя итоговая кривая остаётся прибыльной. Если после просмотра заменить лимит концентрации, это будет уже новая версия исследования, а не успешное прохождение прежнего holdout.

Где здесь walk-forward

Walk-forward исторически симулирует заранее определённую процедуру регулярного переобучения: train-окно сдвигается, модель замораживается и применяется к следующему участку. Он полезен, если стратегия действительно будет обновляться таким способом.

В каждом цикле preprocessing и подбор модели выполняются только на доступном прошлом. При перекрывающихся метках или позициях границу очищают от общей информации. Издержки переобучения и исполнения учитывают в каждом OOS-сегменте.

Но длина окна, шаг и objective сами могут стать гиперпараметрами. Если конфигурацию walk-forward выбрали по лучшей итоговой кривой, для оценки уже этой метапроцедуры нужен внешний неиспользованный период или заранее зафиксированная конфигурация. Walk-forward не воспроизводит будущие режимы и не делает наблюдения независимыми.

Шаг 8. Спроектируйте риск-контур до paper и live

Даже корректный исследовательский результат не определяет размер позиции и не защищает от операционной ошибки. До подключения к рынку нужен отдельный список лимитов и действий при нарушении [9]. Значения зависят от капитала и стратегии; здесь важна обязательность полей и заранее заданных действий.

  • Риск на сделку. Лимит: размер или доля риск-бюджета. Нарушение: уменьшить или запретить заявку.
  • Общая и чистая экспозиция. Лимит: верхние границы. Нарушение: заблокировать новые позиции.
  • Плечо и маржинальный запас. Лимит: предел и буфер. Нарушение: принудительно снизить риск.
  • Инструмент, сектор, коррелированная группа. Лимит: максимальная концентрация. Нарушение: запретить наращивание.
  • Участие в доступном объёме. Лимит: максимальная доля участия. Нарушение: раздробить или отменить заявку.
  • Дневной или недельный убыток. Лимит: предельный убыток. Нарушение: остановить торговлю до разбора.
  • Просадка от максимума капитала. Лимит: пороги снижения и остановки. Нарушение: уменьшить размер или включить аварийную остановку.
  • Возраст данных. Лимит: максимальная задержка. Нарушение: запретить торговлю.
  • Расхождение локальной и брокерской позиции. Лимит: допустимое расхождение. Нарушение: отменить заявки и провести сверку.
  • Отклонение проскальзывания и доли исполненных заявок. Лимит: контрольный диапазон. Нарушение: вернуться на предыдущий этап.

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

Условия перехода между этапами

Paper trading проверяет временные метки, генерацию сигналов, жизненный цикл заявки, отклонения, отмены и сверку локальной позиции с брокерской моделью. Он не измеряет собственное влияние на рынок и не гарантирует реальные исполнения.

Малый live-объём проверяет фактические комиссии, долю исполненных заявок, задержку, проскальзывание и поведение инфраструктуры на минимальном заранее ограниченном объёме. До запуска задаются период или минимальный объём наблюдений, допустимые отклонения и условия остановки.

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

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

Копируемый манифест эксперимента

experiment_id:
hypothesis_version:
code_version:
data_snapshot:
point_in_time_policy:
universe_policy:
benchmark:
train_period:
validation_scheme:
locked_holdout:
label_or_position_horizon:
purge_embargo_rule:
parameter_families_tested:
selection_rule:
multiple_testing_adjustment:
execution_contract:
  signal_timestamp:
  latency:
  order_types:
  intrabar_policy:
  volume_participation_cap:
  spread_model:
  slippage_model:
  partial_fill_policy:
cost_scenarios:
  base:
  adverse:
  severe:
acceptance_card:
  primary_metric:
  uncertainty_method:
  minimum_effective_sample:
  net_edge_threshold:
  max_drawdown:
  max_recovery_time:
  concentration_limit:
  reject_rule:
risk_limits:
forward_promotion_gates:
artifacts:
reviewer:
decision:

Манифест (manifest) не исправляет плохую методологию автоматически. Он делает решения наблюдаемыми: другой исследователь может увидеть, что было заморожено, какие варианты участвовали и почему стратегия получила или не получила право на следующий этап.

Когда стратегия заслуживает следующего эксперимента

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

Такая процедура обычно ухудшает картинку. Комиссии снижают результат. Реалистичная задержка пропускает идеальный вход. Учёт всего поиска уменьшает статистическую уверенность. Контрольный период может закрыть проект.

Это полезное ухудшение: оно происходит до риска реальными деньгами.

Где здесь XTester

В XTester можно запускать стратегии на исторических данных и разбирать результат по метрикам. Но сам запуск не определяет за исследователя корректность point-in-time данных, число независимых гипотез, калибровку исполнения или допустимый риск. Чтобы результат можно было проверить и повторить, manifest выше следует сохранять рядом с артефактами запуска.

Если после всех ворот стратегия сохранила заранее определённый запас прочности, вывод остаётся ограниченным: она заслуживает forward validation. Не доверия на будущее, а права на следующий эксперимент.

Источники

  1. Bailey, D. H., López de Prado, M. The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting, and Non-Normality. Journal of Portfolio Management, 2014.
  2. Harvey, C. R., Liu, Y., Zhu, H. …and the Cross-Section of Expected Returns. Review of Financial Studies, 2016.
  3. Wiecki, T., Campbell, A., Lent, J., Stauth, J. All That Glitters Is Not Gold: Comparing Backtest and Out-of-Sample Performance on a Large Cohort of Trading Algorithms. Journal of Investing, 2016.
  4. White, H. A Reality Check for Data Snooping. Econometrica, 2000.
  5. Kaufman, S., Rosset, S., Perlich, C., Stitelman, O. Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM TKDD, 2012.
  6. Brown, S. J., Goetzmann, W. N., Ibbotson, R. G., Ross, S. A. Survivorship Bias in Performance Studies. Review of Financial Studies, 1992.
  7. Korajczyk, R. A., Sadka, R. Are Momentum Profits Robust to Trading Costs?. Journal of Finance, 2004.
  8. Arnott, R., Harvey, C. R., Markowitz, H. A Backtesting Protocol in the Era of Machine Learning. Journal of Financial Data Science, 2019.
  9. Federal Reserve & OCC. Supervisory Guidance on Model Risk Management (SR 11-7), 2011.
  10. scikit-learn. Common pitfalls and recommended practices: Data leakage.
  11. López de Prado, M. Advances in Financial Machine Learning. Wiley, 2018, глава 7 «Cross-Validation in Finance». ISBN 978-1-119-48208-6.
  12. NautilusTrader. Fill Models — официальная документация о допущениях исторического исполнения.

Материал посвящён методологии исследования и не является инвестиционной рекомендацией.