Продолжение, начало здесь:
http://www.russian-trader.ru/forums/...pseudogenetics

Для примера рассмотрим эффективность и распределение паттернов, которые кодируются различным числом генов. Сначала смотрим эквити системы, имеющей один ген:




Хорошо видно, что подобное условие обладает определенным потенциалом. Но для самостоятельной торговли его явно не достаточно. Необходимо добавить простой фильтр, чтобы не торговать против тренда. Этот минимальный набор условий, возможно, даст требуемый эффект. Теперь рассмотрим систему, в которой паттерн на вход кодируется четырьмя генами:



Красивый график, эффективный паттерн. Примечательно, что лонговые позиции не дают провальных показателей в условиях медвежьего тренда.

Теперь нужно объяснить, почему гены кодируются не конкретными числами, а диапазонами. Дело в том, что в качестве "эволюции" в моем псевдогенетическом алгоритме используется встроенный Монте-Карло оптимизатор. Для кодирования генов специально выбраны равные диапазоны, чтобы вероятность активации всех трех состояний была одинакова. Монте-Карло оптимизатор протестирует множество случайных комбинаций генов, после чего "сожмет" допустимые диапазоны в оптимальном интервале, так что весь диапазон будет соответствовать одному из трех состояний генов. Более подробно потенциал Монте-Карло я разбирал в прошлой статье.

Для этого рассмотрим результаты одного прогона Монте-Карло. Активация генов производилась случайным образом. Выход через два бара изменен на второй "стандартный" выход, с равновеликими тейкпрофитом и стоплоссом:




Хорошо видно, как сильно разнятся показатели эффективности для различных паттернов. В определенные моменты вероятность прибыли достигает 73% со средней прибылью на сделку почти в 1%. Великолепные результаты, если бы не одно "но". Количество сделок слишком мало, а значит используемые условия просто не подтверждены достоверным числом испытаний. Я уже говорил об этом и теперь можно ввести "коэффициент обеспеченности параметров сделками". Кроме того необходимо определить механизм выбора наиболее оптимальных хромосом. В генетическом алгоритме для этого используется единая целевая функция.

В этой таблице хромосомы выбирались вручную. Множество различных критериев не всегда удается связать единой функцией с четким экстремумом, поэтому существуют способы последовательного отбора. При этом каждый последующий критерий улучшается (максимизируется) без явного ухудшения (минимизация) предыдущего критерия. То есть сначала мы отсекаем не прибыльные комбинации, потом не репрезентативные и т.д. Но для эволюционного и автоматического отбора оптимальных хромосом без единой целевой функции все же не обойтись. За основу можно взять формулу Кауфмана из его книги "Trading systems and methods", раздела о генетических алгоритмах:




В этой формуле явно не хватает двух закрытых скобок. Но примерно понятно, какие показатели отвечают за прибыльность, какие - за достоверность. Примечательно, что для показателя сделок используется функция квадратного корня. Это сделано, чтобы замедлить влияние количества сделок на оптимальность паттерна. Иначе в качестве оптимального входа будет выбран паттерн, генерирующий огромное количество сделок с пренебрежительно малой прибылью. Реализовать на практике положительное математическое ожидание подобных входов будет очень проблематично. Поэтому можно немного преобразовать формулу Кауфмана:




Здесь для определения уровня оптимальности используются следующие показатели:

- средняя прибыль на сделку в процентах. При этом из нее вычитается 0,15% на комиссию и проскальзывание. Таким образом, я ввожу пограничный уровень, ниже которого прибыль даже не рассматривается с точки зрения реалистичности;

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

- фактор восстановления. Так же как и для средней прибыли, тут вводится пограничное значение. Сделано это для повышения равномерности распределения сделок в тестируемом пространстве. Квадратный корень используется для некоторого смягчения влияния, которое этот параметр оказывает на итоговую функцию;

- количество сделок. Вкупе со скорректированным показателем прибыли это значение максимизирует матожидание входов.

Безусловно, эта формула не является единственно верной и безукоризненной. Любой трейдер может составить свою функцию оптимальности. Например, в Вэлслабе есть своя композитная функция, которая использует самые важные, на взгляд разработчиков, показатели эффективности. Возможно, когда-нибудь я более подробно разберу целевые функции в трейдинге. Ведь, по сути, важность этой формулы в системном трейдинге можно описать афоризмом: "Скажи мне, что для тебя есть идеальная система - и я соберу тебе Грааль!))))))" Теперь рассмотрим новый проход Монте-Карло оптимизатора, но на этот раз с учетом целевой функции:




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

С кодированием паттернов примерно разобрались, теперь можно переходить к "выращиванию" фильтров. Для начала рассмотрим, какие бывают фильтры:




В своих статьях я уже рассматривал подробно внутренние и внешние фильтры. Поэтому здесь я буду комбинировать только те фильтры, которые на прошлых тестах показали себя с лучшей стороны. Чтобы избежать излишней зафильтрованности, я введу ограничения:

- в системе не может использоваться более одного внутреннего фильтра, и более одного внешнего;

- внешний и внутренний фильтр будут кодироваться двумя отдельными генами;

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

Сейчас я немного упрощу тестирование фильтров. Длинная позиция будет открываться не случайным образом, а просто на каждом последовательном баре с выходом через два бара. По большому счету, это будет равноценно открытию позиции на протяжении всего срока действия фильтра (комиссия не учитывается), но такой подход позволяет оценить степень "зафильтрованности". Чем больше сделок будет совершено с учетом активного фильтра, тем фильтр слабее и оставляет более репрезентативные отрезки котировок. Смотрим тестовую таблицу "выращенных" фильтров:




Колонка Опт1 определяет, какой тип внешнего фильтра будет использоваться: наличие восходящего/нисходящего тренда на внешнем активе (значение=20) или индекс относительной силы (значение=70). Колонка Опт5 определяет три возможных состояния внешнего фильтра:
- выключен (значение=20);

- используется фильтр в значении "больше" (то есть имеется восходящий тренд или тестируемый фьючерс РТС "сильнее" внешнего актива);

- используется фильтр в состоянии "меньше" (имеется нисходящий тренд или "слабость" РТС)

Колонка Опт3 определяет внешний актив: нефть, доу-евростокс, евродоллар, Лукойл, облигации, Газпром, Сп500. Таким образом, внешний фильтр кодируется одним основным геном и несколькими дополнительными. Аналогичная ситуация и с внутренними фильтрами. В колонке Опт6 кодируется состояние внутреннего фильтра, где состоянию "выключен" соответствует значение=20. То есть итоговая хромосома фильтров не содержит внешнего фильтра только в 16 строке, не содержит внутреннего фильтра в 5, 11, 17 и т.д. строках. Рассмотрим график капитала торговой системы, построенной только с использованием двух фильтров: одного внутреннего и одного внешнего:




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

В Вэлслабе моей версии есть существенное ограничение, что количество оптимизируемых переменных не может превышать 10. С одной стороны это заметно снижает возможности реализации полноценной генетической оптимизации. С другой стороны вынуждает проводить поиск знаний поэтапно, что значительно повышает надежность алгоритма и контроль за процессом. Так, например, для кодирования хромосомы "вход" нам потребовалось 18 генов: 10 генов на сам паттерн, 6 генов на фильтры и 2 гена на технику входа. То есть по критерию достаточности необходимо 30*(18+1)=570 сделок. Безусловно, в итоговой системе будут использоваться не все 18 генов. Но ведь еще необходимо "выращивать" стоп-лосс и условия на выход из позиции. В зависимости от качества неэффективности, которую найдет подобный генетический алгоритм, будет зависеть и продолжительность торговли. В различных условиях и фазах рынка найденные точки входа будут лучше отрабатываться разными выходами из позиции. Поэтому вполне возможны ситуации, когда с одним паттерном на вход можно будет использовать как тейкпрофит во флэте, так и трейлинг в тренде. Можем рассмотреть пару систем, условия которых были найдены псевдогенетическим алгоритмом:




Для входа в позицию системы используют качественные паттерны (критерии качества см. выше), один фильтр (внешний или внутренний) и оптимальные выходы с прибылью и убытком. Критерии оптимальности выходов, как и сами выходы, в статье не рассматривались. Для этих двух систем использовалась немного модифицированная целевая функция с учетом выходов. Хорошо видно, что в определенные моменты торговля не велась. Так алгоритм оптимизирует систему, чтобы не открывать длинные позиции против нисходящего тренда.

Теперь еще раз вернемся к названию статьи - "теория псевдогенетического поиска знаний". Теория - потому что из-за программных ограничений пока не удалось совместить все функциональные блоки в единую автоматическую систему. Зато подобное разделение хромосом позволяет на ранних этапах держать процесс под контролем человеческой логики. Псевдогенетического - потому что хоть и используется очень похожая процедура отбора оптимальных решений, основной упор делается на оператор комбинаторной "мутации", а не на эволюционный процесс. Рассмотренная в статье целевая функция вполне справляется с возложенными на нее задачами, особенно для поиска качественных входов. Поиск знаний - потому что описание паттернов происходит "снизу вверх". То есть находятся устойчивые закономерности в явном виде, как информация для анализа трейдером. Алгоритм может дать ответ на вопрос, является ли найденная неэффективность прибыльной и репрезентативной. Но последнее слово остается за трейдером и вневыборочным тестированием, которое здесь пока не реализовано.

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

Автор статьи: Тарас Правдюк, (с) специально для Русского Трейдера.