Блог им. Quantrum

Бэктестинг: алгоритм на основе MACD

Индикатор MACD широко известен среди трейдеров. Мне его сигналы помогают находить развороты и предупреждения о коррекциях. Много написано, как использовать его сигналы для открытия позиций, а мы сегодня рассмотрим прикладное применение в алготрейдинге.

Все будет тестироваться на Quantopian (см. сюда), писать код будем на Python. Рассмотрим следующие стратегии:

  • Что надо знать и как не надо делать.
  • Как есть: гистограмма, линия MACD, сигнальная.
  • Добавим стоп-лосс.
  • Торгуем в двух направлениях.
  • Отфильтруем боковики и волатильность.

Пара слов о MACD

Бэктестинг: алгоритм на основе MACDИндикатор основан на экспоненциальных скользящих средних и показывает их пересечения. Когда основная линия MACD над нулем, это означает, что быстрая средняя находится над медленной, а цена растет в краткосрочном периоде. Положение гистограммы над нулем говорит о росте цены. Дополнительно на индикаторе ищут расхождения движения цены и сигнальных линий, что может предупредить о развороте тенденции, но это уже другая история.

Базовые параметры:

  • быстрая скользящая — EMA(12)
  • медленная скользащая — EMA(26)
  • сигнальная линия — EMA(9)

Разница первых двух используется для построения линии MACD. Сигнальная линия сглаживает линию MACD. Разница сигнальной и линии MACD дают гистограмму.

Гипотеза

Исходя из теории и графика, предположим, что при пересечении любой составляющей индикатора MACD нуля снизу вверх сообщает нам, что цена начала расти. Гистограмма дает сигнал раньше всех и обладает большим количеством ложных сигналов, линия MACD дает меньше сигналов, а самая чистая должна быть сигнальная линия.

Исходя из этого, мы должны входить в рынок только на росте и будем брать все растущие движения. Звучит отлично!

Условия тестирования:

  • SPY
  • c 01/01/2004 до 30/12/2016 (13 лет)
  • торгуем спустя 1 час после открытия рынка

Что надо знать и как не надо делать

Начнем с простого теста, попробуем покупать актив по факту пересечения нуля снизу вверх каждой составляющей индикатора MACD: гистограмма, линия, сигнальная линия. Каждый день будем брать 40 дней истории и рассчитывать значения индикатора с помощью библиотеки ta-lib. Внизу графики тестов:

Бэктестинг: алгоритм на основе MACDГистограмма
Бэктестинг: алгоритм на основе MACDЛиния MACD
Бэктестинг: алгоритм на основе MACDСигнальная линия

 

Данные оказались обратными предположению, гистограмма дает наилучший результат, затем идет линия, а хуже всех показатели у сигнальной. Пристальное изучение позволило найти ошибку, все дело в нестабильном периоде экспоненциальной средней (EMA). Ее значения напрямую зависят от длины анализируемой истории. Если история короткая, то библиотека ta-lib рассчитывает ее равной обычной скользящей средней (SMA). А это дает удивительно большую ошибку, так как сам MACD весь состоит из EMA.

Увеличив период истории сразу до 500 дней, исключим любой намек на подобные ошибки и получим результаты, которые и предположили. Далее рассмотрим стратегию «Как есть».

Как есть: гистограмма, линия MACD, сигнальная

Простой подход, чтобы посмотреть, как алгоритм работает. Какие результаты будут для каждого сигнала и, может быть, нас это наведет на какие-то интересные мысли. Сводная таблица результатов доступна в конце статьи. Графики результатов (правильных на этот раз) доступны ниже. Гипотеза подтвердилась:

  • Гистограмма дает много сигналов, но среди них много ложных.
  • Линия MACD уже чище и показывает лучшие результаты.
  • Сигнальная линия дает наибольшую прибыль и наименьшую просадку.
Бэктестинг: алгоритм на основе MACDГистограмма
Бэктестинг: алгоритм на основе MACDЛиния MACD
Бэктестинг: алгоритм на основе MACDСигнальная линия

Код алгоритма: (Код доступен на Quantrum.me)

Добавим стоп-лосс

Так как мы торгуем только в лонг и у нас есть просадка в -20%, попробуем добавить стопы в 3% от цены открытия. До этого мы закрывались при пересечении сигнальной линией MACD и нуля. Теперь будем контролировать просадку и закрываться за час до конца торгов, если цена опустилась ниже 3% порога.

На графике ниже видны не сногсшибательные результаты. Удалось отыграть ~1% просадки и поплатиться частью прибыли. Дополнительно поставлен фильтр, чтобы алгоритм не перезаходил на падающей цене — цена предыдущего дня должна быть ниже текущей.

Бэктестинг: алгоритм на основе MACD

Код алгоритма ниже: (Код доступен на Quantrum.me)

Торгуем в двух направлениях

Раз не получилось выжать из алгоритма со стопами, попробуем торговать в обоих направлениях. Предыдущие опыты подсказывают, что хорошего может ничего не получиться, но надо проверять.

Бэктестинг: алгоритм на основе MACD

Удалось заметить, что основные проблемы случаются в моменты боковиков или резких подъемов и падений за короткие промежутки времени. Избавиться от этих проблем можно фильтрацией волатильности и боковиков.

Код торговли в двух направлениях не публикую, там минимум изменений. Если нужно, пишите в комментариях, вышлю на почту.

Отфильтруем волатильность и боковики

Волатильность будем фильтровать повышенным значением ATR относительно среднего за последние 200 дней. Боковики постараемся найти положением средних, когда SMA20 находится в 1,5% от SMA50. В это время позиции не открываем.

Результаты показывают, что купи-держи значительно лучше, а вот просадку удается сократить до 13%. Хоть что-то…

Бэктестинг: алгоритм на основе MACD

Код алгоритма ниже: (Код доступен на 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%
  • Время торгов — время, когда алгоритм начинает торговать: Open — открытие рынка, Open+1 — через 1 час после открытия рынка.
  • Кол-во сделок — количество сделок на покупку и продажу. В поле указаны Покупки/Продажи.
  • PnL — отношение прибыльных дней к убыточным. Если прибыльных больше — значение положительное.

Заключение

Результаты тестов показывают, что в голом виде индикатор MACD не подходит для создания несметного богатства, во всяком случае на SPY. Удивительно, но обнаружил относительно хорошее поведение MACD и QQQ (здесь не публикую, попробуйте сами), в сравнении с другими «голыми» индикаторами.

Можно продолжать поиск решений как отфильтровать боковики или пилу. Можно попробовать подбирать разные настройки индикатора для разных активов в разные периоды. А можно его отложить до лучших времен и перейти к тестированию импульсной стратегии, основанной на ATR, которую я рассмотрю на следующей неделе.

Напишите в комментариях, как можно улучшить алгоритм с MACD. Где корень неудач? Или предложите, какие стратегии стоит рассмотреть в будущем. Учитывайте, что это учебная статья, а не законченный алгоритм.

★14
61 комментарий
Катс, Маккормик. Энциклопедия торговых стратегий. Изучайте.
avatar
buy_sell, Благодарю. 
ну в рот коня… как говорят воспитанные люди

надо РСИ взять
на часовике. если пересекло 70 то лонг, если пересекло 30 то шорт. 
Почему работало? Потому что когда на часовике пересекло 70, это на дневке примерно 50 и все только заходить начинают в тренд. А стадо начинает шортить 70 на часовике, перекупленность же. Ну и шорт так же. 
Года 2 не проверял, может снова заработало
avatar
silentbob, Благодарю, поставил себе в план. Напишу тест, сделаю статью.
Спасибо за детальный подход
если Вас интересует мое мнение — торговые системы надо делать на Машинном обучении (классические Supervised Learning или даже Deep learning ) — тогда _может быть_ будет какой то шанс
Рекомендую посмотреть вот это соревнование на Kaggle, которое уже закончилось
Суть соревнования: Проп-трейдинг контора слила обезличенную базу данных Features (что то наподобие минуток — не только цена и объем торговли актива, но возможно что какие то некоррелированные с ним Features), и требуется предсказать ожидаемую цену актива
Я думаю, что если вы покопаетесь в Kernels этого соревнования, вы там найдете много интересного, особенное если уже программируете на Питоне
Часто победители соревнований публикуют свой код целиком, я думаю что лучшего источника вдохновения не найти :-)
Я про свои эксперименты с машинным обучением писал в своем блоге, но потом начал участвовать в соревнованиях на Kaggle, и понял, как я был наивен… Сейчас в срочном порядке учу нейронные сети и прочий Deep Learning (и кагглю помаленьку)
avatar
Андрей Л (division_by_zero), Я так понимаю, когда речь идёт о машинном обучении и трейдинге — это речь о анализе сырых низкоуровневых данных навроде самих свечек, объёмов и т.д.? Я с ML не сильно знаком конечно)), но как считаете, насколько применимо ML для анализа результатов оптимизации (прогонов) — данные такого же плана — те же строчки, те же параметры) — ну всмысле параметры конечно другие), но принцип организации данных тот же. Есть у меня просто одна идейка, похожая на ML, но которую я могу реализовать ничего не понимая в ML и не шаря в математике)), применительно именно к таким данным. Просто в этих данных, как мне кажется, данных меньше и корреляции и закономерности ближе к поверхности лежат, легче раскапывать))
avatar
Андрей Л (division_by_zero), Аа, ещё хотел спросить, насколько нужно знание математики и прочих связанных дисциплин при работе с ML по вашему мнению? Когда пытался вникнуть даже в простейшие методы, меня отпугивали потоки формул (и это даже в простейших методах), но тут один товарищ сказал, что с текущими наборами библиотек (для того же Питона, например), знания математики для реализации ML методов по сути не требуется, вся математика уже зашита в библиотеки, а для работы с методами достаточно понимать принципы, можно ли это вытянуть на логическом мышлении и общей эрудиции?))
avatar
Replikant_mih, смотря какого плана эрудиция — если в области машинного обучения, то наверное можно. Библиотеки дают только более-менее эффективные реализации алгоритмов, предположительно с минимумом багов. Но выбрать-то алгоритм надо самому, данные в него запихать, проверить что получилось и работает ли то что получилось ну и т.д.
Zweroboi, Ну, звучит как будто логического мышления для этих всех операций должно хватить))
avatar
Replikant_mih, в машинном обучении необходимо правильно подготовить данные. Какие признаки нужны, какие не нужны, какие будут мешать. Например, как в единицу времени понять направление цены, её скорость изменения, возможность оклонения и направления этого отклонения. Распределить веса каждого признака. Подготовив признаки можно прогнать их по доступным библиотеками и посмотреть результаты. А потом крутить ручки и думать, что за что отвечает. Чем больше практики, тем больше понимание.

Александр Румянцев, Чем больше практики, тем больше понимания — да, это универсальная схема)). 

У меня опыт работы с данными имеется неплохой, просто более классическими методами. То, что вы написали — похоже на достаточно универсальные вещи, которые понимаешь, просто работая с данными — любыми методами, так что пока уберу с ML методов ярлычок «космические технологии» и как руки дойдут — попробую)

avatar
Replikant_mih, На Coursera есть несколько бесплатных доступных курсов от Яндекса. Они постоянно открыты. Там галопом по ML на Python. Общее понимание появляется. Закрепить можно популярным курсом от Стэнфорда.
Александр Румянцев, Александр, спасибо! Я на фэйсбуке что-то такое видимо лайкнул — теперь постоянно там реклама и ссылки на всякие дата-майнинг, машин лёрнинг курсы показываетя))
avatar
Zweroboi, по моему опыту на Kaggle, основная сложность заключается в т.н. Feature engineering — то есть подбору входных параметров, их очистке и т д
avatar
Андрей Л (division_by_zero), ну на Kaggle они хотя бы есть уже какие-то с чего начать подбирать и очищать. А на рынке что? Ну цена, ну объём. Тут большинство вообще в терминах свечей и баров мыслит )) 
Zweroboi, подбор features — в этом, на мой взгляд, и заключается грааль машиноого обучения 
можно строить features как производные от цены и объема (технические индикаторы те же)
можно грузить изменения цены других активов
Есть куча контор, которые специализируются на майнинге таких вот индикаторов (social network sentiment). Некоторые чуть ли не железнодорожные вагоны считают и траки на дорогах.
Некоторые бродят по магазинам и считают посетителей.
когда я робко строил свою первую торговую систему на основе ML, самым полезным feature был день недели, как ни странно :-)
avatar
Андрей Л (division_by_zero), ну в общем да, как-то так.
Replikant_mih, нужно знание статистики, линейной алгебры, программирования и технологий
Я взял приблизительно 8 курсов на разные темы — в основном на Udacity, плюс изучал (давно) линейную алгебру и статистику в Бауманке, а там ее преподавали хорошо. И все равно это только заложило какие то основы
Искуственный интеллект, увы, нельзя взять наскоком, особенно — если вы хотите еще при этом понять, как он работает
avatar
Андрей Л (division_by_zero), Спасибо! Мне не принципиально понять, как работает), принципиально чтобы работало)).
avatar
Replikant_mih, тогда курсов Яндекса будет достаточно. Там азы даются хорошо, с примерами.
Андрей Л (division_by_zero),  за счет обработки обще известной информации (рыночные данные) достигнуть математически значимого преимущества без инфраструктуры очень трудно. В целом, это тупиковый путь.
avatar
Григорий, На сегодня, благодаря GPU и таким библиотекам, как TensorFlow, даже в подвале можно создавать примитивный Искусственный Интеллект. И понимание играет большую роль, нежели мощности.
Андрей Л (division_by_zero), Благодарю. Часто, успех в машинном обучении обусловлен правильной подготовкой данных и признаков. А чтобы правильно подготовить данные, необходимо глубокое понимание простых индикаторов и времянных рядов. Сейчас публикую статьи именно с этой целью, чтобы максимально охватить примитив и задокументировать результаты. 
Мацд и плюс рси и параболик.но система может не срабатывать.мацд у вас боковик имело.слева нижняя выше правой следующая может вниз ещо ниже.касательную обычно строить.
Нелегко роботами отрегулировать
А почему гипотеза такая, а не какая-то другая? Можно не ноль пересекать, а что угодно другое, попробовать побольше вариантов, найти лучшие. Правда это уже переподгонка, но если бы с пересечением нуля был бы хороший результат, предположим — то она всё равно имела бы место быть ) А вообще, конечно, если такие примитивные подходы и работали когда-то, то больше уже нет и не будет.
Zweroboi,
Zweroboi, Это предположение. Вы правы, можно пересекать все что угодно. Для этого выкладываю исходный код. Может кто-нибудь чего-нибудь для себя пересечет.
Вариант подбора двумя рси разными периодами норм с временным интервалом подбором.
френк френков, благодарю. Попробую пересечение RSI с разными периодами.
Александр Румянцев, я обленился но много выигрышных понефти младшие таймы.робот делает.Интер пост нужен и рси может днями идти. Эти два фактора тяжелы для чела
френк френков, буду пробовать, а вы направите, если что пропущу. Хотя бы будет, где ЦУ давать.
пустое, даже не копайте в этом направлении. Нельзя заработать на общеизвестных индюках.
avatar
Григорий, Бэктестинг на основе МАСД делали еще 100 лет назад.
Свежее решение...
Может сначала почитать что другие делали и описывали 100 лет?

А хотя свой велосипед всегда вкуснее.
avatar
sergik99, Мне кажется это правильный подход, не в смысле MACD — я индикаторы не особо люблю как класс), а в смысле изобретания велосипеда в трейдинге. Те кто ходят по проторенным дорожкам, получает проторенные и результаты, а для результатов хороших нужен креатив, нестандартные подходы и решения, если не ходить самостоятельными тропинками, то и не дойдёшь до результатов недойденных)). Хотя казалось бы тут противоречие — говорю о нехоженных дорожках и при этом одобряю самую хоженную, но на самом деле противоречия нет, если вдуматься).
avatar
Replikant_mih, разве можно выиграть  на рынке у десятков тысяч роботов, которые круглые сутки ищут закономерности бэктестингом?
avatar
Григорий, Вы сейчас намекаете на невозможность зарабатывать на рынке в принципе?) или на невозможность зарабатывать не роботом или на что?)
avatar
Replikant_mih, крайне маловероятно, что Вы со своими скромными возможностями бэктестингом на основе общедоступных рыночных данных найдете закономерность, которую выгодно использовать. 
avatar
Григорий, Ну вы 9 лет на рынке — нашли же, получается, какую-то закономерность).

Данные общедоступные, а вот закономерности скрыты. + какие-то закономерности непривлекательны для большинства игроков (имею в виду игроков, которые эффективно находят закономерности), например, по причине низкой ёмкости. Магазины у дома находят же свою нишу даже в эру крупных ритейлеров, а если магазин у дома достаточно талантлив, он и сам может перерасти в сеть)))
avatar
Replikant_mih, я нашел-стоимостное инвестирование.
avatar
Григорий, стоимостное инвестирование можно улучшить роботом, правильно контролируя тренды. Как известно, фундаментал учитывается поступательно, что заставляет цену рисовать тренд. И здесь самый примитивный робот со скользящими будет лучше человека контролировать открытые позиции. Как минимум.
Александр Румянцев, никакой робот не сможет учесть тот набор факторов, который учитывается хорошим инвестором. Наоборот, крайне затруднительно создать что-то уникальное из общедоступного и общепонятного набора данных. Все закономерности, которые можно раскопать из графика,  роботы выявляют. Но график это примитивизация и ненужное упрощение реального состояния дел.
avatar
Григорий, хорошая торговая система — детально расписанная торговая система. Если все разложено по полочкам, то это можно автоматизировать. Если нет порядка, то нет и системы.
Александр Румянцев, торговая система это попытка упростить зачастую с потерей качества входящей инфы.
avatar
Григорий, проектная документация — попытка принизить великолепие будущего здания. Но в общем с вами согласен, что у профессионала есть чутье, которое тяжело задокументировать.
Александр Румянцев, здание-это детерминированные связи, а попытка детерминировать то, что нельзя детерминировать приводить к излишнему упрощению.
avatar
Григорий, Ну вот, значит закономерности существуют), в т.ч. закономерности, на которых можно заработать, как те, которые составляют нечто, что вы назвали стоимостным инвестированием.
avatar
Григорий, то что сделано человеком, может быть сломано человеком.
Григорий, это изучение основ и простейших индикаторов. При хорошом понимании, это позволит строить правильные признаки для машинного обучения.
VladMih, Благодарю за рекомендацию. В свое время штудировал ее вдоль и поперек. На основе нее год назад разработал анализ дивергенций широкого американского рынка (вот моя статья). Сейчас алгоритм доработан и реализован в системе Trades.Mindspace (здесь можно почитать). Там же можно посмотреть историю результатов. На стыке 2015-2016 алгоритм показывал себя великолепно. На трендовом рынке сигналов меньше.
VladMih, ТСЛаб не знаю. Не работаю с языками Microsoft. Хотя вижу, что под C# много интересных проектов есть. Но религия не позволяет.
Интересная у вас тут беседа. Вставлю свои 3 копейки. После 10 лет торгов я понимаю то, что  заработать на рынке можно, но вечной алгосистемы ( в т.ч. самоуобучающейся и т.п.) найти нельзя (тут по И.Коровину). 
Почему нельзя- потому что против вас работает весь мир математиков со всеми его ресурсами ( прямо по Доу)
Почему можно — потому что есть мозг, как он работает никто не знает ( в том числе и весь мир не может просчитать вас даже на минуту вперед ). То бишь опыт.
Если сказать просто то движения на рынке есть, то есть тренды есть, но КОГДА наступает это движение- совершенно случайные моменты. То есть движняк будет, но через 5 минут или через 10 лет НИКАК не узнать, потому что это зависит от людей, какая возжа их подстегнет хз, или там небоскребы, а может вдруг что-то само собой рассосется… ну я думаю мысль ясна.
Ну естественно если вы не математический гений, но это уже другая история и вероятность этого сильно маленькая.

Дополню. Исходя из сказанного вывод — можно поймать  начало движения, но определить конец движения невозможно математически. Наверное именно поэтому у практиков считается лучшим «купил и держи». Лично для себя я переформулировал «поймал и вышел как накапало на мерседес»
avatar
Суслик, Ну о вечных алго-системах речи и не идёт, разве что на старте (или в случае торговой инфантильности — на протяжении всей трейдерской деятельности) люди ищут такой грааль. Другое дело, что это не 1 или 0, система может быть менее или более робастна, более или менее живуча на рынке. Насчёт «случайным образом» — согласен в части, что нельзя предсказать с вероятностью 100%, но для торговли это и не надо, немного склонить вероятность в свою сторону и уже можно зарабатывать), а это уже намного реалистичней.
avatar
Replikant_mih, Вдумайтесь, то что Вы описали и есть «вечная система». Просто маскируете вы ее  под слова «если моя система перестанет давать прибыль то я ее брошу». Это означает что вы знаете опять же вечный механизм как перескакивать с одной системы на другую.
Вероятность такого подхода вы не сможете никак определить, потому что процесс открыт во времени и кроме того не доказуем фактическими (фундаментальными) причинами получения прибыли.
avatar
Суслик, Нуу да, некий вечный метаграаль), этот метаграаль работает не только в трейдинге!) Нужно иметь некий набор навыков, таланта, чего-то ещё аналогичного, а дальше грааль состоит в настойчивости. Когда я ищу системы я не знаю и не уверен в том, когда я её найду, насколько она будет хороша и т.д., но я знаю, что я её найду, потому что периодически нахожу. Про не доказуемость не совсем понял, о чём речь — о конкретной системе или о этой метасистеме). В любом случае индуктивные методы доказательства никто не отменял. 
avatar
VladMih, 1. Вы забыли, что диверы надо смотреть на уровнях.
 а вы не наблюдали что именно пробой уровней частенько «ломает» дивергенцию? Так что я бы сказал наоборот — дивер работает когда далеко до опасных уровней
avatar
VladMih, благодарю за комментарии. Буду перечитывать.
 о конкретной системе или о этой метасистеме
 а это одно и то же, просто метасистема это еще своего рода ММ. Работа с эквити. А с ней работаем также как и с графиком, так что там ничего оригинального нету.
avatar
VladMih, а пояснить?
avatar

теги блога Александр Румянцев

....все тэги



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