Блог им. Tyam

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

 
Пару месяцев назад завершил одну интересную программу, которая самостоятельно ищёт прибыльные свечные паттерны. Решил было спрятать под подушкой, но недавно передумал. Пока доделывал, появилось несколько 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… секунд и работать с этими свечами как и с часовыми, а во втором подходе это просто не возможно, т.к. длинна свечи в некоторых случаях будет по времени совпадать с временем тестирования.
★84
29 комментариев
Супер! Спасибо!!!
avatar
Для пришедших из поисковика,
Спустя несколько месяцев после написания этой статьи я всё таки выложил программу на основе этой идеи. Получилась крутая и уникальная штука. Вот здесь подробности:
smart-lab.ru/blog/205199.php
Интересно, но Крамин уже такое делал и предложил бесплатно всем желающим для использования;)
URKA, Разница в том, что Вы с нуля ищете паттерны, а в сервисе Крамина предлагается свечную комбинацию предложить из вне и получить статистику по ней на выходе.
URKA, Да. Крамин молодец. ТехАнализ 2.0 он называет то, о чём Вы пишите.
Я же предлагаю программистам модель программы, которая находит по нескольку сот прибыльных паттернов за сутки. Руками, для такого же результата, у сервиса Крамина несколько лет придётся просидеть, подставляя данные.
Спасибо, интересно!
avatar
Taxfreelt, ну это конечно не удачный аналог)) во-первых — это для МТ4-5, во-вторых — перерисовывает (инфа из далекого 2012 года, может уже исправили)
Taxfreelt, свечка может не перерисовываться, а вот индикация удалятся в случае не срабатывания очень даже может;) своего рода стоп для сигнала))
Респект.
avatar
1 у тебя мало сделок от 26 до 80… т.е. результат недостоверен… для достоверного результата надо иметь статистику по 10000 сделок (накрайняк 3000 сделок)… уменьш таймфрейм или бери разные бумаги
avatar
Пару лет написал на С++ свечной анализ. Просто с нуля. Практически один в один по твоей схеме. Но еще разбавлял это прогонкой всех удачных паттернов на велс-лабе в автоматическом режиме, с проскальзыванием, комиссиями и показом дроудаунов.
А окончательный статистический анализ был уже в екселе.
avatar
Коллега, это неэффективный способ поиска.
Думаю, не стоит изобретать велосипед. Используйте систему распознавания образов от общего к частному.

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

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



5. PROFIT
avatar
Marco, спасибо за пояснение, но мне важно было, что напишет Йоганн.
Николай Флёров, в таком случае извините, не буду вам мешать. :)
avatar
Marco, нет нет, было интересно, но такое я уже делал, а хочется чего-то нового узнать!)
Йоганн, как успехи? Продолжать двигаться в этом направлении или бросить?
avatar
Бугога… ржу в голос, только начинаю какой-нить проект по трейдингу… так сразу вижу похожую тему на смартлабе
avatar
IMHO, регулировать узнаваемость паттернов проще, используя следующий подход:

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

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

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

Способ IMHO более удобный, т.к. он не зависит от масштаба и позволяет задать % требуемой «похожести» для сравнения паттернов.
avatar
Marco, можно Вас попросить дать пример?
avatar
Это будет не что иное, как подгонка под историю. На новых данных работать не будет.
avatar
Эх нет такого комментария… «Вы дилетант»!))) Даже не привычно как то… )))) Словосочетание «свечной паттерн» есть, а комментария такого нет… НОНСЕНС. А пост очень полезный. Добавил в избранное.
avatar
Заинтересовался… напрограммировал… чето ничего не нашел, изучал SR за 2013 год… м5, м1 пусто… ни одного совпадения… прям не знаю, может алгоритм косячный… кто-нить еще озадачился?
Дмитрий Черников, Рад что пригодилось.
Ищите баги. На минутках за год паттерны есть по нескольку тысяч вхождений, даже при малом коэффициенте расширения для шаблона.

теги блога Алексей Ван <o-s-a.net>

....все тэги



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