VIZANIXРазработка торгового ПО
Исследование и проверкаПроверка6 мин чтения

Walk-forward валидация, сделанная правильно

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

Инженеры Vizanix · об авторе

МАТЕРИАЛ
6 минвремя чтения
РАЗДЕЛ
Исследование и проверка
ОПУБЛИКОВАНО
2026-08-31
ГЛАВ
6
ЧИТАТЬ ДАЛЬШЕ
3
ЯЗЫК
написано на русском
Инженерный разбор, а не пересказ документации.
WALK-FORWARDPURGEEMBARGOANCHORED

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

Почему случайное разбиение течёт

По двум причинам, каждой достаточно самой по себе.

Перекрытие меток. Если метка смотрит на час вперёд, у обучающего образца в 10:00 метка покрывает время до 11:00. Валидационный образец в 10:30 делит с ним это окно. Модель видела ответ.

Автокорреляция. Соседние наблюдения — почти дубликаты. Случайное разбиение кладёт почти одинаковые строки и в обучение, и в валидацию, так что модель проверяют на данных, которые она фактически запомнила.

Структура

Обучаться на окне, валидироваться на периоде сразу за ним, затем двигаться вперёд. Между ними — зазор:

python
def walk_forward(index, train_span, test_span, horizon, embargo):
    """Purge под горизонт метки, затем embargo под автокорреляцию."""
    start = 0
    while start + train_span + horizon + embargo + test_span <= len(index):
        train = slice(start, start + train_span)
        gap   = horizon + embargo          # отсюда ничто не попадает в обучение
        test  = slice(start + train_span + gap,
                      start + train_span + gap + test_span)
        yield train, test
        start += test_span                 # непересекающиеся тестовые периоды

Purge задаётся горизонтом метки: убрать любой обучающий образец, чьё окно метки дотягивается до тестового периода. Embargo — дополнительный запас под автокорреляцию, обычно небольшое кратное горизонта.

Якорное или скользящее

Якорное (расширяющееся)Скользящее (фиксированное окно)
Обучающая выборкаРастёт с каждым фолдомПостоянного размера, едет вперёд
ПредполагаетСтарые данные остаются релевантнымиВажен только недавний режим
Хорошо дляМедленных структурных связейСтратегий, чувствительных к режиму
РискРазмывание свежего сигнала устаревшей историейСлишком мало данных на фолд

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

Сколько фолдов

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

Арифметика: общее число сделок, делённое на число фолдов, должно оставлять хотя бы 30 на фолд, лучше больше. Если не оставляет — нужна либо большая история, либо более частая стратегия, либо честный вывод, что это пока нельзя провалидировать; см. когда не надо автоматизировать.

Что сообщать в отчёте

Не среднее по фолдам. Распределение:

  • Результат по каждому фолду, списком. Постоянство важнее среднего.
  • Сколько фолдов были прибыльными. Восемь из десяти — это другое утверждение, чем пять из десяти с двумя крупными выигрышами.
  • Худший фолд. Это ваш реалистичный плохой квартал.
  • Есть ли нисходящий тренд результата по фолдам — это распад, и это важнейшая строка таблицы. См. распад альфы.
  • Стабильность параметров: сдвинулся ли оптимум между фолдами? Блуждающий оптимум означает, что вы подгоняетесь под шум.

Дисциплина, которая делает это работающим

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

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

Статья описывает инженерную практику. Это не инвестиционная рекомендация. Vizanix разрабатывает программное обеспечение и не обещает торговую доходность.

Блог

Читать дальше

Research · 9 мин

Заглядывание в будущее: как автоматический аудит нашёл три настоящие утечки в нашей модели

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

Открытый код · 8 мин

TideGBM: градиентный бустинг, уважающий стрелу времени

Обычный градиентный бустинг считает строки взаимозаменяемыми. Рыночные данные такими не являются. Мы написали библиотеку, где purged-валидация по умолчанию, а заглядывание в будущее — ошибка линтера.

Проверка · 8 мин

Бэктест и paper trading доказывают разные вещи

Бэктест проверяет гипотезу о рынке. Paper trading проверяет вашу программу против реальности. Пропустить любой из них — значит выйти в бой на непроверенном допущении.

Хотите такое у себя?

Мы пишем о том, что строим. Если нужно построить — напишите, разбор бесплатный.

Бриф

Получить оценку проекта

Четыре вопроса и контакт. Предоплата для разговора не нужна — если задача не наша, скажем сразу.

01Что вам нужно
02Биржа
03Рынок
04Стратегия
05Контакты

Проще написать напрямую? Telegram @vx_ceo

Обсудить систему