суббота, 25 февраля 2012 г.

Генетические алгоритмы: в поисках священного грааля


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

Подсмотрено у матушки-природы
 
Генетические алгоритмы (ГА) – по сути, это методы эффективной оптимизации и поиска решений, подсмотренные у матушки-природы. Обычно они применяются для решения задач,
имеющих большое количество параметров и не имеющих четко формализованного метода решения. Перебирать все варианты – нереально долго, а с помощью ГА можно справиться удивительно быстро и с необходимой степенью точности. Каждый параметр решаемой задачи становится геном, а полный набор параметров системы – это набор генов, одна хромосома, одна особь. Например, в системе пять параметров, каждый из которых может меняться в пределах от 0 до 255. Тогда наша особь (или хромосома) – это набор из пяти байтов, идущих друг за другом, представленных в двоичной форме и выглядящих как двоичная цепочка длиной 40 бит. На начальном этапе ГА создается популяция из большого количества особей, значения генов (параметров) которых берутся случайным образом. Далее для каждой особи производится расчет системы и вычисляется фитнесс – функция некоторых результирующих значений системы. Собственно, фитнесс и является признаком приспособленности особи – показателем ее соответствия решению, которое ищется.
 
Далее популяция сортируется по значению фитнесса, и из нее берется половина особей, имеющих наилучший фитнесс. После чего в ход идут собственно механизмы ГА – скрещивание, мутация и инверсия. Для скрещивания из популяции выбираются две особи, которые будут родителями, определяется (случайным образом) точка разрыва, после чего создается потомок – как соединение части первого и второго родителя. Таким образом, потомок получает частично признаки обоих родителей. Это важнейшая часть ГА – собственно, здесь и происходит создание новой особи, несущей признаки обоих родителей и, возможно,
более приспособленной, чем каждый из них.

После того как все особи прошли скрещивание и их количество стало совпадать с начальной популяцией, производят мутацию. Для этого случайным образом выбирается несколько особей, в которых каждый бит меняется на противоположный. Также используется еще и метод инверсии, который заключается в том, что хромосома с определенной долей вероятности делится на две части, которые затем меняются местами. Эти два метода ГА служат для привнесения как бы извне новых признаков, не содержащихся в исходной популяции.
 
После проведения всех вышеуказанных действий мы получаем популяцию, равную по численности исходной, но более приспособленную к решению задачи. Далее процесс повторяется заново: расчет фитнесса, скрещивание, мутации и инверсия. Пройдя большое количество итераций (поколений), мы получим особи, содержащие гены с наиболее удачными параметрами оптимизируемой системы.
 
Для оптимизации существующих стратегий Рассмотрим простейшую механическую торговую систему (МТС). Две скользящие средние (МА1 и МА2) пересекаются. Их пересечение дает точку входа в рынок. Пересечение двух других (МА3 и МА4) дает точку выхода. У каждой МА есть два параметра – длина и сдвиг (в будущее на n баров). То есть общее количество параметров системы равно 8. Четыре отвечают за вход, четыре за выход. Для упрощения будем считать, что значения каждого параметра лежат в промежутке от 0 до 255 (один байт). Длина каждой хромосомы, таким образом, составляет 8 байтов, или 64 бита.
Количество особей в популяции выбирается в зависимости от числа генов в хромосоме – эмпирически.
 
Для рассматриваемого случая популяции в 300 особей будет достаточно. Фитнессом системы для простоты будем считать общую полученную прибыль. Запускаем ГА. На фазе расчета фитнесса прогоняем по историческим данным каждую особь – то есть нашу систему (MA1MA2-MA3MA4) с параметрами текущей особи. И получаем прибыль – она, напомню, у нас является фитнессом (или приспособленностью) данной особи. После прохождения некоторого количества итераций значения генов у особей с наибольшим фитнессом практически перестают изменяться. В этот момент можно считать, что итерационный процесс сошелся. Особь из получившейся популяции с наибольшим фитнессом – и будет тем набором параметров, который наилучшим образом подходит для нашей системы.
 
Я протестировал подобную МТС для 5-минутных графиков EUR/USD. Процесс сходится примерно после 100-150 поколений. Скорость схождения процесса зависит от параметров ГА – вероятностей скрещивания, мутации и инверсии. Уменьшая вероятности мутации и инверсии, мы убыстряем схождение процесса, однако появляется опасность, что процесс сойдется на одном из локальных максимумов. После тестирования стало ясно, что данная система нежизнеспособна (что, в общем-то, и не вызывало сомнений), хотя ГА и порождали наборы параметров, при которых такая система дает большую прибыль. Однако данная система приведена здесь лишь из-за своей простоты и для демонстрации принципа функционирования
генетического алгоритма. 

Выбор фитнесса
 
Одна из важнейших задач, которые необходимо решить при тестировании систем с помощью
ГА, – выбор фитнесса. Как я уже говорил, фитнесс – это некоторая функция результирующих значений системы. Выше рассматривался вариант, когда фитнесс (Fit) равен прибыли (Profit). Однако оптимизация по такому фитнессу приводит к тому, что ГА порождает параметры, при которых система может выдавать, например, только одну (на периоде тестирования) сделку – прибыльную, конечно, но для устойчивости системы этого явно не достаточно. Хорошим решением будет ввести в расчет фитнесса количество сделок, совершаемых системой (CountTrade): Fit = Profit * CountTrade. Но тогда у нас появляются сделки с очень большой просадкой, и общая устойчивость системы уменьшается. Решить эту проблему довольно просто. Введем в формулу максимальную просадку (Prosadka) по одной сделке: Fit = (Profit * CountTrade) / (Prosadka/10).  Так как просадка для нас все же менее важна, чем прибыль и количество сделок, мы уменьшили ее вес, разделив на 10. Эта формула уже довольна хороша, и системы, оптимизированные по ней, дают довольно неплохие результаты.

Однако можно добавить в нее, например, количество минусовых сделок (KolvoMinus) или размер стопа (Stop), а также поэкспериментировать с различными весами параметров. Я использую также следующие формулы для определения фитнесса: Fit = Profit/(1+Prosadka/ 10)* (CountTrade/20);  Fit = Profit/(1+Prosadka/ 1 0 + S t o p / 1 0 ) * (CountTrade/10);  Fit = (Profit+KolvoPlus/  5) / (1 + Prosadka / 10 + KolvoMinus/5). 

Вообще, выбор функции расчета фитнесса – процесс творческий. В зависимости от того, что вы хотите от системы получить, и следует выстраивать формулу расчета. Однако хочу предупредить, что очень большое количество параметров в формуле расчета фитнесса, даже при достаточной простоте оптимизируемой системы, может значительно удлинить процесс оптимизации. Если формула построена некорректно, вы не придете ни к какому конечному результату: процесс как бы застрянет между несколькими максимумами.

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

Отправить комментарий