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

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

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

Для начала хочу обозначить условную терминологию, чтобы было легче представить сходства и различия моего и "настоящего" алгоритма оптимизации. Итоговый результат, тот самый организм, который я буду выращивать - это законченная торговая система. Организм системы состоит из 4 обязательных хромосом:

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

- точка выхода с убытком. Обычно эта хромосома определяется трейдером на основании анализа распределения "мгновенной" просадки и вероятности выхода сделки в прибыль, но тут она будет определяться общим алгоритмом;

- точка выхода с прибылью. Эта хромосома будет определяться "выращенными" правилами для фиксации прибыли;

- правила управления капиталом. Эта хромосома должна определять, какой убыток допускается в одной сделке и, следовательно, какой объем денежных средств будет задействован в каждой конкретной сделке. Здесь, для простоты изложения все тесты будут проводиться при условии торговли одним контрактом без реинвестирования.

Наглядно предполагаемую схему "организма" торговой системы можно рассмотреть на следующей диаграмме:



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

Чтобы "вырастить" правильную торговую систему, необходимо тщательно разобрать логику принятия решения о сделке и определить смысл хромосом по отдельности.

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

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

- положительное математическое ожидание;

- устойчивость;

- статистическая достоверность.

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

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

2. Второй "стандартный" выход - постановка одинаковых по величине приказов на закрытие позиции стоп-лосса и тейк-профита. Такой выход оценивает вероятность движения в нашу сторону на чуть большем временном интервале. Более подробно к оценке качества входа я вернусь позже.

Второй пункт - устойчивость во времени и пространстве - я подробно рассматривал в своей статье, посвященной тестированию и оптимизации торговых систем. Напомню, что устойчивым можно назвать такой вход, эффективность которого не критична к незначительному изменению численных параметров и сохраняется на вневыборочных интервалах. То есть, если для входа нам нужен гэп в 1%, то система будет достаточно эффективна во всем диапазоне (0,8 ; 1,2).

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

требуемое количество сделок = 30 + 30*(общее число явных параметров)

Отдельно хочется обратить внимание на термин "явный параметр". Это может быть логический или численный параметр торговой системы, который явно определяется пользователем при конструировании правил торговли. Например, торговая система со случайными входами не имеет явных параметров, зато имеет несколько скрытых:

- торгуемый инструмент;

- таймфрейм котировок;

- тип приказа на открытие позиции.

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

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

Точка входа состоит из трех генных блоков:




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

Второй блок - различные фильтры. Они определяют разные фазы рынка. Можно выделить три значимые фазы:

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

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

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

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

- внутренние фильтры - фильтры, использующие собственные свойства торгуемого инструмента. Можно назвать фильтры тренда и дивергенций;

- внешние фильтры - фильтры, использующие свойства ведущих или коррелированных инструментов и рынков. Можно назвать фильтры тренда на рынке СП500 или нефти, и фильтры относительной силы на рынке Евродоллара или Лукойла.

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

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

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

- гэп вверх;

- гэп не вверх (вниз или равен нулю);

- не используется.

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

- гэп вверх больше 1% (1% - это уже второй ген);

- гэп вверх меньше 1%;

- гэп вниз меньше 1%;

- гэп вниз больше 1%;

- гэп не используется.

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

- открытие позиции приказом по рынку;

- открытие позиции стоп-приказом;

- открытие позиции лимитным приказом;

При этом второй дополняющий ген кодирует величину отступа для лимитного и стоп-приказа. У меня она выражается в процентной доле от предыдущего диапазона. То есть при состоянии дополнительного гена "0,3", основной ген может принимать форму рыночного приказа, лимитного приказа ниже прошлой точки закрытия на 0,3 прошлого диапазона или стоп-приказа выше прошлой точки закрытия на 0,3 прошлого диапазона.

Аналогичная ситуация и с фильтрами, но их я рассмотрю ниже отдельно. Для начала опишем двухбаровый паттерн 10-ю логическими условиями. Список условий, который можно составить для определения паттерна из 2-х баров далеко не ограничивается 10-ю пунктами, но вэлслаб просто не позволяет работу с большим числом переменных. Условия имеют всего три состояния - вверх/выше/больше, вниз/ниже/меньше/равно, исключен - что в совокупности дает почти 60000 комбинаций. Эти условия имеют различную объективную силу и различную частоту. Сделаем тестовый прогон комбинаций (пока не генетический, а прямой) и посмотрим полученные результаты для длинной позиции, удержанной 2 бара после входа в сделку:



Цветными прямоугольниками обозначены различные состояния генов. Значение гена до 33 означает, что данный ген выключен и его условие не используется при формировании паттерна. Значение гена от 33 до 66 означает, что ген находится в состоянии "ниже/равно". Значение гена выше 66 означает состояние "выше". Хорошо видно, что включая и выключая различные гены, мы получаем самостоятельные паттерны. Они имеют различные матожидания и частоту срабатывания. В предпоследней колонке выписана полная хромосома паттерна, которую потом легко воссоздать. В последней колонке указано общее число активированных генов, не зависимо от их состояния. Хорошо видно, что достаточно хорошие результаты показывают паттерны даже из 3-4 условий. Отдельно стоит упомянуть, что все хромосомы начинаются с генов 3030 - я специально выключил два первых гена, кодирующих пару достаточно популярных условий. Как выяснилось, их вклад сравнительно не велик вопреки их широкой распространенности.

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

Продолжение статьи здесь:
http://www.russian-trader.ru/forums/...eudogenetics-2