Ошибка заглядывания в будущее (look-ahead bias) возникает, когда исторический тест использует информацию, недоступную в момент, когда произошли бы смоделированные решение или ордер. Правило может быть простым, а код — выполняться без ошибок, но результат всё равно опирается на будущую информацию. Полезная проверка задаёт по каждому входному значению три вопроса: когда это значение впервые стало известно, когда правило его оценило и какая более поздняя цена использовалась для смоделированного действия.
Закрытие свечи известно только после её завершения
Каждый бар OHLC описывает интервал. Его итоговые максимум, минимум, закрытие и объём не являются полными на момент открытия бара. Если правило пробоя зависит от завершённого закрытия часовой свечи, тест не должен входить на более раннем открытии той же свечи. Причинно-корректный пример оценивает закрытие, когда бар завершён, и моделирует решение или вход по более поздней доступной цене, например по открытию следующего бара, — при условии, что эта условность явно обозначена как модель. Что касается особенностей работы кода, документация TradingView по состояниям и времени бара в Pine Script различает подтверждённые бары и формирующийся бар в реальном времени; эти детали языка не доказывают, что биржевой ордер исполнится по цене открытия следующего бара.
Не следует считать гарантированным исполнение и по открытию следующего бара. Гэп может пересечь уровень, спред может быть значительным, ордер может быть отклонён или исполнен частично, а реальный стакан может быть неизвестен. Исправление тайминга информации устраняет одну ошибку, но не создаёт доказательств реалистичного исполнения.
Разобранный пример: значение старшего таймфрейма приходит позже
Предположим, часовое исследование использует закрытие четырёхчасовой свечи и проверяет правило «действовать, когда четырёхчасовое закрытие выше $100». Четырёхчасовой бар начинается в 08:00 UTC. Последнее подтверждённое четырёхчасовое закрытие — $98; текущий бар в итоге закрывается на $104 в 12:00. Итоговое значение $104 не было известно в 09:00, однако исторический вызов request.security() с barmerge.lookahead_on без смещения может поместить это итоговое значение на первые часовые бары внутри четырёхчасового окна. Поэтому бэктест может показать, что условие выполнялось ещё до полудня. В живых данных текущее четырёхчасовое закрытие ещё формируется; оно может двигаться выше и ниже $100, прежде чем подтвердится. TradingView описывает и эту историческую утечку из будущего, и схему работы с подтверждёнными значениями с использованием смещения на один бар при lookahead_on. Эта схема намеренно использует предыдущее завершённое четырёхчасовое значение; она не делает итоговую цену закрытия текущего бара доступной заранее.
В этом примере $98 остаётся подтверждённым входным значением на протяжении интервала 08:00–12:00. Если же правило вместо этого ждёт завершённого закрытия $104, проставьте отметку времени решения на 12:00 или позже и смоделируйте ордер по следующей допустимой цене. Эмулятор брокера TradingView использует собственные допущения об историческом исполнении, в том числе по умолчанию условность следующего тика; ни эта условность, ни безупречный график не гарантируют исполнения на реальной площадке. Даты и цены выше вымышлены и лишь демонстрируют тайминг информации.
Проследите каждое входное значение во времени
Составьте таблицу полей правила: значения индикаторов, скользящий максимум или минимум, зафиксированное значение ставки финансирования, метка рыночного режима, объём и любое внешнее событие. Для каждого из них зафиксируйте отметку времени, момент финализации и источник. Проверьте, не включают ли скользящие окна случайно текущий бар, когда они должны описывать предыдущие. Убедитесь, что пересмотренные или скорректированные наборы данных не заменили то, что было бы известно исторически.
Считайте время публикации и время события разными полями. Ставка финансирования может иметь метку интервала, но публиковаться или рассчитываться позже; экономическое уведомление или уведомление биржи может быть пересмотрено; закрытие свечи имеет объявленную границу интервала. Записывайте и отметку времени события, и момент, когда значение стало доступно правилу. Для пивотов, локальных максимумов и минимумов, а также меток, которым для подтверждения нужны более поздние бары, явно сохраняйте задержку подтверждения. Не относите подтверждённую метку задним числом к точке разворота, если только стратегия не могла бы действовать тогда, используя лишь уже полученные данные.
Остерегайтесь меток, созданных с оглядкой на будущее. Пометка свечи как «локального дна» требует более поздних наблюдений, если только правило не предусматривает явную задержку перед подтверждением. Классификация новости, построенная по финальной статье, может содержать формулировки, опубликованные после события. Актуальный список компонентов может не включать активы, которые позже исчезли. Даже фильтр, который звучит описательно, может пропустить будущую информацию, если его расчёт выходит за границу теста.
Изучите, как симуляция обрабатывает каждый бар
Запишите последовательность для каждого наблюдения: расчёт индикаторов, определение сигнала, расчёт соответствующих денежных потоков, оценка открытых позиций, отправка или моделирование ордера, обработка защитных уровней, оценка капитала и сохранение реестра. Порядок имеет значение. Если позиция открывается после расчёта на открытии, с неё не следует списывать средства так, как если бы она была открыта раньше. Если и стоп, и цель срабатывают внутри одной свечи, бары OHLC сами по себе могут не показать, что произошло первым; модели нужна консервативная или явно неопределённая условность.
SuperQuant описывает одну конкретную последовательность: намерение использует предыдущий закрытый бар; существующие позиции получают допустимый расчёт финансирования на открытии нового бара; затем оцениваются допустимые выходы и входы; защитные выходы внутри бара следуют определённой обработке неопределённости. Это ограничивает заглядывание в будущее внутри данного движка, но остаётся упрощённой часовой моделью. Встроенные истории синтетические. При изменениях продукта сверяйтесь с текущей реализацией и методологией.
Небольшой ручной аудит
Возьмите одну записанную сделку и восстановите её, не используя сводный график. Определите бар сигнала и точные данные, известные на момент его закрытия. Пересчитайте индикатор по предыдущим записям. Найдите смоделированную отметку времени входа и убедитесь, что она более поздняя. Затем проследите каждый выход, комиссию и расчёт до события, которое было известно тогда. Сравните свой ручной расчёт с реестром. Разберите любое расхождение, прежде чем интерпретировать результаты.
После этой проверки тайминга оцените выбор параметров отдельно в руководстве по переобучению. Учебник по бэктесту и чек-лист аудита помогают сохранить допущения. Аудит тайминга не может доказать, что стратегия прибыльна или исполнима; он может показать, что тест заведомо не использовал недоступную информацию. Это общеобразовательный исследовательский материал, а не инвестиционная рекомендация.