Блог им. Quantrum
Индикатор MACD широко известен среди трейдеров. Мне его сигналы помогают находить развороты и предупреждения о коррекциях. Много написано, как использовать его сигналы для открытия позиций, а мы сегодня рассмотрим прикладное применение в алготрейдинге.
Все будет тестироваться на Quantopian (см. сюда), писать код будем на Python. Рассмотрим следующие стратегии:
Индикатор основан на экспоненциальных скользящих средних и показывает их пересечения. Когда основная линия MACD над нулем, это означает, что быстрая средняя находится над медленной, а цена растет в краткосрочном периоде. Положение гистограммы над нулем говорит о росте цены. Дополнительно на индикаторе ищут расхождения движения цены и сигнальных линий, что может предупредить о развороте тенденции, но это уже другая история.
Базовые параметры:
Разница первых двух используется для построения линии MACD. Сигнальная линия сглаживает линию MACD. Разница сигнальной и линии MACD дают гистограмму.
Исходя из теории и графика, предположим, что при пересечении любой составляющей индикатора MACD нуля снизу вверх сообщает нам, что цена начала расти. Гистограмма дает сигнал раньше всех и обладает большим количеством ложных сигналов, линия MACD дает меньше сигналов, а самая чистая должна быть сигнальная линия.
Исходя из этого, мы должны входить в рынок только на росте и будем брать все растущие движения. Звучит отлично!
Условия тестирования:
Начнем с простого теста, попробуем покупать актив по факту пересечения нуля снизу вверх каждой составляющей индикатора MACD: гистограмма, линия, сигнальная линия. Каждый день будем брать 40 дней истории и рассчитывать значения индикатора с помощью библиотеки ta-lib. Внизу графики тестов:
Гистограмма
Данные оказались обратными предположению, гистограмма дает наилучший результат, затем идет линия, а хуже всех показатели у сигнальной. Пристальное изучение позволило найти ошибку, все дело в нестабильном периоде экспоненциальной средней (EMA). Ее значения напрямую зависят от длины анализируемой истории. Если история короткая, то библиотека ta-lib рассчитывает ее равной обычной скользящей средней (SMA). А это дает удивительно большую ошибку, так как сам MACD весь состоит из EMA.
Увеличив период истории сразу до 500 дней, исключим любой намек на подобные ошибки и получим результаты, которые и предположили. Далее рассмотрим стратегию «Как есть».
Простой подход, чтобы посмотреть, как алгоритм работает. Какие результаты будут для каждого сигнала и, может быть, нас это наведет на какие-то интересные мысли. Сводная таблица результатов доступна в конце статьи. Графики результатов (правильных на этот раз) доступны ниже. Гипотеза подтвердилась:
Код алгоритма: (Код доступен на Quantrum.me)
Так как мы торгуем только в лонг и у нас есть просадка в -20%, попробуем добавить стопы в 3% от цены открытия. До этого мы закрывались при пересечении сигнальной линией MACD и нуля. Теперь будем контролировать просадку и закрываться за час до конца торгов, если цена опустилась ниже 3% порога.
На графике ниже видны не сногсшибательные результаты. Удалось отыграть ~1% просадки и поплатиться частью прибыли. Дополнительно поставлен фильтр, чтобы алгоритм не перезаходил на падающей цене — цена предыдущего дня должна быть ниже текущей.
Код алгоритма ниже: (Код доступен на Quantrum.me)
Раз не получилось выжать из алгоритма со стопами, попробуем торговать в обоих направлениях. Предыдущие опыты подсказывают, что хорошего может ничего не получиться, но надо проверять.
Удалось заметить, что основные проблемы случаются в моменты боковиков или резких подъемов и падений за короткие промежутки времени. Избавиться от этих проблем можно фильтрацией волатильности и боковиков.
Код торговли в двух направлениях не публикую, там минимум изменений. Если нужно, пишите в комментариях, вышлю на почту.
Отфильтруем волатильность и боковикиВолатильность будем фильтровать повышенным значением ATR относительно среднего за последние 200 дней. Боковики постараемся найти положением средних, когда SMA20 находится в 1,5% от SMA50. В это время позиции не открываем.
Результаты показывают, что купи-держи значительно лучше, а вот просадку удается сократить до 13%. Хоть что-то…
Код алгоритма ниже: (Код доступен на Quantrum.me)
Стратегия | Время торгов | Кол-во сделок | PnL | Доходность | Просадки |
---|---|---|---|---|---|
Купи-Держи | Open | 53/0 | - | 160.1% | -54.9% |
Как есть: гистограмма | Open+1 | 163/163 | 13% | 30.8% | -29.3% |
Как есть: линия MACD | Open+1 | 69/68 | 19% | 68% | -22.3% |
Как есть: сигнальная линия | Open+1 | 40/39 | 19% | 90.2% | -21.6% |
Стоп-лосс | Open+1 | 92/91 | 18% | 77% | -19% |
В обе стороны | Open+1 | 40/39 | 6% | 28% | -27% |
Фильтр | Open+1 | 24/23 | 19% | 49.6% | -12.9% |
Результаты тестов показывают, что в голом виде индикатор MACD не подходит для создания несметного богатства, во всяком случае на SPY. Удивительно, но обнаружил относительно хорошее поведение MACD и QQQ (здесь не публикую, попробуйте сами), в сравнении с другими «голыми» индикаторами.
Можно продолжать поиск решений как отфильтровать боковики или пилу. Можно попробовать подбирать разные настройки индикатора для разных активов в разные периоды. А можно его отложить до лучших времен и перейти к тестированию импульсной стратегии, основанной на ATR, которую я рассмотрю на следующей неделе.
Напишите в комментариях, как можно улучшить алгоритм с MACD. Где корень неудач? Или предложите, какие стратегии стоит рассмотреть в будущем. Учитывайте, что это учебная статья, а не законченный алгоритм.
надо РСИ взять
на часовике. если пересекло 70 то лонг, если пересекло 30 то шорт.
Почему работало? Потому что когда на часовике пересекло 70, это на дневке примерно 50 и все только заходить начинают в тренд. А стадо начинает шортить 70 на часовике, перекупленность же. Ну и шорт так же.
Года 2 не проверял, может снова заработало
если Вас интересует мое мнение — торговые системы надо делать на Машинном обучении (классические Supervised Learning или даже Deep learning ) — тогда _может быть_ будет какой то шанс
Рекомендую посмотреть вот это соревнование на Kaggle, которое уже закончилось
Суть соревнования: Проп-трейдинг контора слила обезличенную базу данных Features (что то наподобие минуток — не только цена и объем торговли актива, но возможно что какие то некоррелированные с ним Features), и требуется предсказать ожидаемую цену актива
Я думаю, что если вы покопаетесь в Kernels этого соревнования, вы там найдете много интересного, особенное если уже программируете на Питоне
Часто победители соревнований публикуют свой код целиком, я думаю что лучшего источника вдохновения не найти :-)
Я про свои эксперименты с машинным обучением писал в своем блоге, но потом начал участвовать в соревнованиях на Kaggle, и понял, как я был наивен… Сейчас в срочном порядке учу нейронные сети и прочий Deep Learning (и кагглю помаленьку)
Александр Румянцев, Чем больше практики, тем больше понимания — да, это универсальная схема)).
У меня опыт работы с данными имеется неплохой, просто более классическими методами. То, что вы написали — похоже на достаточно универсальные вещи, которые понимаешь, просто работая с данными — любыми методами, так что пока уберу с ML методов ярлычок «космические технологии» и как руки дойдут — попробую)
можно строить features как производные от цены и объема (технические индикаторы те же)
можно грузить изменения цены других активов
Есть куча контор, которые специализируются на майнинге таких вот индикаторов (social network sentiment). Некоторые чуть ли не железнодорожные вагоны считают и траки на дорогах.
Некоторые бродят по магазинам и считают посетителей.
когда я робко строил свою первую торговую систему на основе ML, самым полезным feature был день недели, как ни странно :-)
Я взял приблизительно 8 курсов на разные темы — в основном на Udacity, плюс изучал (давно) линейную алгебру и статистику в Бауманке, а там ее преподавали хорошо. И все равно это только заложило какие то основы
Искуственный интеллект, увы, нельзя взять наскоком, особенно — если вы хотите еще при этом понять, как он работает
Нелегко роботами отрегулировать
Свежее решение...
Может сначала почитать что другие делали и описывали 100 лет?
А хотя свой велосипед всегда вкуснее.
Данные общедоступные, а вот закономерности скрыты. + какие-то закономерности непривлекательны для большинства игроков (имею в виду игроков, которые эффективно находят закономерности), например, по причине низкой ёмкости. Магазины у дома находят же свою нишу даже в эру крупных ритейлеров, а если магазин у дома достаточно талантлив, он и сам может перерасти в сеть)))
Почему нельзя- потому что против вас работает весь мир математиков со всеми его ресурсами ( прямо по Доу)
Почему можно — потому что есть мозг, как он работает никто не знает ( в том числе и весь мир не может просчитать вас даже на минуту вперед ). То бишь опыт.
Если сказать просто то движения на рынке есть, то есть тренды есть, но КОГДА наступает это движение- совершенно случайные моменты. То есть движняк будет, но через 5 минут или через 10 лет НИКАК не узнать, потому что это зависит от людей, какая возжа их подстегнет хз, или там небоскребы, а может вдруг что-то само собой рассосется… ну я думаю мысль ясна.
Ну естественно если вы не математический гений, но это уже другая история и вероятность этого сильно маленькая.
Дополню. Исходя из сказанного вывод — можно поймать начало движения, но определить конец движения невозможно математически. Наверное именно поэтому у практиков считается лучшим «купил и держи». Лично для себя я переформулировал «поймал и вышел как накапало на мерседес»
Вероятность такого подхода вы не сможете никак определить, потому что процесс открыт во времени и кроме того не доказуем фактическими (фундаментальными) причинами получения прибыли.