Эта обучающая заметка призвана раскрыть некоторые элементы технологии производства торговых систем. Существует два основных подхода к созданию биржевых алгоритмов. Первый стартует с некой идеи, например--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 (На всякий случай и если кто не в курсе--это не торгуемо :) :) :) ). А вообще, эта стадия очень важна, и торговать не понимая смысла--нельзя.
Краткое резюме. На простом и понятном примере показан датамайнинговый подход к построению торговых систем.
я это понимаю.
Просто концовка была прекрасна :)
Это удобный пример, я ж не буду в качестве примера рабочие системы выкладывать. А этот принцип вполне хорош вплоть до стадии реальных торгов.
хороший пост.
«А когда же будут разоблачения» — это в библиотеку на полку Булгакова.
— можно на базе RL попробовать смоделировать работу трейдера
— искать закономерности с теми же LSTM (grid LSTM лучше)
— два первых пунктах в применении к широкому рынку (управление портфелем) — эта тема более интереса проще продать
в июне стартую небольшой рисерч проект на эту тему, кому интересно прошу в команду — английский язык, понимание RL (хотя бы в границах книги sutton & barto) и нейросетей
для среднесрочных моделей думаю нужно будет учесть разные фазы рынка (бычий медвежий и флет)
смысл дропаута в двух словах — отключают часть нейронов (с вероятностью p, часто берут 0.5) и насколько сеть устойчива к потере связей/нейронов, используют в основном в deep learning (много слоев, нейронов, связей), где в противном случае очень легко скатиться в оверфиттинг
Это вряд ли можно назвать майнингом. Посмотрите литературу на тему DataMining, там методы совсем иные. У вас скорее метод тыка/подгонки. Если много обезьян посадить за печатную машинку, то рано или поздно они что-нибудь издадут… Как вы сами отличаете что это рабочее или нерабочее (не подгон под историю)?
www.youtube.com/watch?v=fd53wj7dagA&feature=youtu.be&t=1m3s
«пипл хавает» ©
В настоящих, торгуемых системах зачастую не меньшая прозрачность. Но не всегда. Бывают и достаточно мутные вещи--им и лот поменьше, и внимания побольше.
Скажу больше, почему какой-нибудь SVM или Random Forest или генетическая или еще какая оптимизация нейронной сети — датамайнинг, а головой и руками — низзя?
Умные американские люди так не считали. Посмотрите на книгу Тьюки, никто не назовет его дилетантом:
www.twirpx.com/file/197583/
По сути заданных вопросов — торговать первую минуту? Легко и просто. Быстрые сервера, плаза, логины на 600 транзакций в секунду, стописят тысяч на инфраструкртуру ежемесячно. Ну и на тестах взять тики и закодить что вход не ранее 600го тика, а то и не ранее 1000го.
Если все будет так же — берем и торгуем.
Первую секунду вроде Женя пытался торговать лет пять назад. Не знаю, успешно или нет.
Майнер. Это только вступление.
Конкретно здесь это не важно, так как расстояние между стопом и тейком равно 1%, что для минуток RI много. И поэтому одновременные срабатывания стопа и тейка редки и ими можно пренебречь (если только на первой минуте той же, но с ней мы разобрались уже). Но для более крупных таймфреймов то, что вы говорите--важно. И это резон тестировать на минимально возможных фреймах--минутках, а то и тиках при необходимости.
Грубо, так. Есть жж, есть смартлаб. Жж полуумерший, но там сложился определенный круг людей. Там можно написать и более душевные тексты. Смартлаб--самый широкий охват людей, есть вероятность встретить кого-то нового и толкового. Другая сторона медали--велика вероятность нарваться на хамство, собственно, почти в каждой моей публикации есть комменты на грани фола. Поэтому на смарте я публикую статьи по делу, где в комментах трудно лить воду, а хамство сразу видно и ничего, кроме презрения, у адекватных людей не вызывает.