anatolyutkin
anatolyutkin личный блог
31 мая 2016, 15:11

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

Эта обучающая заметка призвана раскрыть некоторые элементы технологии производства торговых систем. Существует два основных подхода к созданию биржевых алгоритмов. Первый стартует с некой идеи, например--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 (На всякий случай и если кто не в курсе--это не торгуемо :) :) :) ). А вообще, эта стадия очень важна, и торговать не понимая смысла--нельзя.

Краткое резюме. На простом и понятном примере показан датамайнинговый подход к построению торговых систем.
42 Комментария
  • Redline
    31 мая 2016, 15:23
    Прекрасное чувство юмора
      • Redline
        31 мая 2016, 18:20
        anatolyutkin, 
        я это понимаю.
        Просто концовка была прекрасна :)
  • baron_samedi
    31 мая 2016, 15:31
    как детектив, в котором убийца оказался тем, кто громче всех плакал на похоронах…
      • baron_samedi
        31 мая 2016, 17:15
        anatolyutkin, 
        хороший пост.
        «А когда же будут разоблачения» — это в библиотеку на полку Булгакова.
      • Dio
        31 мая 2016, 20:15
        anatolyutkin, это только относительно данной системы стопы надо тестировать с учётом первой минуты. Они (стопы) вещь вообще бывает порой живёт своей жизнью, даже если и жестко привязаны к входам...))
          • Dio
            31 мая 2016, 21:03
            anatolyutkin, вполне возможно.
  • Тимофей Мартынов
    31 мая 2016, 15:39
    Ух! Сегодня на смартлабе волна отличных постов по теме алготрейдинга!!!
  • evgen000
    31 мая 2016, 15:53
    Хм. Интересно. Но фактически все что сделали, взяли систему и выкинули из нее отрицательные сделки. Подобный подход в out of sample покажет убыток, даже если бы эта минута была б не 10:00.
  • nbvehrfr
    31 мая 2016, 17:40
    только нейросети, только хардкор
    — можно на базе RL попробовать смоделировать работу трейдера
    — искать закономерности с теми же LSTM (grid LSTM лучше)
    — два первых пунктах в применении к широкому рынку (управление портфелем) — эта тема более интереса проще продать

    в июне стартую небольшой рисерч проект на эту тему, кому интересно прошу в команду — английский язык, понимание RL (хотя бы в границах книги sutton & barto) и нейросетей
    • day0markets.ru
      31 мая 2016, 17:43
      nbvehrfr, как подтверждать статистически собираетесь закономерности? 
      • nbvehrfr
        31 мая 2016, 18:00
        Alex Hurko, если вы про оверфиттинг то кроссвалидацией, дропаутом (для нейросетей конкретно)
        для среднесрочных моделей думаю нужно будет учесть разные фазы рынка (бычий медвежий и флет)
        • day0markets.ru
          31 мая 2016, 18:03
          nbvehrfr, спасибо. Не знаю насколько эти модели применимы к нейросетям. А есть может линки у вас на исследования/примеры подобные? Интересна именно проверка на устойчивость/стат. значимость.
          • nbvehrfr
            31 мая 2016, 21:41
            Alex Hurko, https://scholar.google.ca/scholar?q=dropout+neural&btnG=&hl=en&as_sdt=0%2C5&as_vis=1

            смысл дропаута в двух словах — отключают часть нейронов (с вероятностью p, часто берут 0.5) и насколько сеть устойчива к потере связей/нейронов, используют в основном в deep learning (много слоев, нейронов, связей), где в противном случае очень легко скатиться в оверфиттинг
  • day0markets.ru
    31 мая 2016, 17:42

    Это вряд ли можно назвать майнингом. Посмотрите литературу на тему DataMining, там методы совсем иные.  У вас скорее метод тыка/подгонки. Если много обезьян посадить за печатную машинку, то рано или поздно они что-нибудь издадут… Как вы сами отличаете что это рабочее или нерабочее (не подгон под историю)?

    • crazyFakir
      31 мая 2016, 18:08
      Alex Hurko, методы  и практика могут быть разными, но тут нет даже намека. смердит и Тима восхищен.

      www.youtube.com/watch?v=fd53wj7dagA&feature=youtu.be&t=1m3s

      «пипл хавает» ©
    • SergeyJu
      31 мая 2016, 18:57
      Alex Hurko, а чем, собственно, эвристически сокращенный перебор хуже датамайнинга?
      Скажу больше, почему какой-нибудь SVM или Random Forest или генетическая или еще какая оптимизация нейронной сети — датамайнинг, а головой и руками — низзя?
      Умные американские люди так не считали. Посмотрите на книгу  Тьюки, никто не назовет его дилетантом:
      www.twirpx.com/file/197583/

  • silentbob
    31 мая 2016, 18:40
    пришли матерые датамайнеры и указали автору его место, ага. 


    По сути заданных вопросов — торговать первую минуту? Легко и просто. Быстрые сервера, плаза,  логины на 600 транзакций в секунду, стописят тысяч на инфраструкртуру ежемесячно. Ну и на тестах взять тики и закодить что вход не ранее 600го тика, а то и не ранее 1000го. 
    Если все будет так же — берем и торгуем. 
      • SergeyJu
        31 мая 2016, 19:07
        anatolyutkin, ну, история погони за первыми сделками на открытии в 10-00, когда с ночи стоят неадекватные заявки, насчитывает не один год. Емкость таких систем ничтожная, а конкуренция требовала все более высоких скоростей. Историк трейдинга мог бы дисер, я полагаю, написать.
  • Ivor
    31 мая 2016, 23:48

    М
    айнер. Это только вступление. 
  • СыроеШкин
    01 июня 2016, 00:42
    Попробуйте в коде в первых примерах поставить выход по стопу перед выходом по тейку.
      • СыроеШкин
        01 июня 2016, 08:45
        anatolyutkin, я не о итоговой системе, хотел чуть дополнить Вашу статью о подходе к построению систем. На неполных данных никогда не узнать что придет раньше стоп или тейк на одной свечке. И ставя тейк перед стопом разработчик немного лукавит перед самим собой. В итоге потраченное время, деньги. А стоп перед тейком покажет " изнанку" стратегии.
        • SergeyJu
          01 июня 2016, 11:34
          СыроеШкин, есть много способов совершить ошибку :)
  • Мурен(а)
    03 июня 2016, 11:27
    Спасибо за статью! а почему некоторые интересные вещи на смартлабе не дублируете? Например, «Инвестиции в личный структурный продукт»
      • Мурен(а)
        03 июня 2016, 12:15
        anatolyutkin, мне кажется надо принять хамов смартлаба как есть и отвечать в шутку или не отвечать вообще. Это как в деревне идешь и периодически встречаешь навоз и кучи от коров. Сделать ничего не можешь, а просто перешагиваешь. жизнь есть жизнь. 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн