Алексей Ван <o-s-a.net>
Алексей Ван <o-s-a.net> личный блог
18 мая 2014, 13:28

Как алгоритмизировать поиск свечных паттернов

 
Пару месяцев назад завершил одну интересную программу, которая самостоятельно ищёт прибыльные свечные паттерны. Решил было спрятать под подушкой, но недавно передумал. Пока доделывал, появилось несколько HFT идей. Буду заниматься ими, а эту подарю миру.
Как алгоритмизировать поиск свечных паттернов
Программу не выложу, но про идею расскажу подробно. Берите, реализуйте, кто может. Буду только рад. Удалось обнаружить такое огромное количество паттернов, что на всех программистов хватит.
 
Plan:
  1. Что такое свечной паттерн;
  2. Алгоритм поиска паттернов;
  3. Подводные камни;
  4. Оптимизация, многопоточность;
  5. Альтернативы.

Как алгоритмизировать поиск свечных паттернов


1 Что такое свечной паттерн

 
Ответ на этот вопрос намного проще, чем может показаться на первый взгляд. Однако даже здесь, засилье шарлатанов, научных фриков и Форекс разводил, породили антинаучное двоемыслие. Поэтому, во избежание СПЕЦИАЛЬНО ДЛЯ срача определения будет два.
 
Определение1: Это несколько свечей, идущих подряд, с помощью которых, на основе ВЕРЫ в «Японца» или «независимого» «аналитика» впервые описавшего формацию, можно прогнозировать движение.  Пример:
Как алгоритмизировать поиск свечных паттернов
 
Определение2: Несколько подряд идущих свечей, с помощью которых, на основе СТАТИСТИКИ изменений цены после их появления,  можно прогнозировать движение. Пример:
Как алгоритмизировать поиск свечных паттернов
 
Оба эти определения имеют право на существования), однако мне ближе второй вариант. И программу поиска именно таких паттернов попытаюсь описать ниже.
 

2 Алгоритм поиска паттернов

 
Общие требования к программисту:
 
  • Любой ООП язык;
  • Любой UI к нему;
  • Структуры и алгоритмы;
  • Многопоточность;
  • OOP;
  • OOD.
 
Входящие переменные:
 
  • Длинна искомых паттернов;
  • Время выхода из сделки;
  • Коэффициент расширения;
  • Исторические данные. Свечи.
 
Выводим соответствующие настройки на интерфейс. Вот как это выглядит у меня:
 
Как алгоритмизировать поиск свечных паттернов
 
Синими крестиками обозначены не обязательные элементы.
Далее необходимо скачать в память массив каких-то свечек. Предварительно разработать для них соответствующие классы и структуры.
 
Как работать с массивом:
Допустим что мы ищем паттерны длинной 3 и с выходом через две минуты.
 
1. Берём первые три свечи  и сохраняем их в шаблон:
Как алгоритмизировать поиск свечных паттернов
 
2. Подставляем с самого начала массива поочерёдно по одной свечке и ищем похожую формацию:
 
Как алгоритмизировать поиск свечных паттернов
 
3. Как только находим её, записываем close последней свечи найденной формации и close(или соответствующие open) свечи через время выхода, в нашем случае через две минуты. Для сохранения данных о паттерне не плохо сделать отдельный класс для хранения отчётов, в котором будут храниться сделки по паттерну и подробная статистика этих сделок:
 
Как алгоритмизировать поиск свечных паттернов
 
4. Когда исходный массив данных во время сравнения заканчивается, сохраняем отчёт об исследованном паттерне в файл и берём из исходного массива следующие три свечи в качестве шаблона:
 
Как алгоритмизировать поиск свечных паттернов
 
Хранение свечей Шаблона и Что такое «Коэффициент расширения»:
 
Значение Open первой свечи шаблона берём за 0%, а все значения шаблона далее, сохраняем как приращения к этому значению. Соответственно, во время сравнения шаблона со свечами из исторических  данных, для начала надо перевести сравниваемый участок в вид приращения, а затем сравнивать.
 
Кроме того, 100% совпадений свечек, тем более их комбинаций почти не бывает и чтобы регулировать узнаваемость паттернов, свеча шаблона хранится не в виде OHLC, а в виде приращения OLow OHigh HLow HHigh LLow LHigh CLow CHigh. Т.е. для каждого значения свечи, используется две переменные, означающие диапазон возможных значений:
 
Как алгоритмизировать поиск свечных паттернов
 
Во время сравнения шаблона со свечами из исторических данных, проверяем, входят ли значения OHLC, преобразованные в приращение, истории в диапазоны шаблона. И радуемся жизни.
 

3 Подводные камни

 
1. Регулировка коэффициента расширения, является инструментом злостной переоптимизации.
 
2. Вход и выход на Close/Open свечек. Как и вообще тестирование на свечках, в реале выдаст прибыль много меньше, чем во время тестирования.
 

 4 Оптимизация алгоритма, многопоточность

 
Для ускорения процесса тестирования паттернов, можно создать отдельный массив bool такой же длинной, как и массив со свечками. Далее по номерам отмечать уже пройденные и Найденные паттерны, чтобы в дальнейшем не брать в качестве шаблона уже пройденные и идентифицированные комбинации. Данный подход ускорил скорость прохода в 4 — 5 раз.
 
Для тех, кто не боится потоков:
 
Класс с логикой разделяем на две части, Static(общую для класса) и собственно объёкт. Ну, или если ваш язык не поддерживает такие конструкции, то просто выносим раздачу номеров индекса начала шаблона из логики поиска паттернов в другой класс.
 
Общая часть должна отвечать за раздачу номера в массиве свечек, с которого начинается шаблон, для текущего исследования. А объект с логикой поиска паттернов в истории, должен при инициализации создавать свой рабочий поток, при надобности запрашивая номер в массиве для начала шаблона в своей static части. Здесь ещё придётся сделать один для всех потокобезопасный способ сохранения отчёта в файл. Данный подход ускоряет процесс поиска паттернов кратно созданным объектам для поиска паттернов, но не более max ядер процессора. У меня в 3 раза. Т.к. одно из 4ёх ядер оставляю для Windows.
 
После обхода всех вариантов свечных формаций в массиве, естественно необходимо отфильтровать паттерны и выбрать лучшие. У меня для этого есть другая программа, но это уж совсем другая история...
 
Как алгоритмизировать поиск свечных паттернов
 
Свечная модель: Две чёрных вороны и один белый самурай рассматривают молот
 

5 Альтернатива

 
Можно пойти с другой стороны, и динамически рассчитывать вероятность движения, в момент непосредственно торгов. Т.е. проверять последние полученные из терминала (файла при тестировании) свечи на истории и не парится с поиском прибыльных формаций заранее.
 
Проблемы этого подхода
 
1. Прогон одной формации минуток за один год истории у меня занимает около двух сек. При загрузке одного ядра 100%. Из этого следует:
  • Агрессивной торговли на минутках сделать не получится. Т.к. надо одновременно искать множество вариантов паттернов, как по длине, так и по времени выхода.
  • И на пяти минутках, если просматривать множество паттернов на нескольких годах будет задержка в несколько секунд.
 
2. Сложность перехода из такого варианта торговли и тестирования на таймфрейм ниже минутки. Т.е. для того чтобы тестировать движения внутри минуты, в первом подходе можно просто схлопнуть тики в свечи по 5, 10, 15… секунд и работать с этими свечами как и с часовыми, а во втором подходе это просто не возможно, т.к. длинна свечи в некоторых случаях будет по времени совпадать с временем тестирования.
29 Комментариев
  • sander
    18 мая 2014, 13:44
    Супер! Спасибо!!!
  • Скальпёр
    18 мая 2014, 13:46
    Интересно, но Крамин уже такое делал и предложил бесплатно всем желающим для использования;)
    • Скальпёр
      18 мая 2014, 13:48
      URKA, Разница в том, что Вы с нуля ищете паттерны, а в сервисе Крамина предлагается свечную комбинацию предложить из вне и получить статистику по ней на выходе.
        • helk3rn
          19 мая 2014, 01:59
          Спасибо, интересно!
  • Скальпёр
    18 мая 2014, 13:57
    Taxfreelt, ну это конечно не удачный аналог)) во-первых — это для МТ4-5, во-вторых — перерисовывает (инфа из далекого 2012 года, может уже исправили)
    • Скальпёр
      18 мая 2014, 14:09
      Taxfreelt, свечка может не перерисовываться, а вот индикация удалятся в случае не срабатывания очень даже может;) своего рода стоп для сигнала))
  • gib
    18 мая 2014, 14:06
    Респект.
  • ves2010
    18 мая 2014, 14:46
    1 у тебя мало сделок от 26 до 80… т.е. результат недостоверен… для достоверного результата надо иметь статистику по 10000 сделок (накрайняк 3000 сделок)… уменьш таймфрейм или бери разные бумаги
  • Advait
    18 мая 2014, 16:54
    Пару лет написал на С++ свечной анализ. Просто с нуля. Практически один в один по твоей схеме. Но еще разбавлял это прогонкой всех удачных паттернов на велс-лабе в автоматическом режиме, с проскальзыванием, комиссиями и показом дроудаунов.
    А окончательный статистический анализ был уже в екселе.
  • Йоганн
    18 мая 2014, 17:13
    Коллега, это неэффективный способ поиска.
    Думаю, не стоит изобретать велосипед. Используйте систему распознавания образов от общего к частному.

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

    Удачи увлеченным людям!
    • Николай Флёров
      18 мая 2014, 17:22
      Йоганн, не понял, можно более развернуто описать метод!? или ссылку!
      • Marco
        18 мая 2014, 21:16
        Николай Флёров, например:
        1. Берете ряд цен, преобразуете его в ряд разностей логарифмов.
        2. По желанию дополняете его объемами, ценами на коррелированные и коинтегрированные активы, фазами Луны, да чем угодно (все в виде приращений логарифмов).
        3. Генерируете на основе полученного ряда скользящим окошком обучающую выборку.
        4. Натравливаете на нее алгоритм типа SVM или нейронную сеть, добиваетесь нормального качества обучения, делаете перекрестные проверки и тестируете out-of-sample.



        5. PROFIT
        • Николай Флёров
          18 мая 2014, 21:26
          Marco, спасибо за пояснение, но мне важно было, что напишет Йоганн.
          • Marco
            18 мая 2014, 22:14
            Николай Флёров, в таком случае извините, не буду вам мешать. :)
            • Николай Флёров
              18 мая 2014, 22:42
              Marco, нет нет, было интересно, но такое я уже делал, а хочется чего-то нового узнать!)
    • skatino
      18 мая 2014, 20:12
      Йоганн, как успехи? Продолжать двигаться в этом направлении или бросить?
  • skatino
    18 мая 2014, 20:11
    Бугога… ржу в голос, только начинаю какой-нить проект по трейдингу… так сразу вижу похожую тему на смартлабе
  • Marco
    18 мая 2014, 22:57
    IMHO, регулировать узнаваемость паттернов проще, используя следующий подход:

    1. Паттерн хранится в виде последовательности приращений логарифмов OHLC для каждой свечи, без указания диапазона. Эта последовательность представляет собой вектор, назовем его Vp.

    2. Сравниваемая последовательность свечек аналогичным образом представляется в виде вектора, назовем его Vi.

    3. В качестве меры похожести векторов можно взять косинус угла между векторами Vp и Vi (косинусная мера). Результат легко можно выразить в %.

    Способ IMHO более удобный, т.к. он не зависит от масштаба и позволяет задать % требуемой «похожести» для сравнения паттернов.
    • Denega
      19 мая 2014, 06:36
      Marco, можно Вас попросить дать пример?
  • in_line
    19 мая 2014, 09:13
    Это будет не что иное, как подгонка под историю. На новых данных работать не будет.
  • Artyom_KO
    20 мая 2014, 13:41
    Эх нет такого комментария… «Вы дилетант»!))) Даже не привычно как то… )))) Словосочетание «свечной паттерн» есть, а комментария такого нет… НОНСЕНС. А пост очень полезный. Добавил в избранное.
  • Дмитрий Черников
    22 мая 2014, 09:40
    Заинтересовался… напрограммировал… чето ничего не нашел, изучал SR за 2013 год… м5, м1 пусто… ни одного совпадения… прям не знаю, может алгоритм косячный… кто-нить еще озадачился?

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

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