Блог им. anatolyutkin

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

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

Краткое резюме. На простом и понятном примере показан датамайнинговый подход к построению торговых систем.
★51
42 комментария
Прекрасное чувство юмора
avatar
Redline, Гы. Спасибо :) Хотя статья то не юморная. Аналогичными методами делаются вполне себе рабочие вещи. 
avatar
anatolyutkin, 
я это понимаю.
Просто концовка была прекрасна :)
avatar
Redline, Ну это биржа. Не место для альтруизма. Я и так себя неуютно чувствую--больно уж много написал всего, да и плюсы то все от уважаемых людей, что не совсем однозначно гут :) Альтруизм--зло :) :) :)
avatar
как детектив, в котором убийца оказался тем, кто громче всех плакал на похоронах…
avatar
vladimir doigt, Да ну какой детектив. Тут же все ясно с самого начала. Грубо говоря, на фортсе стопы всегда надо тестировать с учетом первой минуты. Потому что если хоть в каком-то месте алгоритма есть стоп--он внесет дополнительный, но неторгуемый эдж. 

Это удобный пример, я ж не буду в качестве примера рабочие системы выкладывать. А этот принцип вполне хорош вплоть до стадии реальных торгов. 
avatar
anatolyutkin, 
хороший пост.
«А когда же будут разоблачения» — это в библиотеку на полку Булгакова.
avatar
anatolyutkin, это только относительно данной системы стопы надо тестировать с учётом первой минуты. Они (стопы) вещь вообще бывает порой живёт своей жизнью, даже если и жестко привязаны к входам...))
avatar
Dio, если в некоем алгоритме есть условные заявки типа «куплю если цена выше чего-то» или «продам если цена ниже чего-то», которые могут срабатывать в 10:00, то такой алгоритм на тесте имеет преимущество, нереализуемое на практике. 
avatar
anatolyutkin, вполне возможно.
avatar
Ух! Сегодня на смартлабе волна отличных постов по теме алготрейдинга!!!
Тимофей Мартынов, Гыгыгы. Летнее обострение :)
avatar
Хм. Интересно. Но фактически все что сделали, взяли систему и выкинули из нее отрицательные сделки. Подобный подход в out of sample покажет убыток, даже если бы эта минута была б не 10:00.
avatar
evgen000, Да нет. Выкинули только то, что к принципу не имеет отношения. И пока сессия на Фортсе начинается в 19:00, этот принцип будет генерировать плюс, хоть ООS, хоть IS, хоть как. Можете проверить на других фьючах, на RI с июня 2015 или еще где. 
avatar
crazyFakir, Высочайший уровень дискуссии :) 
avatar
anatolyutkin, ок
1. используешь сурогат вместо данных — OHLC
2. что именно ты называешь тут майнингом и на каком формальном основании?

это реально выглядит клоунадой.

о чем  ты предлагаешь тут дискутировать?
где предмет? :)
avatar
crazyFakir, ну, не всем же с полным ордерлогом воевать. Чем больше объем капитала в управлении, тем бОльшие таймфреймы приходится окучивать, тем меньше влияние микроструктуры рынка. Если торговать, например, пятнашки, то вполне достаточно к OHLC добавить в реале лучший бид и аск. А для анализа и того не надо.
avatar
только нейросети, только хардкор
— можно на базе RL попробовать смоделировать работу трейдера
— искать закономерности с теми же LSTM (grid LSTM лучше)
— два первых пунктах в применении к широкому рынку (управление портфелем) — эта тема более интереса проще продать

в июне стартую небольшой рисерч проект на эту тему, кому интересно прошу в команду — английский язык, понимание RL (хотя бы в границах книги sutton & barto) и нейросетей
avatar
nbvehrfr, как подтверждать статистически собираетесь закономерности? 
avatar
Alex Hurko, если вы про оверфиттинг то кроссвалидацией, дропаутом (для нейросетей конкретно)
для среднесрочных моделей думаю нужно будет учесть разные фазы рынка (бычий медвежий и флет)
avatar
nbvehrfr, спасибо. Не знаю насколько эти модели применимы к нейросетям. А есть может линки у вас на исследования/примеры подобные? Интересна именно проверка на устойчивость/стат. значимость.
avatar
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 (много слоев, нейронов, связей), где в противном случае очень легко скатиться в оверфиттинг
avatar

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

avatar
Alex Hurko, методы  и практика могут быть разными, но тут нет даже намека. смердит и Тима восхищен.

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

«пипл хавает» ©
avatar
Alex Hurko, Ну какой подгон под историю? Тут же ясный, очевидный принцип.

В настоящих, торгуемых системах зачастую не меньшая прозрачность. Но не всегда. Бывают и достаточно мутные вещи--им и лот поменьше, и внимания побольше.
avatar
Alex Hurko, а чем, собственно, эвристически сокращенный перебор хуже датамайнинга?
Скажу больше, почему какой-нибудь SVM или Random Forest или генетическая или еще какая оптимизация нейронной сети — датамайнинг, а головой и руками — низзя?
Умные американские люди так не считали. Посмотрите на книгу  Тьюки, никто не назовет его дилетантом:
www.twirpx.com/file/197583/

avatar
SergeyJu, Да. На бирже голова и руки существенно убыстряют и улучшают качество процесса :) 
avatar
пришли матерые датамайнеры и указали автору его место, ага. 


По сути заданных вопросов — торговать первую минуту? Легко и просто. Быстрые сервера, плаза,  логины на 600 транзакций в секунду, стописят тысяч на инфраструкртуру ежемесячно. Ну и на тестах взять тики и закодить что вход не ранее 600го тика, а то и не ранее 1000го. 
Если все будет так же — берем и торгуем. 
avatar
silentbob, Да самфшоке :) 

Первую секунду вроде Женя пытался торговать лет пять назад. Не знаю, успешно или нет.
avatar
anatolyutkin, ну, история погони за первыми сделками на открытии в 10-00, когда с ночи стоят неадекватные заявки, насчитывает не один год. Емкость таких систем ничтожная, а конкуренция требовала все более высоких скоростей. Историк трейдинга мог бы дисер, я полагаю, написать.
avatar
SergeyJu, Кстати да :) Классная работа бы вышла :)
avatar

М
айнер. Это только вступление. 
avatar
Попробуйте в коде в первых примерах поставить выход по стопу перед выходом по тейку.
avatar
СыроеШкин, Зачем? В данной статье это не важно, ведь в итоговом коде ни стопа ни тейка нет. 
avatar
anatolyutkin, я не о итоговой системе, хотел чуть дополнить Вашу статью о подходе к построению систем. На неполных данных никогда не узнать что придет раньше стоп или тейк на одной свечке. И ставя тейк перед стопом разработчик немного лукавит перед самим собой. В итоге потраченное время, деньги. А стоп перед тейком покажет " изнанку" стратегии.
avatar
СыроеШкин, Это да. С этим я согласен. 

Конкретно здесь это не важно, так как расстояние между стопом и тейком равно 1%, что для минуток RI много. И поэтому одновременные срабатывания стопа и тейка редки и ими можно пренебречь (если только на первой минуте той же, но с ней мы разобрались уже). Но для более крупных таймфреймов то, что вы говорите--важно. И это резон тестировать на минимально возможных фреймах--минутках, а то и тиках при необходимости.
avatar
СыроеШкин, есть много способов совершить ошибку :)
avatar
Спасибо за статью! а почему некоторые интересные вещи на смартлабе не дублируете? Например, «Инвестиции в личный структурный продукт»
avatar
Мурен(а), Мурен(а), Дык всегда пожалуйста. Хорошая статья получилась, да. Народ аж возмущается в жж, типа нечего страшные тайны открывать :) Я бы сказал, не публикую из-за наличия на смартлабе большого количества малоадекватных людей. Зачем мне слушать нравоучения вплоть до хамства от людей, которые вряд ли хоть в чем-то меня лучше? А на статью про личный структурник таких, имхо, будет предостаточно. Меня и тут то датамайнингу решили поучить, хаха :) Люди, которым мое творчество полезно, и в жж меня найдут или в личке.
avatar
anatolyutkin, мне кажется надо принять хамов смартлаба как есть и отвечать в шутку или не отвечать вообще. Это как в деревне идешь и периодически встречаешь навоз и кучи от коров. Сделать ничего не можешь, а просто перешагиваешь. жизнь есть жизнь. 
avatar
Мурен(а), Ну дык я так и делаю, но осадочек то остается.

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

теги блога anatolyutkin

....все тэги



UPDONW
Новый дизайн