Сделать плохую торговую стратегию красивой на истории не так сложно. Берёте первоначальные правила, смотрите, где они дали убыток, добавляете несколько фильтров, немного двигаете стоп, исключаете неудобный период - и через несколько часов система, которая сначала выглядела посредственно, показывает почти идеальную кривую доходности.
Парадокс в том, что после каждого такого улучшения стратегия действительно становится лучше. Только не обязательно для будущего рынка. Она становится лучше приспособлена к прошлому, которое вы уже видели.
Это и называется подгонкой стратегии под историю, или переоптимизацией.
Как стратегия постепенно учится знать прошлое
Допустим, исходное правило дало сто сделок. Результат положительный, но далеко не впечатляющий. Вы смотрите на убыточные сделки и замечаете, что часть из них была при высокой волатильности. Добавляете фильтр - стало лучше. Потом выясняется, что по понедельникам статистика хуже, и понедельники исключаются. Затем оказывается, что стоп 2,3% исторически немного выгоднее, чем 2%, а вход после 15:30 хуже утреннего.
В итоге появляется система примерно такого вида: входить только во вторник-четверг, при волатильности не выше определённого значения, до конкретного времени, со стопом ровно 2,3% и ещё пятью дополнительными условиями. История выглядит прекрасно.
Только каждое правило появилось после того, как вы уже увидели, где рынок причинил стратегии неприятности. Вы не нашли закономерность заранее - вы постепенно научили систему обходить конкретные прошлые убытки.
В предыдущей статье мы подробно разбирали,
что вообще должен показывать нормальный бэктест. Подгонка начинается как раз тогда, когда тест перестаёт быть проверкой и превращается в бесконечное улучшение уже известного результата.
Почему чем больше настроек, тем проще получить прекрасную статистику
Представим, у стратегии есть всего один параметр - стоп. Вы можете проверить 2%, 3% и 4%. Вариантов немного.
Теперь добавим время входа, размер тейка, волатильность, день недели, направление рынка, минимальный объём и ещё несколько фильтров. Из комбинаций этих параметров уже можно получить тысячи разных стратегий. Какая-нибудь из них почти неизбежно будет выглядеть на конкретном историческом отрезке великолепно просто случайно.
Это похоже на тысячу бросков монеты. Если тысяча человек одновременно начнут подбрасывать монету, у кого-нибудь обязательно получится необычно длинная серия орлов. Но из этого не следует, что именно этот человек научился правильно подбрасывать монету.
С торговыми настройками происходит похожая вещь: чем больше вариантов вы проверили, тем осторожнее нужно относиться к тому варианту, который оказался лучшим.
Оптимизация сама по себе не является ошибкой
Совсем отказываться от настройки стратегии тоже бессмысленно. Предположим, тест показывает, что слишком маленький стоп регулярно закрывает позицию обычным рыночным движением. Логично проверить, как система ведёт себя с более разумным расстоянием. Если инструмент стал намного более
волатильным, параметры риска вообще могут требовать пересмотра.
Разница находится в причине изменения. Если правило меняется потому, что вы можете объяснить его рыночную логику, а затем оно проверяется на большом количестве ситуаций, это нормальная работа над системой.
Если правило звучит примерно как «уберём сделки по средам, потому что без них график доходности красивее», хотелось бы сначала понять, почему рынок вообще должен уважать именно среду.
Хорошее правило должно иметь смысл до того, как вы увидели, сколько денег оно добавило бэктесту.
Очень подозрительна стратегия, которую разрушает маленькое изменение параметров
Допустим, стоп 2,3% показывает замечательный результат. Ставим 2,2% - результат резко хуже. Ставим 2,4% - тоже плохо. Возвращаем 2,3% - снова красота.
Это не обязательно доказывает подгонку, но выглядит подозрительно. Почему именно одна десятая процента должна отделять великолепную систему от посредственной?
У устойчивой логики обычно существует некоторый диапазон параметров, в котором она продолжает вести себя разумно. Результат может становиться лучше или хуже, но не обязан превращаться из огромной прибыли в катастрофу после минимального изменения настройки. То же относится к
размеру позиции, стопам и другим элементам риск-менеджмента.
Если вся привлекательность системы держится на одной идеально подобранной цифре, эту цифру стоит проверить особенно тщательно.
Исключать неудобные периоды тоже очень легко
Стратегия отлично работала с 2020 по 2022 год, а в 2023-м получила сильную просадку. Можно написать: «2023 год был аномальным, поэтому его учитывать не будем». После этого бэктест снова прекрасен.
Иногда исключение периода действительно имеет основания. Например, рынок или сам инструмент объективно изменились так, что старые данные больше несопоставимы.
Но если каждый плохой участок объявлять аномалией уже после того, как он испортил статистику, постепенно в тесте останутся только периоды, удобные для системы. Намного полезнее понять, почему стратегия там перестала зарабатывать. Возможно, она хорошо работает только в тренде и теряет деньги во флэте. Тогда это не повод удалить плохую историю, а важное свойство самой системы.
Можно подогнать даже выбор акций
Представим, вы протестировали стратегию на пятидесяти бумагах. На двадцати она работает отлично, на тридцати - плохо. Очень хочется оставить двадцать хороших и сказать: «Вот наш список подходящих инструментов».
Но откуда вы знаете, какие бумаги окажутся хорошими в следующем году? Если критерий выбора звучит как «берём те акции, на которых стратегия хорошо показала себя раньше», система снова использует знание результата.
Нормальный фильтр должен существовать
до сделки. Например, требования к
ликвидности, доступному объёму или другим измеримым характеристикам рынка можно определить заранее и затем одинаково применять ко всем инструментам.
Отбирать победителей задним числом намного проще, но такой тест почти ничего не говорит о будущей торговле.
Особенно опасно бесконечно улучшать стратегию после каждого убытка
После неудачной сделки возникает естественное желание понять, что было не так. Само по себе это правильно.
Но есть разница между анализом ошибки и попыткой создать правило, которое задним числом запретит именно эту сделку.
Одна убыточная позиция ещё не означает, что система нуждается в изменении. Даже хорошая торговая логика обязана периодически давать стопы. Мы уже разбирали, почему
прибыльная сделка не всегда является хорошим решением; с убытками работает та же логика в обратную сторону.
Если после каждого стопа стратегия получает новый фильтр, через некоторое время она идеально объясняет всю прошлую историю и становится настолько сложной, что повторить её правила в реальном времени уже почти невозможно.
Как заметить, что вы, возможно, переоптимизировали систему
Первый признак - огромное количество условий, значительную часть которых трудно объяснить без ссылки на прошлую статистику. Второй - результат резко ухудшается после маленького изменения параметров. Третий - система великолепно выглядит только на конкретных бумагах или на одном отрезке рынка.
Ещё один тревожный сигнал появляется, когда каждое изменение почти всегда улучшает прошлую доходность. Реальная исследовательская работа так не выглядит: некоторые разумные идеи должны делать результат хуже, какие-то ничего не менять, а некоторые выявлять слабые места системы.
Если любое новое правило удивительным образом удаляет очередную группу прошлых убытков, возможно, вы уже не исследуете рынок, а редактируете историю.
Как уменьшить риск подгонки
Самый простой принцип - разделять создание правил и их проверку.
Одну часть исторических данных можно использовать для разработки и настройки системы. Затем правила фиксируются и проверяются на другом участке истории, который не использовался при настройке.
Если стратегия великолепно работает только на данных, на которых её создавали, а на новом участке резко разваливается, это очень ценная информация. Лучше получить её до реальных денег.
Полезно также проверять устойчивость параметров: немного менять стоп, цель или другие настройки и смотреть, сохраняется ли общая логика результата. Не нужно искать одну магическую комбинацию цифр, которая дала максимальную историческую прибыль.
Цель проверки - найти систему, которая остаётся жизнеспособной при разумном диапазоне условий, а не ту, которая идеально описывает один уже законченный график.
Красивый бэктест должен скорее настораживать, чем восхищать
Если вам показывают торговую систему, которая пять лет практически не ошибалась, почти не имела просадок и стабильно росла месяц за месяцем, первое желание понятно: узнать, где её купить.
У нас реакция немного другая: хочется понять, как именно её тестировали.
Учитывались ли все сделки или только выбранные? Сколько параметров перебрали? Были ли комиссии, проскальзывание и реальные ограничения исполнения? Проверяли ли правила на данных, которые не использовали при создании? Что произойдёт, если немного изменить настройки?
Исторический график доходности можно сделать очень красивым. Сложнее построить правила, которые продолжат работать после того, как правая часть графика снова станет неизвестной.
Для чего тогда вообще оптимизировать систему
Не для того, чтобы выжать из прошлого максимальную прибыль.
Намного полезнее искать разумную конструкцию, которая имеет рыночное объяснение, приемлемый риск и не разваливается при небольшом изменении условий.
В нашей торговле мы тоже не считаем хорошим доказательством несколько красивых исторических реакций от уровня. Нам важно, можно ли было выделить ситуацию заранее, одинаково принять решение и получить статистику на серии таких случаев.
Стратегия нужна для торговли будущим рынком. Если ради идеальной истории пришлось научить её прошлому до последней запятой, бэктест уже выполнил совсем не ту задачу, ради которой его делали.
В Altz School мы учим строить торговую идею от рыночной ситуации, уровня и текущей реакции цены до стопа, цели и размера позиции, а не объяснять задним числом, почему конкретное движение «можно было увидеть».
Если хотите посмотреть программу, практику и формат обучения, запишитесь на подробную экскурсию по Altz School. Покажем, как всё устроено, а решение вы примете уже после.