Почему оптимизация торговой стратегии ломается на реальных данных
Подбор параметров на истории почти всегда даёт красивую кривую: на графике прошлых лет стратегия уверенно растёт, а на живом счёте тот же код ведёт себя иначе. Причина в том, что оптимизация торговой стратегии подбирает значения под конкретный отрезок прошлого, а не под механику рынка — при переобучении на истории параметры кодируют шум, которого больше не будет.
Первый источник ошибки — качество исторических данных. В архивах встречаются пропуски на резких движениях, цены по последней сделке вместо реальной глубины стакана, делистингованные пары просто отсутствуют — и на такой выборке тестируется стратегия, которая в реальности торговала бы по другому инструменту.
Вторая потеря — исполнение. Проскальзывание сделок и комиссии съедают часть прибыли, если считать по цене сигнала, а не по фактической цене сделки. Расхождение по времени исполнения добавляет разрыв между моментом появления сигнала и постановкой заявки: пока данные доходят до исполнителя, цена успевает уйти, и часть сделок закрывается хуже расчётной.
В сумме получается разрыв между историей и реальностью: отобранные параметры не переносятся на новые условия, объём выборки маскирует переобучение, а расхождение по времени исполнения делает результаты невоспроизводимыми. Разбираем, как это закрывается.
Что меняется в работе: просадка, отклик, устойчивость
Перебор параметров ведём не вручную, а через Optuna: одинаковый набор данных, фиксированное зерно генератора, один и тот же способ расчёта результата. Иначе прогоны несопоставимы, и настройка превращается в подгонку под один удачный отрезок истории.
- Снижение просадки. Максимальная просадка сокращается, но важнее второе — сжимается время восстановления: счёт возвращается к прежним максимумам за дни, а не недели.
- Время отклика на рынок. При смене режима — скачке волатильности или сужении разницы между ценами покупки и продажи — параметры берутся из уже проверенной области и пересчитываются за минуты, а не подбираются заново.
- Устойчивость торговой логики. Проверяем на отложенном отрезке и на нескольких режимах рынка: логика, которая держит результат вне выборки, не рассыпается на первой нестандартной неделе.
- Контроль риска на сделку. Риск задан долей от капитала, объём позиции считается от текущей волатильности — серия из восьми убыточных сделок подряд перестаёт выбивать из допустимого уровня.
- Исполнение и разрывы данных. Доля отменённых и неисполненных заявок падает — вход учитывает ликвидность, а не только сигнал. Пропуск свечей или перезапуск сервиса не ломает состояние: позиция восстанавливается из последнего снимка, дубли не открываются.
Каждый пункт измеряем до и после на одном и том же наборе данных, поэтому в отчёте видно, какая именно правка дала сдвиг.
Режимы настройки стратегии: сравнение подходов
Режим настройки определяет, откуда берутся значения параметров стратегии и как быстро они меняются. На практике выбирают между тремя контурами: полный прогон по архиву сделок, подстройка прямо в живом режиме и комбинация обоих. Сравниваем их по трём вещам — сколько занимает пересчёт, как ведёт себя результат на отложенном участке истории и что происходит при смене режима рынка.
| Вариант | Когда подходит | Ограничения |
|---|---|---|
| Подбор параметров на истории | Повторяющиеся режимы рынка, есть длинный архив сделок и запас времени на прогон | Подгонка под прошлые данные: набор держится, пока статистика рынка не сместилась. Разовый пересчёт — и снова нужен новый прогон |
| Адаптивная подстройка в живом режиме | Режимы меняются часто, горизонт удержания позиции короткий | Реакция на шум и «дребезг» параметров, рост числа сделок и издержек. Ошибка в правиле пересчёта тиражируется на весь поток |
| Гибридный контур исполнения | Длинный горизонт: нужна и устойчивость базового набора, и отклик на смену режима | Сложнее в сопровождении: требуются коридоры дрейфа, журнал изменений и точка возврата к предыдущему набору |
Границы задаём явно: история даёт базовые значения и коридор, внутри которого живому контуру разрешено двигать параметры, а выход за границу останавливает торговлю до ручного разбора. Пересчёт делаем по расписанию, а не по каждому тику.
Этапы внедрения: от аудита данных до передачи
Порядок работ одинаков и для стратегии, которую только собирают на исторических данных, и для уже работающей системы: сначала убеждаемся, что данные описывают реальность, затем — что модель исполнения заявок ей соответствует, и только после этого выпускаем в работу.
- Аудит журналов сделок. Сверяем выгрузки с отчётами площадки по времени, объёму, цене, комиссиям и частичным исполнениям, убираем дубликаты и разрывы, восстанавливаем пропущенные интервалы. Итог — набор данных, расхождение по которому с брокерским отчётом объяснимо и воспроизводимо.
- Реконструкция схемы исполнения заявок. Описываем, как ордер попадал в стакан, где возникало проскальзывание, как обрабатывались отказы и сколько времени проходило от сигнала до сделки. Без этого результат на истории не переносится на живой счёт.
- Формализация правил стратегии. Вход, выход, размер позиции, лимиты риска и условия остановки фиксируем как однозначные правила — их можно проверить построчно, а не «по логике автора».
- Сборка контура проверки. Одни и те же данные, издержки и код для всех прогонов: версионируем наборы и параметры, чтобы любой результат воспроизводился повторно.
- Подбор параметров на обучающем отрезке с ограничением числа перебираемых комбинаций — иначе выбранные значения описывают шум, а не закономерность.
- Проверка на независимом отрезке. Данные не участвуют в подборе; дополнительно проверяем устойчивость со смещением окна и при повышенных издержках. Стратегия, которая держится только на одном интервале, в работу не идёт.
- Вывод в эксплуатацию и передача. Настраиваем контроль риска, журналирование и уведомления об отклонениях, прописываем регламент остановки, передаём команде заказчика документацию и конфигурации и сопровождаем первые рабочие прогоны.
Пакет передачи: конфигурации, политики, регламенты
Работа заканчивается не отчётом, а набором артефактов, с которыми команда заказчика дальше живёт сама. Конфигурация торгового контура хранится в репозитории с контролем версий, изменения проходят проверку, а не правятся руками на сервере — поэтому любую версию стратегии можно развернуть повторно и получить сопоставимый результат на том же историческом отрезке.
- Конфигурация торгового контура: точки подключения к бирже, рабочие интервалы, список инструментов, лимиты на объём позиции и число одновременных заявок.
- Политики доступа к биржевым ключам: торговые ключи без права вывода средств, отдельный контур только на чтение для сбора данных, срок жизни ключа и порядок ротации.
- Правила распределения риска: максимальная доля капитала на позицию, дневной и недельный стоп, поведение системы при разрыве связи с биржей.
- Регламент пересмотра параметров: что проверяем по расписанию, а что — по триггеру (просадка глубже расчётной, смена режима волатильности), кто принимает решение и где оно фиксируется.
- Документация по стратегии: логика входа и выхода, перечень параметров с допустимыми границами, известные ограничения и условия вывода стратегии из работы.
- Журналы измерений: сохранённые прогоны на исторических отрезках, метрики до и после смены параметров, отметка о том, какая версия конфигурации стояла в рабочем режиме.
Такой пакет позволяет передать сопровождение другой команде или вернуться к стратегии спустя месяцы — без разбора логов и восстановления логики по памяти.
Кейс: просадка втрое меньше при том же обороте
Что было до
Заказчик торговал по набору правил, который жил в заметках: вход по ощущению «назревает движение», стоп переносился вручную, если цена «должна развернуться», удержание позиции ничем не ограничивалось. На истории это давало максимальную просадку 26%, но отдельные месяцы закрывались в плюс — слабое место не выглядело проблемой. Повторить результат второй раз было нельзя: причины входов не фиксировались, а ручные правки на живом счёте расходились с тестовым прогоном.
Что изменили
Вход формализовали: сигнал принимается после закрытия бара и подтверждения старшего таймфрейма, а не по касанию уровня. Перенос стопа заменили трейлингом по волатильности — множитель подбирался по разбросу цены, а не по желанию сохранить позицию. Удержание ограничили горизонтом: если движение не подтверждается за заданное число баров, позиция закрывается по правилу, а не по настроению.
Чем подтверждено
Каждый прогон считался в Backtrader и попадал в журнал измерений: набор параметров, дата, просадка, профит-фактор, число сделок, доля выходов по стоп-правилу. Обучающий и удержанный отрезки делили заранее, поэтому подгонка под историю отсеивалась сразу. Просадка снизилась с 26% до 9% при том же обороте, профит-фактор вырос с 1.1 до 1.4, около 40% сигналов отсекает фильтр входа. Ручные вмешательства убраны, а пересмотр набора после смены режима рынка занимает часы вместо дней.
Чем проверка на истории отличается от реального времени?
Архивный расчёт идёт по уже закрытым свечам: цена сделки известна заранее, заявка исполняется мгновенно и целиком. В живой торговле между сигналом и сделкой проходит время, цена успевает уйти, а часть объёма остаётся неисполненной. Отсюда и берётся расхождение архива и живой торговли — и почти всегда оно складывается не в пользу стратегии.
Первый источник — задержка исполнения. Она складывается из участков: расчёт сигнала, отправка заявки, постановка в очередь, подтверждение сделки. На спокойном рынке эти доли секунды незаметны, но на резком движении отрыв фактической цены от расчётной становится систематическим, а не случайной помехой — модель раз за разом входит хуже, чем предполагала.
Второй источник — комиссии и проскальзывание. Комиссия биржи списывается с каждой сделки и в архивном расчёте часто просто не заложена. Проскальзывание зависит от глубины стакана: крупная заявка сама сдвигает цену, и на тонком рынке фактическая цена сделки заметно хуже той, по которой модель «совершила» сделку на графике.
Контроль расхождения ставится до вывода стратегии в работу, а не после. Модель прогоняется с теми же ограничениями, что и живой контур: задержка, комиссия, предел объёма одной заявки, отмена неисполненного остатка. Затем журнал живых сделок сверяется с архивным прогоном на том же интервале — считаем долю исполненных заявок, средний отрыв цены сделки от расчётной и разницу итогового результата.
Пока расхождение укладывается в допуск, стратегия работает ограниченным объёмом и допуск проверяется повторно. Если он нарушен, пересчитываются параметры и правила входа, а не «подкручивается» история под нужный результат.
Ограничения и риски: данные, комиссии, проскальзывание
Формально стратегия может показывать устойчивый результат на истории, но на реальную торговлю это переносится не автоматически. Архивы площадок содержат пропуски: часы простоя, обрывы потока сделок, разные интервалы свечей на одном инструменте. Если логика завязана на объём и число сделок, такие дыры искажают проверку — она видит ликвидность, которой в тот момент не было.
Второе ограничение — изменчивость условий самой площадки: тарифы, минимальный шаг цены, правила округления и отмены заявок меняются, и прошлая конфигурация теряет смысл. На тонких парах добавляется проскальзывание: заявка исполняется по цене хуже ожидаемой, а широкая разница между покупкой и продажей съедает часть прибыли ещё до входа в позицию. И ни один прогон на истории не гарантирует доходности — это проверка гипотезы, а не обещание результата.
Как понять, что стратегия переобучена на историю?
Признак — результат резко падает при небольшом сдвиге параметров или на соседнем интервале свечей. Проверяем на отрезке, который не участвовал в подборе, и смотрим на разброс, а не на лучший прогон.
Что делать с пропусками в архиве площадки?
Помечаем их как разрыв и не заполняем выдуманными значениями — иначе проверка посчитает несуществующие сделки. На участках с обрывами стратегия не оценивается, а итог считаем по покрытой доле периода.
Обсудим задачу: что прислать и как мы вернёмся с планом
Чтобы оптимизация параметров торговой стратегии дала воспроизводимый результат, а не подгонку под прошлое, нужны исходные данные для расчёта. Ниже — минимальный набор, покрывающий большинство задач; если чего-то нет, скажите сразу — подскажем, чем заменить.
- Правила входа и выхода в текущей редакции: индикаторы, условия срабатывания, логика стопов и фиксации прибыли.
- Архив сделок за период: выгрузка из терминала или с биржи в машиночитаемом виде, с метками времени и объёмом позиции.
- Ограничения по риску: допустимая просадка, максимальная доля депозита в одной позиции, лимит на число сделок.
- Перечень площадок и инструментов: спотовый или срочный рынок, доступные пары, глубина исторических данных.
- Требования к исполнению: ручной запуск, сигналы или автоматическая торговля, допустимая задержка реакции.
- Критерий успеха: метрики, по которым вы принимаете результат — отношение доходности к просадке, доля прибыльных сделок, устойчивость вне обучающей выборки.
Дальше порядок сотрудничества простой: разбираем присланное, проверяем полноту истории и корректность разметки сделок, при необходимости возвращаем список уточнений. Затем готовим оценку и план работ — этапы, что проверяем на каждом, какие метрики фиксируем как критерий приёмки.
Опишите задачу в свободной форме и приложите то, что есть под рукой, — вернёмся с оценкой и планом работ и сразу скажем, каких данных не хватает.







