Кросс-валидация — алгоритм оценки торговых систем

Автор: Александр Кургузкин (mehanizator).

Как обычно поступают при поиске оптимальных параметров торговой стратегии? Гоняют эту стратегию на решетке возможных параметров, и выбирают наилучшую эквити из полученных. Однако в подавляющем большинстве случаев стратегия не дает в реальной торговле такие же хорошие результаты, которые она показывала на графике в прошлом.

Это происходит от того, что происходит «переоптимизация», из всего набора параметров выбирается такой, который наиболее точно описывает особенности тренировочных данных. Однако, чем точнее система подстроена под местные особенности данных, тем хуже ее способность к обобщению.

Как оценить степень переподгонки системы? Обычно эта степень выявляется в результате реальной торговли, однако понятно, что этот способ слишком долгий и дорогостоящий. Нужен способ получить такую оценку, пользуясь только историческими данными.

Идея проста – оптимизировать систему на одном куске данных, а тестировать ее на другом куске данных. Например, если есть данные за два года, оптимизировать систему на данных за первый год, а тестировать ее на данных за второй год.

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

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

Так мы пришли к алгоритму кросс-валидации, в данном случае состоящий из двух блоков.

Следующий шаг – увеличить число блоков. Обычно используется 10-15. Это повышает устойчивость оценки.

Таким образом, алгоритм N-блочной кросс-валидации таков:

— делим все данные на N блоков.

— для каждого i из N оптимизируем систему, используя в качестве тренировочных данных все блоки кроме i-го, затем тестируем систему на i-м блоке, получая кусок тестовой эквити.

— соединяем тестовые эквити из всех блоков.

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

Автор: mehanizator

Комментарии:

ab_trader: В результате кросс-валидации в худшем случае мы получим N наборов параметров системы. Как определить какой надо в торговле использовать?

mehanizator: тот, который получен с использованием всех данных. кроссвалидация не определяет параметры системы, она определяет степень устойчивости этих параметров.

Intro: А вот кстати разбивать на много блоков для меня идея свежая. Спасибо.

Drozd: Остался только один вопрос вопрос открытым — зачем оптимизировать систему? Если есть четкая идея, основанная на конкретном явлении, то как правило параметры колеблются в районе двух-трех единиц, а это можно и руками перебрать и не важно на каком участке. Идея или работает или не работает. Все прочее блуд и подгонка )

ab_trader: Понятно. Наверное, помимо качества тестовой эквити, надо еще смотреть на разницу параметров на разных участках. Если значения параметров близки, то система устойчива. Мех, а как на практике получается, параметры на разных участках для хороших систем сильно отличаются или нет?

mehanizator: Drozd, если есть четкая идея, то в ней наверняка уже сидит толпа народа 🙂

mehanizator: ab_trader я уже очень давно параметры руками не подгонял. просто скармливаю данные алгоритму, он кросс-валидирует там все и либо выдает модель если есть значимые факторы либо не выдает.

ab_trader: mehanizator, круто. А все-таки, когда параметры мало меняются от блока к блоку, это должно говорить об устойчивости системы?

mehanizator: я думаю что такое редкость, рынок все-таки очень сильно отличается по периодам.

robomakerr: >mehanizator: скармливаю данные алгоритму, он… выдает модель если есть значимые факторы

Он сам ищет, что может являться фактором? Или список потенциальных факторов ему дается заранее?

mehanizator: факторы я даю, конечно.

Drozd: mehanizator, по разному бывает.

spitfire: оптимизировать на будущих данных чтобы протестить в прошлом это конечно сильно. А чем не нравится форвардное тестирование?

mehanizator: поскольку при форвардном тестировании тестируется только прошлое на будущем, получается в два раза меньше теста.

spitfire: Ну как так? Допустим берем тестовый период 6 лет, IS = полгода, OOS = 1 месяц. Тогда весь тест будет 5.5 лет из 6 возможных. То есть пропадет только первый IS-период. Какая еще половина пропадет, Вы что. Все зависит от соотношения между IS и общем размером теста.

mehanizator: ну ок. есть разные техники валидации. каждый выбирает что ему больше нравится.

t_trade: Александр, добрый день. Я покопался с этим методом и пришел к такому результату: почти все тесты на 14/15 размере данных с последовательно исключаемой 1/15 частью дают примерно такие же результаты, что и оптимизация на всем участке данных. Что не удивительно на самом деле. Чем же хорош этот метод? как он может дать более адекватную оценку по сравнению с IS-OOS? Может, я брал слишком маленькие кусочки (4 месяца для интрадей, разные системы проверял, от 1 до 5 сделок в день)

mehanizator: А какие результаты вы пытались получить? Результаты оптимизации? Но это не метод оптимизации. Это метод проверки устойчивости результатов оптимизации.

Кросс-валидация это и есть вариант IS-OOS. Вы строите out-of-sample эквити и оцениваете ее параметры.

t_trade: Я понимаю, о чем Вы. Ну вот, например. Пересечение МАшек:) за 3 года оптимальными оказались 9 и 14. Я хочу проверить, насколько эти параметры устойчивы. Разбиваю на 15 кусков, и оптимизирую 15 раз, каждый раз последовательно исключая 1/15 часть, так? получаю 10 раз 9 и 14. И 5 раз 8 и 16. Склеиваю эквити из этих 1/15 кусочков, подставляя те параметры, которые получились при тестах без их участия. И получаю почти такую же эквити, как и при оптимизации за все 3 года.

И так с каждой системой, которую я проверил.

t_trade: Собственно, вопрос в том, насколько адекватна такая оценка кусочков OOS будет по сравнению с разбивкой на 2 части. когда OOS по размеру сопоставим с IS.

mehanizator: если на OOS получается примерно то же самое, что на IS, значит устойчива система. вроде очевидно?

кроссвалидация дает участок OOS вдвое больший чем просто разбиение на IS-OOS. насколько адекватна оценка по вдвое большим данным? ну, по крайней мере можно сказать что она точно более адекватна, так почему бы не пользоваться?

t_trade: Да, но и участок IS увеличивается почти в 2 раза. Вот в чем дело. Как пересечение машек может быть устойчиво?:)
По сути, мы, имея 3 года, оптимизируем систему для дальнейшей торговли. И хотим знать, а не подвержены ли эти параметры влиянию какого-нибудь случайного выброса. Тогда — да, кросс-валидация — идеальный метод.

Но чем хорош классический IS-OOS — так это тем, что IS и OOS не пересекаются, что OOS является длительным участком, каким будет являться и живая торговля (если практикуется торговля без пересмотра оптимальных параметров).

Александр, я не пытаюсь спорить с Вами. Я учился трейдингу в том числе по Вашей книге. Я просто пытаюсь понять, где я не прав, потому что мне не кажется этот метод эффективным. Вы сами используете кросс-валидацию?

mehanizator: в кросс валидации IS и OOS тоже не пересекаются в том смысле что для построения эквити на одном участке используются элементы, полученные на других участках.

mehanizator: на участке в 3 года, если он однородный, что угодно может оказаться устойчивым. возьмите лет 15 🙂

t_trade: Хорошо, я понял:) «торгуя в песочнице — пользуйся методами для песочницы» 🙂


Подпишитесь на уведомления о новых постах

И получите доступ к специальным материалам сайта