backtesting.py: обзор для тех, кто кодит
backtesting.py — популярная Python-библиотека для тестирования стратегий кодом. Разбираем, кому она подходит и на что смотреть.
Бэктест честен ровно настолько, насколько честны данные и метод. Здесь — про качество котировок, тестеры стратегий и ловушки переоптимизации, из-за которых красивый результат на истории не повторяется в реальности.
backtesting.py — популярная Python-библиотека для тестирования стратегий кодом. Разбираем, кому она подходит и на что смотреть.
Бэктест — это проверка торговой стратегии на исторических данных. Разбираем, что это и зачем нужно. Бэктест смотрит в прошлое; будущее проверяет форвард-тест.
Правильный бэктест отличается от неправильного методикой и честностью, а вовсе не выбором инструмента. Разбираем метрики и ошибки.
Инструмент для бэктеста определяет, насколько честной будет проверка стратегии. Плохой инструмент или плохие данные дадут красивый, но лживый результат.
Out-of-sample и walk-forward — два метода, которые превращают бэктест из самообмана в честную проверку. Разбираем простыми словами.
Переоптимизация (кривая подгонка) — самый коварный самообман в бэктесте: вы честно работаете, а в итоге настраиваете стратегию на шум прошлого.
Красивая кривая бэктеста — самый частый повод переоценить стратегию. Между идеальным прошлым и прибыльным будущим лежит несколько причин расхождения.
Тестер MetaTrader — встроенный и бесплатный, внешние решения (Python-библиотеки, специализированные платформы) — гибче, но требуют навыков.
Раздел про проверку стратегий на истории. Начните с материалов о том, почему красивый бэктест не превращается в прибыль, и о переоптимизации: они описывают механизм, из-за которого подобранные под прошлое параметры выглядят закономерностью. Дальше — про чтение отчёта тестера: порядок, в котором смотрят цифры, экономит основное время.
Второй блок — про методику: разделение выборки, последовательные окна с перенастройкой, проверка устойчивости к сдвигу параметров. Это единственные способы отличить найденную закономерность от совпадения, и все три реализуются встроенными средствами терминала без дополнительных подписок.
Третий блок — про инструменты: встроенный тестер против внешних платформ, мультивалютное тестирование, качество исторических данных. Сами решения с характеристиками собраны в каталоге тестеров.
Тест на чужих котировках, с пропусками или с низким качеством моделирования даёт цифры, не относящиеся к вашему счёту. Прежде чем читать итог, смотрят период, источник данных и процент моделирования — при низком качестве остальные показатели недостоверны независимо от их привлекательности.
Спред в настройках теста обычно фиксированный и меньше реального, комиссия часто не задана, проскальзывание отсутствует вовсе. Подстановка реальных чисел занимает минуту и часто превращает прибыльную систему в убыточную — что и есть полезный результат, полученный до потери денег.
Настройка на всей истории всегда даёт красивый результат и ничего не сообщает о будущем. Минимум — разделить историю и не открывать вторую часть до проверки. Строже — последовательные окна с перенастройкой, где итог собирается только из проверочных отрезков.
Работающая закономерность даёт широкую область приемлемых настроек, подгонка — одинокий пик среди плохих результатов. Сдвиньте параметры на десять процентов в обе стороны: если результат рушится, найдена особенность истории. Число проверенных комбинаций тоже стоит помнить при оценке итога.
Инструменты делят общую маржу и коррелируют между собой, поэтому прогон по отдельности не показывает реального поведения. Отдельно считается требуемая маржа при максимальном числе одновременных позиций: нередко теоретический предел системы недостижим на вашем депозите.
Перебрав тысячи комбинаций, вы почти гарантированно найдёте идеально описывающую прошлое. Защита — ограничить число параметров тремя-четырьмя, задать достаточный результат заранее и остановиться при его достижении, проверяя плато вместо пика.
Тридцать сделок случайны независимо от вида кривой, а период с одним режимом рынка проверяет только благоприятные условия. Минимально осмысленный тест содержит несколько сотен сделок и включает резкие однонаправленные движения.
Через несколько месяцев воспроизвести прогон по памяти не получится, и сравнивать новый вариант будет не с чем. Настройки сохраняются вместе с результатом — это дешевле, чем повторять всю работу.
Тест отвечает на вопрос, была ли закономерность в прошлом, а не сохранится ли она. Второй вопрос решается только эксплуатацией, поэтому запуск идёт с уменьшенным объёмом и параллельным учётом. Каждый день фактические сделки сравниваются с тем, что дал бы тест на тех же данных: количество, цены входа, срабатывания стопов.
Расхождение в числе сделок обычно означает разницу в исполнении, расхождение в ценах — проскальзывание, которого в тесте не было. Заранее задаётся порог допустимого расхождения и правило остановки при его превышении: без порога расхождения объясняются по одному, и остановка не происходит никогда. Три недели такого сравнения информативнее любых дополнительных прогонов на истории.
Первая — прогон на данных вашего брокера с реальными издержками. Спред в настройках теста по умолчанию фиксированный и обычно меньше фактического, комиссия часто не задана вовсе, а проскальзывание отсутствует. Подстановка своих чисел занимает минуту и нередко превращает прибыльную кривую в убыточную. Это и есть полезный результат: он получен до того, как деньги потеряны.
Вторая — число сделок. Выборка меньше нескольких сотен случайна независимо от того, как выглядит кривая доходности. Третья — разделение выборки: параметры настраиваются на одной части истории, проверяются на другой, которую вы не открывали до этого момента. Подглядывание во вторую часть с последующей незаметной подстройкой лишает проверку смысла, и это самое частое нарушение методики.
Четвёртая — устойчивость. Сдвиньте параметры на десять процентов в обе стороны: если результат рушится, найдена особенность истории, а не закономерность. Работающее правило даёт широкую область приемлемых настроек. Пятая — сравнение с элементарным правилом на тех же данных: если сложная система не превосходит простое, сложность не оплачивается и лишь увеличивает число способов ошибиться.
Шестая — период, включающий разные режимы рынка: спокойный, трендовый и резкое однонаправленное движение. Система, показанная только на благоприятном отрезке, остаётся непроверенной. Идея, прошедшая все шесть шагов, заслуживает запуска с уменьшенным объёмом — но не раньше, потому что каждый пропущенный шаг проявляется уже на реальном счёте и стоит дороже вечера работы.
Отдельно стоит записывать число проверенных комбинаций. Перебрав тысячи вариантов, вы почти гарантированно найдёте красивый среди случайных, и об этом полезно помнить при оценке итога. Разумное ограничение — три-четыре настраиваемых параметра и заранее заданный порог достаточного результата, при достижении которого оптимизация прекращается.
Первый разрыв — между данными теста и данными вашего счёта. Котировки поставщика исторических данных и котировки брокера отличаются, а моменты расширения спреда в истории обычно не отражены вовсе. Стратегия, показавшая преимущество на чужих данных, остаётся непроверенной на ваших, и разница тем заметнее, чем меньше целевое движение сделки.
Второй разрыв — между настройкой и проверкой. Как только вы посмотрели на отложенную часть истории и после этого что-то изменили в параметрах, отложенная выборка перестала быть независимой. Формально проверка выполнена, фактически нет. Это нарушение не оставляет следов в отчёте и обнаруживается только на реальном счёте, поэтому дисциплина здесь важнее любого инструмента.
Третий разрыв — между числом проверенных вариантов и итоговым результатом. Если перебрано несколько тысяч комбинаций, лучший из них будет выглядеть убедительно даже на случайных данных. Полезная привычка — записывать, сколько вариантов проверено, и оценивать итог с поправкой на это число. Три-четыре параметра и заранее заданный порог достаточности решают проблему на входе.
Четвёртый — между тестом и эксплуатацией. Тест отвечает на вопрос, была ли закономерность в прошлом; сохранится ли она, показывает только работа с уменьшенным объёмом и заранее заданным правилом остановки. Поэтому дополнительный прогон на истории почти никогда не даёт новой информации, а три недели реальной торговли дают.
Пятый разрыв — между одиночным и портфельным поведением. Инструменты делят общую маржу и коррелируют между собой, поэтому сумма результатов отдельных прогонов не равна результату портфеля. Требуемая маржа при максимальном числе одновременных позиций считается отдельно: нередко выясняется, что теоретический предел системы недостижим на вашем депозите.
И шестой, самый незаметный, — между кривой и распределением. Ровная линия доходности достигается двумя способами: устойчивым преимуществом и отказом фиксировать убытки. Различить их можно по просадке, измеренной по средствам, и по максимальному использованному объёму. Если оба показателя отсутствуют в отчёте, отчёт не содержит главного.
Практический вывод по разделу: инструмент тестирования вторичен по отношению к методике. Встроенный тестер терминала с правильно заданными издержками и честным разделением выборки даёт более достоверный результат, чем дорогая платформа с параметрами по умолчанию. Начинать имеет смысл с методики, а внешние решения подключать тогда, когда конкретное ограничение стало препятствием.
Сохраняйте настройки каждого прогона вместе с результатом: период, источник данных, издержки, набор параметров, число сделок. Через несколько месяцев воспроизвести тест по памяти уже не получится, а сравнивать новый вариант будет не с чем. Это дешевле, чем повторять всю работу, и обычно занимает меньше минуты.
Бэктест показывает, как правила вели бы себя на прошлых данных, и это единственный способ отличить идею от догадки. Он не показывает будущего, не учитывает реальное проскальзывание и качество данных, а при подгонке параметров создаёт результат, которого на новых данных не будет.
Столько, чтобы в выборку попали разные рыночные режимы — тренд, диапазон, всплеск волатильности — и не меньше сотни сделок. Проверка на полугодовом трендовом отрезке говорит только о том, что стратегия любит тренд, а не о том, что она работает.
Тестер в терминале удобен и бесплатен, но ограничен качеством истории и моделью исполнения. Отдельные сервисы дают тиковые данные, учёт спреда и свопов, стресс-тесты и форвард-анализ. Разница видна именно на коротких таймфреймах, где издержки съедают преимущество.