Walk-forward валидация, сделанная правильно
Случайное разбиение упорядоченных во времени данных даёт красивые бессмысленные результаты. Правильная процедура ненамного сложнее и отличает результат от истории.
Инженеры Vizanix · об авторе
- РАЗДЕЛ
- Исследование и проверка
- ОПУБЛИКОВАНО
- 2026-08-31
- ГЛАВ
- 6
- ЧИТАТЬ ДАЛЬШЕ
- 3
- ЯЗЫК
- написано на русском
Самая частая методологическая ошибка в исследовании стратегий — применение кросс-валидации, придуманной для независимых наблюдений, к данным, которые какие угодно, но не независимые. Чинится легко и меняет результаты драматически — вниз, поэтому и пропускается.
Почему случайное разбиение течёт
По двум причинам, каждой достаточно самой по себе.
Перекрытие меток. Если метка смотрит на час вперёд, у обучающего образца в 10:00 метка покрывает время до 11:00. Валидационный образец в 10:30 делит с ним это окно. Модель видела ответ.
Автокорреляция. Соседние наблюдения — почти дубликаты. Случайное разбиение кладёт почти одинаковые строки и в обучение, и в валидацию, так что модель проверяют на данных, которые она фактически запомнила.
Структура
Обучаться на окне, валидироваться на периоде сразу за ним, затем двигаться вперёд. Между ними — зазор:
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 разрабатывает программное обеспечение и не обещает торговую доходность.