Введение.
Методы оптимизации стратегий
Как вы уже поняли из предыдущей статьи, оптимизация методом перебора не эффективна. Учитывая скорости тестирования, нецелесообразно перебирать все возможные параметры.
Есть, конечно, уже готовые производительные оптимизаторы стратегий в других программных продуктах. Но как в них перевести свои стратегии? Все ли может этот тестировщик, что нам нужно? Будут ли тесты отражать реальность? Как правило, к ним нужны всякие коннекторы, конверторы и др. костыли, не относящиеся к нашим задачам.
К тому же это «черные ящики» и как они там считают на самом деле, никто не знает. А когда дело касается денег не должно быть места всяким случайностям и неопределенностям. На слово производителям такого программного обеспечения я не верю. Сколько раз сталкивался в самых серьезных продуктах с всякими глюками и багами, письмами и звонками в техподдержку. При этом мы становимся зависимыми от совершенно не нужных нам людей. В общем, доверия у меня к ним никакого. Все эти проблемы сильно замедляют реализацию наших алгоритмов, и соответственно отнимают наше время и деньги.
И я задался вопросом: «А почему бы не написать свой оптимизатор? Неужели так сложно?» Как оказалось сложно, но вполне реально. К тому же появляется уверенность в результатах и свобода в настройках и модернизациях и модификациях программы. Собственно с этими мыслями я взялся за работу.
За основу взял стохастическую оптимизацию. Стохастическая оптимизация – это класс алгоритмов оптимизации, использующая случайность в процессе поиска оптимума. Алгоритмы стохастической оптимизации используются в случае, если целевая функция сложная, многоэкстремальная, с разрывами, с помехами и пр. При этом она позволяет исследовать только часть области вариантов стратегий и на основании полученных данных составить представление о пространстве в целом.
Ознакомился с основными применяемыми стохастическими способами оптимизации – генетика, монте-карло их разновидностями и прочими методами.
Вообще разновидностей стохастических методов как оказалось очень много.
Например, метод «Роя частиц».
Или столь популярные «Генетические алгоритмы».
Есть элегантные решения типа алгоритма «Имитации отжига»
Например, последний способ с высокой степенью гарантирует нахождение глобального экстремума. Так как при этом методе он периодически отклоняется от пути и дополнительно изучает соседние области. Но скорость исследования не самая высокая.
Суть методов одна — мы выбираем случайные значения и так или иначе их анализируем. От способа к способу меняются только два параметра – скорость и точность исследования. Причем обратно пропорционально. Чем выше скорость тестирования, тем хуже качество результатов и наоборот. При выборе метода каждый решает сам, чем готов пожертвовать.
Поиск экстремумов
Например, метод «Имитации отжига» позволяет найти глобальный экстремум. Однако, если подумать, то сам глобальный экстремум нам ни к чему, если к нему нет сходимости. То есть если вокруг экстремума соседние условно равномерно не убывают, то очень вероятно, что этот глобальный экстремум носит случайный характер и пользы нам от него будет мало так как он неадекватный, а расчеты нам испортит. Поэтому так важно изучить параметры вокруг экстремума. Если есть сходимость, значит есть система и эту стратегию можно изучать дальше.
Все стохастические методы оптимизации имеют один общий недостаток – могут упереться в какой-то локальный экстремум, а тот самый оптимальный упустить из вида. Чтобы этого избежать, нужно максимально увеличивать области выборок и количество итераций. Но от этого страдает скорость расчетов. Так что нужно всегда искать золотую середину.
Из-за сложности и не очевидности расчетов, методы «Имитации отжиги» и прочие «Рои частиц» я отложил в сторону)
В итоге пришел к выводу, что самый доступный и удобный способ в моем случае это оптимизация методом «Монте-Карло».
Интерфейс тестера-оптимизатора «Монте-Карло»:
Продолжение читайте во второй части.
Хотелось бы поблагодорить ребят из S#, за то что,
помогли мне начать мой путь в алготрейдинг.
Всем восходящего тренда! С уважением, Bond.
Мой ник в Скайпе: bond_algotrade
По себе скажу, что тоже ищу оптимальные параметры системы методом Монте-Карло и к полученным 10-15 лучшим результатам применяю генетические алгоритмы, что-бы выйти к оптимуму. Технически это все не сложно, реализовать можно даже в Excel.
Сложнее выбрать по какому критерию проводить оптимизацию — хочется и доходность повыше, и просадки пониже, и стабильность результата на соседних наборах параметров.
О «Имитации отжига» первый раз слышу, киньте ссылку, где можно больше почитать?
В следующих частях и статьях все эти моменты будут рассмотрены более подробно. Просто статьи объемные и все не помещается за раз.
Ссылки:
«Рой частиц» — jenyay.net/Programming/ParticleSwarm
«Генетика» — habrahabr.ru/post/171751/
«Имитация отжига» — ru.wikipedia.org/wiki/%C0%EB%E3%EE%F0%E8%F2%EC_%E8%EC%E8%F2%E0%F6%E8%E8_%EE%F2%E6%E8%E3%E0
Монте-карло в плане степени оптимизации совсем плох. Ну только представь, что нащупав вроде бы хороший максимум он не будет стремиться исследовать окрестности, а продолжит тыкаться случайно по всему пространству.
Другое дело что для поиска стратегий оптимизация это не главное, важнее борьба с подгонкой.
Такие методы как генетика, Монте-Карло, Рой частиц и прочие их модификации используют один и тот же математический принцип оптимизации — стохастический. Просто в каждом методе это реализовано со своей спецификой. Кто-то быстрее, кто-то точнее, но нельзя утверждать, что кто-то лучше, потому что принципиально это все одно и тоже)
Позже я пришел к выводу, что в классическом варианте применительно к трейдингу метод «Монте-Карло» не совсем рационален и использовал новый алгоритм. Но об этом в следующих частях)
Если к целевой ф-ии не применимо правило, что малое изменение параметров приводит (в среднем, чаще всего) к малому изменению ф-ии, то нет ничего лучше монте-карлы. Но в оптимизации стратегий это не так, а если бы было так, то торговать такой результат было бы рискованно т.к. малейшее изменение условий приводило бы к резкому изменению результата.
А раз все-таки целевая ф-я в нашей задаче имеет оптимальные области, а не отдельные точки, то нужны алгоритмы которые стремятся исследовать окрестности вокруг перспективных точек. Т.е. отжиг, ГА и подобные.
Это, конечно, много, но я решил сразу сделать с запасом «на будущее». Тестер-оптимизатор в итоге получился универсальным и эти параметры могут занять другие величины, например, величина стопа и прочее.
Переоптимизация — это бесспорно проблема, но ее можно решить проверкой на кластерицацию, walk-forward и др.
Но как тогда используют нейросети у которых сотни настраиваемых параметров?
Есть идеи на этот счет?