Максим Милованов
Максим Милованов личный блог
27 марта 2014, 10:09

О сложностях проектирования алгоритмов для торговых систем

Я долго думал, как озаглавить данную заметку, в итоге получилось заглавие о сложности алгоритмизации. В общих чертах данная статья посвящена опыту проектирования торговой системы на одном известном паттерне «двойное дно», сложности его формализации и результатах тестировании на разных инструментах и таймфреймах.
Всё началось с того, что я со знакомым обсуждал рабочие паттерны на ликвидных инструментах. Это были самые простые и эффективные (как мы думали) – «пробой уровня», «отскок от уровня», «ретест уровня» (тест уровня с обратной стороны), «двойное дно» и т.д. В настоящей заметке речь пойдет как раз о «двойном дне», поскольку, с моей точки зрения, это наиболее редко используемый и упоминаемый паттерн: и я ни разу не видел, чтобы кто-то давал статистическую оценку по нему. К тому же у многих негативное отношение к данному паттерну, особенно если вспоминать поговорки про «покупку дна».
Хорошо бы определить, что мы будем понимать под «дном». Само дно хорошо видно постфактум (Рис. 1). Т.е. «дно» — это свечная фигура, после которой начинается рост. Это определение именно «дна», а не «ложного дна». Однако если дно на одном таймфрейме будет выглядеть именно как чёткая формация, то на другом таймфрейме этот паттерн может и не являться самым низким дном и после отскока (коррекции наверх) падение может продолжиться с образованием нового дна. Опять же дно бывает разное – дно как формация тестирования одного и того же уровня или повышающееся дно (Рис. 2), т.е. зарождение тренда. Как раз на втором типе я бы хотел остановиться.

 О сложностях проектирования алгоритмов для торговых систем
Рис. 1. Паттерн «Двойное дно» на примере Роснефти от 8 и 9 августа 2013 г.
 
 О сложностях проектирования алгоритмов для торговых систем


Рис. 2. Паттерн «двойное повышающееся дно»
 
Вернемся к обсуждению системы для торговли, основанной на этом паттерне. Из наших со знакомым наблюдений, мы выяснили, что вход должен осуществляться классически, т.е. после пробоя предыдущей максимальной вершины, образованной между первым и вторым дном. Причем пробой должен быть реальным, а именно, пробойная свеча должна закрепиться выше предыдущего максимума.
 
Главный вопрос заключается в том, как определить – дно это или не дно? Конечно, по графику довольно просто сказать – есть двойное дно или нет, но как об этом сказать машине, ведь комбинация свечей на рисунке 3 по сути тоже двойное дно? Особенно хорошо это видно на более мелком таймфрейме. Можно конечно спорить о том, что изображено на Рис. 3 – боковик с выходом или двойное дно на большем таймфрейме, но в решении задачи алгоритмизации это вряд ли поможет.
 
 О сложностях проектирования алгоритмов для торговых систем
 
Рис. 3. «Двойное дно» на большем таймфрейме
 
Таким образом, для правильного определения формации «двойное повышающееся дно» введем параметр «период», который будет обозначать, какое количество свечей должно быть между опорными точками (экстремумами дна). Конечно, можно попытаться воспользоваться индикатором Зиг Заг, но скорее это не решит других проблем, как, например, факт пробоя и закрепления, частичное перекрытие свечей и обновление экстремумов и т.д. Несмотря на это, подход будет очень похожий. Как и в Зиг Заге, для правильно работы нужно  определение экстремумов – локальных максимальных и минимальных точек (свечей). Собственно говоря, для этого и был введен параметр – период.
 
Опять же для правильно определения экстремума нужно знать от какой конкретно свечи мы будем искать его. В данном контексте эта та свеча, которая является пробойной и на которой осуществляется вход в лонг. Поэтому для текущей свечи нужно определить как минимум три ближайших экстремума:
 
1) минимальную точку первого дна
2) минимальную точку второго дна
3) максимальную точку между первым и вторым дном

Подробное описание алгоритм определения экстремумов.
 
Итак, с алгоритмом определения экстремумов и точкой входа мы определились. Теперь нужно понять, в каком месте мы будем закрывать позицию.  Для систем я обычно использую следующие способы выхода из позиции:
1)      По тейк-профиту
2)      По концу временного периода (конец торгового дня, конец торговой недели)
3)      По стоп-лоссу (т.е. ограничение рисков)
Стоп-лосс мы определили как уровень второго дна. Чтобы защитить сделку от ложных пробоев второго дна, установим стоп-лосс немного ниже уровня второго дна, на значение определяемое формулой:
StopLoss = SecondBottom * (1000-percent)/1000
где StopLoss – уровень стоп-лоса,
SecondBottom – уровень второго дна,
percent – процент отклонения от второго дна.
Например, если акция Сбербанка стоит 85 рублей, а предыдущее второе дно равнялось 80 рублям, то уровень стоп-лосса будет равен 79,92. Соответственно в случае срабатывания стоп-лосса мы потеряем (85-79,92)=5,08 руб.
Вернемся к точке выхода. Вначале я хотел бы привести результаты тестирования на различных инструментах при закрытии сделки по тейк-профиту. По умолчанию, установим соотношение стоп-лосса к тейк-профиту в значении 1 к 3. Всё тестирование будем проводить на 5-минутном таймфрейме. Все сделки осуществляются для простоты только в лонг. Временной интервал для тестирования с 1 января 2009 года до 1 марта 2014 года. Комиссии и проскальзывания учтены.
Для наглядности я буду приводить самые лучшие показатели, полученные путем оптимизации двух параметров – количество просмотров свечей для определения экстремума и соотношение стоп-лосс и тейк-профит.
Фьючерс на индекс РТС
лучший результат при  параметрах:
количество свечей для поиска экстремума = 17
тейк-профит множитель = 8
 О сложностях проектирования алгоритмов для торговых систем
Рис. 5. Кривая доходности для фьючерса на индекс РТС
 О сложностях проектирования алгоритмов для торговых систем
Рис. 6. Результат тестирования для фьючерса на индекс РТС
Фьючерс на доллар-рубль
лучший результат при  параметрах:
количество свечей для поиска экстремума = 7
тейк-профит множитель = 5
 О сложностях проектирования алгоритмов для торговых систем
Рис. 7. Кривая доходности для фьючерса доллар-рубль
 О сложностях проектирования алгоритмов для торговых систем
Рис. 8. Результат тестирования для фьючерса доллар-рубль


Результаты тестирования для акций — Газпром, Сбербанк, Роснефть
 
 
Рассмотрим другой вариант торговой системы, в котором мы будем закрывать позицию в конце торговой недели. Для фьючерсов – в пятницу в 23,30, для акций в 18,30. В данном случае параметр в системе только один – количество  просматриваемых свечей.
Фьючерс на индекс РТС
лучший результат при  параметрах:
количество свечей для поиска экстремума = 18
О сложностях проектирования алгоритмов для торговых систем
Рис. 15. Кривая доходности для фьючерса на индекс РТС
 О сложностях проектирования алгоритмов для торговых систем
Рис. 16. Результат тестирования для фьючерса на индекс РТС



Как видно из проведенных тестов, система с закрытием по времени работает еще хуже. Поэтому в таком виде её использовать, также как и первую систему нельзя.
Что в итоге у нас получилось в итоге? Хотя у нас не получилось хорошей прибыльной системы, мы смогли протестировать систему, основанную на двойном дне на разных ликвидных инструментах. Ни в одном случае система не показала свою стабильную работу.
Если говорить о сложности проектирования подобного алгоритма, то я хотел бы подчеркнуть, что только для тестирования данной системы у меня ушло около 6 часов. На выработку идеи формальное описание алгоритма около 2 часов, в том числе и обсуждение. На программную реализацию торговой системы около 20 часов. Таким образом, при проектировании торговых систем, нужно учитывать человеческие трудозатраты. Если система не сложная, то её можно реализовать примерно в течение рабочей недели, как в моём случае. Если система требует особого подхода, особенно в алгоритмизации и тестировании, то на реализацию может уйти довольно большой временной срок. Хуже всего если за это время рынок измениться и система не будет давать ожидаемых результатов в будущем.
В любом случае проектирование систем, проверка гипотез дают огромное преимущество для генерации новых идей и создания прибыльных торговых систем.

 
Скачать код торговой системы 

Оригинал статьи на сайте robostroy.ru


 
38 Комментариев
  • К сожелению ваши выкладки построены на ложных предпосылках.
    Вы взяли неправильное понятие двойного два, их вариантов больше, вы привели всего один.
    Кроме того понятия основанные на свечных формациях ошибочны, в частности приведенная на рис.3 формация нерабочая.
    Вы взяли Роснефть за 8-9 июля.
    Там вариант двйного дна под названием «особое двойное дно»
    Первая работа по двойным днам и вершинам я напечатал в журнале Д-штрих в 2010 году.
    Подробно все варианты двойных вершин рассмотрены в моей новой книге «Маржинальность рынка».
    Image Hosted by PiXS.ru
  • Stanislav-A
    27 марта 2014, 08:25
    Инвесторам и трейдерам, умоляю, купите у Гусева весь тираж его книг, ведь на измор возьмет рекламой.
    • Николай Лазарев
      27 марта 2014, 10:25
      Stanislav-A, Я готов купить грузовик его книг по цене дров с доставкой. Условие: тираж должен быть из бумаги, не содержащей пластик и свинец))))
      • Stanislav-A
        27 марта 2014, 10:28
        Николай Лазарев, к сожалению не могу выступить его агентом, т.к. в ЧС:)
    • Мурен(а)
      27 марта 2014, 11:42
      Stanislav-A, почему его не банят за рекламу?
      • Stanislav-A
        27 марта 2014, 11:57
        Идущий по воде, да это безобидная реклама. даже полезная, но достала порядком
    • Машковский Евгений
      27 марта 2014, 12:02
      Stanislav-A, Зря Вы так, мне кажется Владимир сильно изменился, по крайней мере лично мне стало очень интересно его читать.
      • Stanislav-A
        27 марта 2014, 12:06
        Машковский Евгений, так и я его постоянно читаю, только он всех в сад отправляет, кто сказал что то не так.
        • Машковский Евгений
          27 марта 2014, 12:08
          Stanislav-A, Ну это да, но репрессии заметно уменьшились, я раньше бы мигом в черном списке оказался, а сейчас нет, еще жив.))))
      • anatolyutkin
        27 марта 2014, 14:11
        Машковский Евгений, Да он стирает все, что не согласуется с генеральной линией партии. Имхо, это вполне определенный тип человека и маловероятно, что он сможет написать что-то дельное.
      • Зов KTULHU
        27 марта 2014, 14:49
        Машковский Евгений, а может это ты сильно изменился, настолько, что тебе стало интересно его читать? ))
  • anatolyutkin
    27 марта 2014, 09:28
    Имхо, надо танцевать не от графиков, а от того, что за ними стоит. Это на порядок сложнее, чем просто играться с широко известными подходами, но зато на выходе получаются торговые системы, а не нечто, дающее хорошую эквити на истории.
    • Swan
      27 марта 2014, 10:19
      anatolyutkin, с графиками тоже нормально, только надо не паттерны обрабатывать, «двойное дно», «голова-плечи», «руки-ноги» и т.п., а хотя бы Байесом историю обрабатывать, про out-of-sample я уж не говорю, это следующий уровень.

      А с паттернами можно поиграть, хуже не будет, главное сильно на них не надеяться, впрочем там и по тестам видно будет, что надеяться не на что.
      • anatolyutkin
        27 марта 2014, 10:37
        Swan, Ну мы же с вами все это обсудили :)

        Тут на самом деле вопрос методологии. Я физик, и не люблю непонятно откуда берущиеся вещи. Стандартом в науке является такой подход: эксперимент--построение теории для объяснения--предсказание на базе теории. Опыт показывает, что это наиболее продуктивный путь.

        Варианты же с бездумным ковырянием графиков--это схема эксперимент--предсказание, без теории. При этой схеме всегда остаются вопросы типа «когда это уже не торговать, как пережить просадку», итд. Поскольку в рамках подхода эксперимент--предсказание ответов на эти вопросы в принципе быть не может, то дальше начинаются всякие психологии, тильты, сожми боллзы в кулак и торгуй, и прочее из арсенала Элдеровских анонимных алкоголиков.

        Но естественно, что успешно торговать можно и так и так, для успеха не обязательно детально изучать повадки биржевых зверьков, как это делаю я. Такое изучение лишь повышает устойчивость трейдера.
        • Swan
          27 марта 2014, 10:53
          anatolyutkin, с одной стороны, не могу не согласиться =)))
          а с другой — я просто обратил внимание, что если задача уже поставлена именно вот так — тупо график через паттерны, то для решения нужно нечто позатейливее, чем «головы-плечи»
          • anatolyutkin
            27 марта 2014, 11:03
            Swan, Не знаю, имхо нормальная матчасть у автора используется. Конечно, можно и что-то поизощренней во втором десятилетии двадцать первого века юзать, но не обязательно. Это как трендовость--можно херсты и прочие фрактальные размерности изучать, а можно не вникать и просто пересечение МА прогнать.

            Конечно, знание это сила, и обилие методик еще никому не вредило--но и без громобойной математики можно работать :)
  • ves2010
    27 марта 2014, 10:27
    1 идея гуд…
    2 можно как алерт использовать…
    3 многкратно говорил о том, что выход важнее входа
    4 зря не тестил на обе стороны, т.к 3 года идет боковик
  • Евгений
    27 марта 2014, 10:52
    "… Собственно говоря, для этого и был введен параметр – период...."
    На мой взгляд, вот с этого момента получилась обычная машка и потерялся смысл дальнейших исследований.
    А не пробовали посмотреть, что-то типа синтетических баров или ренко или т.п.?
  • Николай Лазарев
    27 марта 2014, 10:58
    Найти «дно» на графике не сложно. Можно использовать параметры свечей, но лучше типовую цену (разница между открытием и закрытием). Самый сложный вопрос, на мой взгляд, это определить глубину дна. Т.е. глубину просадки и возврата цены. Ещё важно за какой период искать это «дно», ведь оно может быть образовано не просто разворотом, а долгой проторговкой. В результате поимеем систему с двумя переменными (оптимизируемыми) параметрами, что совсем не айс и чревато подгонкой этих параметров под историю.


    На картинке положительный результат получен путём подгонки двух параметров: «к» глубина дна и «кр» ширина искомого дна
    • Николай Лазарев
      27 марта 2014, 11:03
      Николай Лазарев, Чем чревата попытка торговать подогнанной (оптимизированной) системой знает любой системщик)))
  • GSV_pusher
    27 марта 2014, 11:10
    Вот ради таких постов я и читаю смартЛаб. И неважно, соглашаюсь ли я с логикой/методами/техникой.
    Супер, Максим, пиши ещё.
    • DIVER PROFIT
      27 марта 2014, 11:36
      GSV_pusher, Согласен, именно эти посты а также коменты к ним и есть самое ценное «золото» смарт лаба. Ради таких постов и стоит перелопачивать весь хлам на этом ресурсе.
  • Flyopenair
    27 марта 2014, 11:26
    Пусь пишут и по больше таких стратегий и продают и кто-то покупает и применяет… кому хорошо? — нам но не им, кто же будет сливить бабос под наши стратегии )))
  • Growex
    27 марта 2014, 14:41
    дочитал до перечисления трех экстремумов… Нет никакой необходимости искать максимум между впадинами… указанный уровень удобен для ваших глаз но не для позиции. В частности на рисунке 2 этот уровень должен быть на максимуме свечи следующей за той где он отмечен и лимитка после пробоя размещается на нем же либо над нижним кластером пробойной свечки если такой был образован.
  • Зов KTULHU
    27 марта 2014, 14:47
    системы надо тестировать так: берёшь три равных куска на истории инструмента, радикально разных по характеру, и прогоняешь ручками по разработанному правилу, оцениваешь. Хорошо — тогда торгуешь. Руками, конечно. А все эти переводы для роботов — всё это от лукавого. Хренова туча времени и сил потрачена на хрень — вот какой вывод из этого топика.
  • Loss_taker
    27 марта 2014, 15:08
    вы осознаете что вот всем этим тестированием вы ищете на исторических данных типовой алгоритм, который на заранее известном графике (!!!) сработал бы в плюс? найдется ли такой алгоритм? уан хандред персент! будет ли он завтра работать? фифти/фифти. это все равно что смотреть на график и говорить, вот здесь надо было купить, а вот здесь продать. только на эту наивность навесили немножко расчетов.

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

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