Кальтер / Блог

Бэктест торговой стратегии: как распознать красивую подгонку

Проверь реалистичность бэктеста: найди look-ahead, пропущенные расходы и подгонку, а затем проверь параметры на отдельном периоде.

Материал подготовлен с помощью ИИ; источники и расчёты проверены редакцией ZASLON.

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

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

TradingView определяет backtesting как проверку на исторических данных и forward testing как проверку в реальном времени. В отдельной статье TradingView описывает look-ahead bias: стратегия может использовать сведения о будущих барах, недоступные в реальном исполнении. Это способно создать нереалистично хорошие результаты в бэктесте.

Пять источников ложного оптимизма

Подглядывание в будущее. Сигнал на свече использует её окончательный high/low до того, как свеча закрылась. В реальном времени эта информация ещё неизвестна. Проверь момент доступности данных и настройки индикаторов.

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

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

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

Неподходящая выборка. Одна фаза рынка не описывает все режимы. Раздели данные хронологически на разработку, проверку и out-of-sample; не выбирай периоды после просмотра результата.

Минипример подгонки

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

Проверка Вопрос
Временная причинность Было ли каждое значение доступно в момент решения?
Исполнение Учитывались ли спред, задержка, частичное исполнение?
Издержки Включены ли комиссии и funding?
Подбор Сколько вариантов пробовали до выбора лучшего?
Проверка вне выборки Были ли параметры зафиксированы до тестового периода?
Переносимость Меняется ли результат при небольших сдвигах параметров?

Что делать после исторического теста

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

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

Простой протокол проверки

Сначала зафиксируй код/правила и источник данных. Затем создай хронологическое разделение: участок настройки, участок проверки и отложенный период. Не смотри результат последнего периода до фиксации параметров. Если использовал его для настройки, он уже не является независимым out-of-sample.

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

В документации TradingView о подглядывании в будущее отдельно отмечены особенности японских графиков вроде Renko/Kagi: исторический движок может моделировать цены, которых не было в реальном времени. При использовании нестандартных типов графиков отдельно изучи ограничения движка. Для защиты от lookahead проверь временные индексы и значения, доступные только после закрытия бара.

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

Пример утечки данных без сложного кода

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

Другой риск — использовать данные старшего таймфрейма до его закрытия. Значение недельной свечи меняется в течение недели; финальный high/close нельзя считать известным в понедельник. Проверь, что стратегия использует только завершённые значения на момент решения. TradingView отдельно показывает корректное смещение к уже закрытым барам для некоторых запросов; не своди предупреждение к запрету на конкретный параметр без анализа контекста.

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