Александр Румянцев
Александр Румянцев личный блог
28 марта 2017, 23:05

Бэктестинг: алгоритм на основе 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. Где корень неудач? Или предложите, какие стратегии стоит рассмотреть в будущем. Учитывайте, что это учебная статья, а не законченный алгоритм.

61 Комментарий
  • buy_sell
    28 марта 2017, 23:27
    Катс, Маккормик. Энциклопедия торговых стратегий. Изучайте.
  • silentbob
    28 марта 2017, 23:36
    ну в рот коня… как говорят воспитанные люди

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

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

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

                • Replikant_mih
                  29 марта 2017, 18:40
                  Александр Румянцев, Александр, спасибо! Я на фэйсбуке что-то такое видимо лайкнул — теперь постоянно там реклама и ссылки на всякие дата-майнинг, машин лёрнинг курсы показываетя))
        • Гуру Хренов
          29 марта 2017, 20:27
          Zweroboi, по моему опыту на Kaggle, основная сложность заключается в т.н. Feature engineering — то есть подбору входных параметров, их очистке и т д
          • Пафос Респектыч
            30 марта 2017, 17:37
            Андрей Л (division_by_zero), ну на Kaggle они хотя бы есть уже какие-то с чего начать подбирать и очищать. А на рынке что? Ну цена, ну объём. Тут большинство вообще в терминах свечей и баров мыслит )) 
            • Гуру Хренов
              30 марта 2017, 17:57
              Zweroboi, подбор features — в этом, на мой взгляд, и заключается грааль машиноого обучения 
              можно строить features как производные от цены и объема (технические индикаторы те же)
              можно грузить изменения цены других активов
              Есть куча контор, которые специализируются на майнинге таких вот индикаторов (social network sentiment). Некоторые чуть ли не железнодорожные вагоны считают и траки на дорогах.
              Некоторые бродят по магазинам и считают посетителей.
              когда я робко строил свою первую торговую систему на основе ML, самым полезным feature был день недели, как ни странно :-)
      • Гуру Хренов
        29 марта 2017, 20:22
        Replikant_mih, нужно знание статистики, линейной алгебры, программирования и технологий
        Я взял приблизительно 8 курсов на разные темы — в основном на Udacity, плюс изучал (давно) линейную алгебру и статистику в Бауманке, а там ее преподавали хорошо. И все равно это только заложило какие то основы
        Искуственный интеллект, увы, нельзя взять наскоком, особенно — если вы хотите еще при этом понять, как он работает
        • Replikant_mih
          29 марта 2017, 20:43
          Андрей Л (division_by_zero), Спасибо! Мне не принципиально понять, как работает), принципиально чтобы работало)).
    • Григорий
      29 марта 2017, 09:51
      Андрей Л (division_by_zero),  за счет обработки обще известной информации (рыночные данные) достигнуть математически значимого преимущества без инфраструктуры очень трудно. В целом, это тупиковый путь.
  • френк френков
    29 марта 2017, 00:43
    Мацд и плюс рси и параболик.но система может не срабатывать.мацд у вас боковик имело.слева нижняя выше правой следующая может вниз ещо ниже.касательную обычно строить.
    Нелегко роботами отрегулировать
  • Пафос Респектыч
    29 марта 2017, 00:50
    А почему гипотеза такая, а не какая-то другая? Можно не ноль пересекать, а что угодно другое, попробовать побольше вариантов, найти лучшие. Правда это уже переподгонка, но если бы с пересечением нуля был бы хороший результат, предположим — то она всё равно имела бы место быть ) А вообще, конечно, если такие примитивные подходы и работали когда-то, то больше уже нет и не будет.
    • Дмитрий Жилин
      29 марта 2017, 08:36
      Zweroboi,
  • френк френков
    29 марта 2017, 02:03
    Вариант подбора двумя рси разными периодами норм с временным интервалом подбором.
      • френк френков
        29 марта 2017, 20:24
        Александр Румянцев, я обленился но много выигрышных понефти младшие таймы.робот делает.Интер пост нужен и рси может днями идти. Эти два фактора тяжелы для чела
  • Григорий
    29 марта 2017, 08:20
    пустое, даже не копайте в этом направлении. Нельзя заработать на общеизвестных индюках.
    • sergik99
      29 марта 2017, 09:07
      Григорий, Бэктестинг на основе МАСД делали еще 100 лет назад.
      Свежее решение...
      Может сначала почитать что другие делали и описывали 100 лет?

      А хотя свой велосипед всегда вкуснее.
      • Replikant_mih
        29 марта 2017, 09:27
        sergik99, Мне кажется это правильный подход, не в смысле MACD — я индикаторы не особо люблю как класс), а в смысле изобретания велосипеда в трейдинге. Те кто ходят по проторенным дорожкам, получает проторенные и результаты, а для результатов хороших нужен креатив, нестандартные подходы и решения, если не ходить самостоятельными тропинками, то и не дойдёшь до результатов недойденных)). Хотя казалось бы тут противоречие — говорю о нехоженных дорожках и при этом одобряю самую хоженную, но на самом деле противоречия нет, если вдуматься).
        • Григорий
          29 марта 2017, 09:54
          Replikant_mih, разве можно выиграть  на рынке у десятков тысяч роботов, которые круглые сутки ищут закономерности бэктестингом?
          • Replikant_mih
            29 марта 2017, 10:03
            Григорий, Вы сейчас намекаете на невозможность зарабатывать на рынке в принципе?) или на невозможность зарабатывать не роботом или на что?)
            • Григорий
              29 марта 2017, 11:14
              Replikant_mih, крайне маловероятно, что Вы со своими скромными возможностями бэктестингом на основе общедоступных рыночных данных найдете закономерность, которую выгодно использовать. 
              • Replikant_mih
                29 марта 2017, 11:21
                Григорий, Ну вы 9 лет на рынке — нашли же, получается, какую-то закономерность).

                Данные общедоступные, а вот закономерности скрыты. + какие-то закономерности непривлекательны для большинства игроков (имею в виду игроков, которые эффективно находят закономерности), например, по причине низкой ёмкости. Магазины у дома находят же свою нишу даже в эру крупных ритейлеров, а если магазин у дома достаточно талантлив, он и сам может перерасти в сеть)))
                • Григорий
                  29 марта 2017, 12:06
                  Replikant_mih, я нашел-стоимостное инвестирование.
                    • Григорий
                      29 марта 2017, 21:31
                      Александр Румянцев, никакой робот не сможет учесть тот набор факторов, который учитывается хорошим инвестором. Наоборот, крайне затруднительно создать что-то уникальное из общедоступного и общепонятного набора данных. Все закономерности, которые можно раскопать из графика,  роботы выявляют. Но график это примитивизация и ненужное упрощение реального состояния дел.
                        • Григорий
                          29 марта 2017, 23:49
                          Александр Румянцев, торговая система это попытка упростить зачастую с потерей качества входящей инфы.
                            • Григорий
                              30 марта 2017, 10:12
                              Александр Румянцев, здание-это детерминированные связи, а попытка детерминировать то, что нельзя детерминировать приводить к излишнему упрощению.
                  • Replikant_mih
                    29 марта 2017, 17:43
                    Григорий, Ну вот, значит закономерности существуют), в т.ч. закономерности, на которых можно заработать, как те, которые составляют нечто, что вы назвали стоимостным инвестированием.
  • Суслик
    30 марта 2017, 02:18
    Интересная у вас тут беседа. Вставлю свои 3 копейки. После 10 лет торгов я понимаю то, что  заработать на рынке можно, но вечной алгосистемы ( в т.ч. самоуобучающейся и т.п.) найти нельзя (тут по И.Коровину). 
    Почему нельзя- потому что против вас работает весь мир математиков со всеми его ресурсами ( прямо по Доу)
    Почему можно — потому что есть мозг, как он работает никто не знает ( в том числе и весь мир не может просчитать вас даже на минуту вперед ). То бишь опыт.
    Если сказать просто то движения на рынке есть, то есть тренды есть, но КОГДА наступает это движение- совершенно случайные моменты. То есть движняк будет, но через 5 минут или через 10 лет НИКАК не узнать, потому что это зависит от людей, какая возжа их подстегнет хз, или там небоскребы, а может вдруг что-то само собой рассосется… ну я думаю мысль ясна.
    Ну естественно если вы не математический гений, но это уже другая история и вероятность этого сильно маленькая.

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

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

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