Прогрев индикаторов в бэктесте: почему начало истории меняет сигналы

Вы добавили к истории несколько дней, не меняли стратегию, а вход на прежнем участке сдвинулся. Причиной может быть прогрев индикатора: новые старые свечи изменили его начальное состояние. Проверять это нужно на одном торговом окне. Если просто начать торговать раньше, к спорному моменту изменятся ещё и позиция, капитал, активные заявки.
Ниже разберём непрерывную историю без пропусков. Если в данных есть разрывы, сначала нужна отдельная проверка пропусков свечей.
Почему период EMA не равен длине прогрева
Прогрев индикатора в бэктесте означает обработку прошлых данных до начала оцениваемых решений. Получить первое число недостаточно: оно ещё может заметно зависеть от места, где начался расчёт.
У EMA новое значение складывается из текущей цены и предыдущего значения индикатора:
EMA[t] = alpha × Close[t] + (1 − alpha) × EMA[t−1], где alpha = 2 / (N + 1).
Нужно определить и первое значение, или seed. В нашем примере это первая доступная цена закрытия. Другая библиотека может начинать со среднего нескольких цен; одинаковое название EMA само по себе не гарантирует одинаковой инициализации.
Если два расчёта затем получают одинаковые цены, разница их EMA после каждого обновления умножается на 1 − alpha. Она уменьшается, но небольшой остаток всё ещё способен изменить условие возле порога. У RSI и других рекурсивных индикаторов проверяйте конкретную реализацию: число в названии не задаёт универсальный достаточный прогрев.
Учебный пример: те же свечи, другой первый вход
Возьмём синтетические часовые закрытия за 1 января 2026 года. Свечи с открытием в 00:00–05:00 UTC закрываются по 80, в 06:00 и 07:00 по 100. Четыре свечи торгового окна, открывающиеся в 08:00–11:00, закрываются по 99, 101, 98 и 102. Цены условные, не биржевые.
Считаем EMA(3), alpha = 0,5. В одном расчёте доступны две свечи предыстории, в другом восемь; первая свеча, задающая seed, входит в это число. Перед окном EMA равны 100 и 95. Предыстория обновляет только индикатор: торговые решения там запрещены.
В обоих вариантах окно одинаковое: открытия свечей от 08:00 включительно до 12:00 исключительно. Решения принимаются по их закрытиям в 09:00–12:00. На старте нет позиции, заявок и периода ожидания после сделки. Правило простое: после обновления EMA, если Close выше неё и позиции нет, записать «вход»; если ниже и позиция есть, записать «выход»; при равенстве ничего не менять.
| Закрытие, UTC | Close | EMA: 2 свечи | EMA: 8 свечей | Решение: 2 / 8 |
|---|---|---|---|---|
| 09:00 | 99 | 99,5 | 97 | ждать / вход |
| 10:00 | 101 | 100,25 | 99 | вход / держать |
| 11:00 | 98 | 99,125 | 98,5 | выход / выход |
| 12:00 | 102 | 100,5625 | 100,25 | вход / вход |
Это расчёт решений в Python, не запуск XTester и не модель исполнения сделок. Состояние «есть позиция» меняется условно в момент решения; цены исполнения, размер, баланс, комиссии и прибыль не рассчитываются. Полный ряд и код приложены к материалу для проверки.
Код и данные учебного примера (ZIP)
Первое расхождение возникает в 09:00: цена 99 находится между двумя значениями EMA. В 10:00 оба расчёта видят Close выше EMA, но действуют по-разному, потому что один уже записал вход. Расходятся два действия из четырёх. К последней точке разница EMA сократилась с 2,5 до 0,3125, однако раннее различие никуда не исчезло из журнала.
Дополнительный запуск с четырьмя свечами предыстории совпал с восьмисвечным. Здесь это следствие постоянных ранних цен, а не рекомендация прогревать любой индикатор четырьмя свечами.
Как проверить прогрев, не подбирая прибыль
Зафиксируйте код, библиотеку индикатора, seed, источник цен, инструмент, таймфрейм и одно окно оценки. Выберите несколько длин предыстории заранее. Во всех прогонах оставьте одинаковыми стартовые средства, отсутствие позиции и заявок, счётчики и другие торговые переменные. Состояние индикатора не обнуляйте на границе: именно его чувствительность проверяется. Торговать во время прогрева нельзя.
Сопоставьте строки по одному timestamp: цена, значения индикаторов, состояние перед решением и само решение. Отдельно сравните максимальное численное отклонение на всём окне и первое несовпавшее действие. Если используете допуск, задайте его до просмотра результата и в понятных единицах. Даже небольшая разница может пересечь торговый порог.
Recursive analysis в Freqtrade решает близкую задачу: сравнивает индикаторы при разной предыстории. Документация прямо ограничивает сравнение последней строкой и не оценивает влияние на входы и выходы. Для нашей проверки поэтому важен весь журнал решений, а не только близость финальных значений.
Совпадение на выбранном участке означает лишь, что в этом эксперименте различий не обнаружено. Проверьте другие заранее выбранные окна. Не выбирайте прогрев по лучшей прибыли: это уже настройка по результату. Разделение разработки и оценки разобрано отдельно в статье про walk-forward и out-of-sample.
С чего начать в XTester
Сверьте период и стартовые средства со справкой по симуляции. Затем добавьте в код своей стратегии журнал значений и решений, отделив обработку предыстории от торгового окна. Это метод диагностики, а не описание готовой кнопки автоматической проверки прогрева в XTester. Способ реализации нужно сверять с API установленной версии.
Если вы ещё не проверяли загрузку истории и журнал, начните с первого проверочного бэктеста. После этого сохраните два сопоставимых запуска и разберите первое несовпадение. Оно покажет, изменился ли сам пороговый сигнал или уже сработало последствие более раннего решения.
Материал учебный, не инвестиционная рекомендация. Устранение зависимости от прогрева не доказывает прибыльность или безопасность стратегии; в реальной торговле возможна потеря средств.
Материал носит информационный характер и не является инвестиционной рекомендацией. Результаты бэктеста не гарантируют будущую доходность.



