О майнинговом подходе и вычленении эджа при построении торговых систем

Эта обучающая заметка призвана раскрыть некоторые элементы технологии производства торговых систем. Существует два основных подхода к созданию биржевых алгоритмов. Первый стартует с некой идеи, например--25-го числа уплачивается НДПИ, что может влиять на курс рубля. Далее эта идея проверяется и находит/не находит подтверждения. Это неплохой подход, но у него есть недостаток--число идей, приходящих в голову, ограничено. Кроме того, опыт построения систем показывает, что зачастую логика происходящего такова, что чистой силой ума допереть до нее тяжело. Поэтому более плодотворным (хотя и не приносящим такого удовольствия, как сила ума) является второй подход, связанный на начальном этапе с чистым майнингом. То есть никаких особых идей вначале нет--просто берется некий алгоритм, в принципе, почти любой. Но надо, чтоб он не был перегружен правилами--иначе на следующих этапах будет сложно. И смотрится, что получается. В результате таких действий рано или поздно получится хорошая кривулька эквити (эта стадия может занимать значительное время). И тут вопрос--это просто такая реализация броуновского движения, или там что-то есть? И вот здесь надо хорошенько поработать. Изучать сделки, менять параметры, менять правила--и смотреть, что получается, анализировать. Этот процесс во многом напоминает эволюцию в живой природе, фактически это генетическая оптимизация, понимаемая в широком смысле. И иногда оказывается, что в рынке действительно есть отклонения от СБ, а что еще нужно для счастья? :)

Приведу пример (он прост и заезжен до дыр, но такая уж специфика подачи биржевой информации. Если честно, даже и это жалко :) ). Пусть нас заинтересовал фРТС. Ликвидный фьюч, отношение комиссия+спред/стоимость очень мало--такой инструмент явно стоит посмотреть. Далее, какой алгоритм? Да трендовый, какой еще. Trend is your friend, Ливермор, Вильямсы всякие :) Будем входить при превышении ценой некоего уровня. Какого? Самый простой вариант--текущая плюс сколько-нибудь.Когда выходить? Наворотим тут стандартную выходную обвязку--выходы по тейку, стопу и по времени. Вот такой код в итоге:


if marketposition=0 then
begin
value1=close*1.001;
buy next bar 1 share at value1 stop;
end;


sell next bar 1 share at value1*1.005 limit;
if barssinceentry>60 then sell next bar 1 share at open;
sell next bar 1 share at value1*0.995 stop;


Это применяется к минуткам RI. Объяснение параметров:
1) Входной стоп выше текущей на 0.1%. Типичной волатильностью в минуту для фРТС является 100 пунктов, что есть 0.1% от типичной цены RI в 100 000 пунктов. То есть вход будет сделан при превышении ценой верхней границы типичной волатильности.
2) 0.5% процента на стоп и тейк, и 60 минут на выход--ну, это один из вариантов. 500 пунктов для RI--заметное движение, при этом 60 минут, в принципе, вполне достаточно для того, чтобы оно пришло либо к тейку, либо к стопу.

Кривулька:
О майнинговом подходе и вычленении эджа при построении торговых систем

Так себе кривулька. Типичное СБ. Ну и ладно, СБ--это основная тема, в которой ковыряется трейдер (и не только трейдер, но это тема отдельной статьи :) ). Попробуем поиграться с параметрами. Можно это делать вслепую, так, как это делает эволюция, а можно идейно. Поскольку вслепую писать долго (эволюция--штука очень долгая, часики вслепую долго делать), а ответ я знаю--то сделаю идейно. Идея в том, что будем искать входы на уровнях, существенно больших текущей. То есть не на величину типичной волатильности, а больше. Плавненько увеличив величину сдвига входного стопа от 0.1% до 0.3% от текущей, можно наблюдать такую картинку:

if marketposition=0 then
begin
value1=close*1.003;
buy next bar 1 share at value1 stop;
end;
sell next bar 1 share at value1*1.005 limit;
if barssinceentry>60 then sell next bar 1 share at open;
sell next bar 1 share at value1*0.995 stop;

О майнинговом подходе и вычленении эджа при построении торговых систем


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

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

Попробуем убрать стоп на выходе.

if marketposition=0 then
begin
value1=close*1.003;
buy next bar 1 share at value1 stop;
end;
sell next bar 1 share at value1*1.005 limit;
if barssinceentry>60 then sell next bar 1 share at open;
//sell next bar 1 share at value1*0.995 stop;

О майнинговом подходе и вычленении эджа при построении торговых систем

Стоп--явно полезная штука, надо оставить. А вот если убрать тейк:

if marketposition=0 then
begin
value1=close*1.003;
buy next bar 1 share at value1 stop;
end;
//sell next bar 1 share at value1*1.005 limit;
if barssinceentry>60 then sell next bar 1 share at open;
sell next bar 1 share at value1*0.995 stop;

О майнинговом подходе и вычленении эджа при построении торговых систем

то картинка уже вообще прямо намного вкуснее всех предыдущих. Что дальше? Вроде, просится убрать и выход по времени. Ну и уберем:

if marketposition=0 then
begin
value1=close*1.003;
buy next bar 1 share at value1 stop;
end;
//sell next bar 1 share at value1*1.005 limit;
//if barssinceentry>60 then sell next bar 1 share at open;
sell next bar 1 share at value1*0.995 stop;

О майнинговом подходе и вычленении эджа при построении торговых систем
Что-то совсем дикая картинка. Эволюция выродила семиголовое птицеюдищщо. Нет, такие особи недостойны размножения. Но что не так? Можно в сделки взглянуть, а можно просто понять, что стоп то у нас на фиксированном уровне, а значит, последняя сделка просто не закрыта--это фактически B&H получился. Поэтому со стопом надо чего-то схимичить, отвязать его от цены входа. Тут вариантов масса. Вроде, логично (правда, отдаляет от правильного ответа--это вообще типично для эволюционных процессов. У них своя, рэндомная логика. Привет социалистам :) ) сделать выход в конце дня, сохранив стоп в прежнем виде:

if marketposition=0 then
begin
value1=close*1.003;
buy next bar 1 share at value1 stop;
end;
//sell next bar 1 share at value1*1.005 limit;
if time>2340 then sell next bar 1 share at open;
sell next bar 1 share at value1*0.995 stop;

О майнинговом подходе и вычленении эджа при построении торговых систем

Картинка аналогична предпоследнему коду с выходом через час. Значит, время выхода некритично. А отсюда можно сделать вывод, что критична именно стоповость. Ну, или по научному--RI обладает трендовостью. Далее будем действовать идейно (Эволюция ж--имеем право. Кто сказал, что она полностью слепа? У нас вот будет немного зрячая эволюция--такая эволюция имеет эволюционное преимущество перед слепой эволюцией :) ). Природа любит симметрию. Два уха, два глаза, снежинки, цветочки, две груди, наконец! Поэтому сделаем выход такой же, как и вход:

buy next bar 1 share at close*1.003 stop;
sell next bar 1 share at close*0.997 stop;

Чертовски простой код то!

О майнинговом подходе и вычленении эджа при построении торговых систем

Картинка, правда, поухудшилась--но правила то совсем простые. Дело то в стопах, которые находятся в 0.3% от текущих цен. То есть далеко от текущих цен. Далее, ясно, что за одну минуту цена отклоняется от текущих цен нечасто. И поэтому логично посмотреть, что же будет, если выйти сразу после входа. Вот прямо сразу, по окончании минуты входа:

buy next bar 1 share at close*1.003 stop;
if barssinceentry=0 then sell next bar 1 share at open;

О майнинговом подходе и вычленении эджа при построении торговых систем

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

Input: time1(1200);
if time=time1 then buy next bar 1 share at close*1.003 stop;
if barssinceentry=0 then sell next bar 1 share at open;
и оптимизация по time1 от 1000 до 2349.

Полную таблицу считает долго, так что приведу лишь заключительную часть:

О майнинговом подходе и вычленении эджа при построении торговых систем

Собственно, видно, что минута 2349 вне конкуренции. И покупки по стопу в 1000 выглядят обалденно. То есть минута 1000 в RI чертовски трендова. Далее можно уже написать правильный код, в котором все понятно (я соптимизировал коэффициент в стопе, не 0.3%, а 0.2%--так граальней кривулька смотрится :) Хотя и с 0.3% неплохо).

if time=2349 then buy next bar 1 share at close*1.002 stop;
if barssinceentry=0 then sell next bar 1 share at open;

О майнинговом подходе и вычленении эджа при построении торговых систем


Далее, следующий этап--наполнение этой темы, найденной эволюционным выделением эджа, смыслом. Ну в данном случае, смысл понятен и всем известен--особенности открытия FORTS в 10:00 (На всякий случай и если кто не в курсе--это не торгуемо :) :) :) ). А вообще, эта стадия очень важна, и торговать не понимая смысла--нельзя.

Краткое резюме. На простом и понятном примере показан датамайнинговый подход к построению торговых систем.

A PHP Error was encountered

Severity: Notice

Message: Undefined offset: 2

Filename: main/v_footer.php

Line Number: 25

Backtrace:

File: /home/infoption.ru/www/infoption.ru/application/views/main/v_footer.php
Line: 25
Function: _error_handler

File: /home/infoption.ru/www/infoption.ru/application/controllers/Base.php
Line: 38
Function: view

File: /home/infoption.ru/www/infoption.ru/application/controllers/Blog.php
Line: 229
Function: render_single

File: /home/infoption.ru/www/infoption.ru/index.php
Line: 300
Function: require_once