Май 18th, 2014

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

, Must-read, by Алексей Ван.

Пару месяцев назад завершил одну интересную программу, которая самостоятельно ищёт прибыльные свечные паттерны . Решил было спрятать под подушкой, но недавно передумал. Пока доделывал, появилось несколько HFT идей. Буду заниматься ими, а эту подарю миру.

Паттерн2

Программу не выложу, но про идею расскажу подробно. Берите, реализуйте, кто может. Буду только рад. Удалось обнаружить такое огромное количество паттернов, что на всех программистов хватит.

Plan:

  1. Что такое свечной паттерн;
  2. Алгоритм поиска паттернов;
  3. Подводные камни;
  4. Оптимизация, многопоточность;
  5. Альтернативы.

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

Ответ на этот вопрос намного проще, чем может показаться на первый взгляд. Однако даже здесь, засилье шарлатанов, научных фриков и Форекс разводил, породили антинаучное двоемыслие. Поэтому, во избежание СПЕЦИАЛЬНО ДЛЯ срача определения будет два.

Определение1: Это несколько свечей, идущих подряд, с помощью которых, на основе ВЕРЫ в «Японца» или «независимого» «аналитика» впервые описавшего формацию, можно прогнозировать движение.  Пример:

СвечеЯпон

 

Определение2: Несколько подряд идущих свечей, с помощью которых, на основе СТАТИСТИКИ изменений цены после их появления,  можно прогнозировать движение. Пример:

паттерн

 

Оба эти определения имеют право на существования), однако мне ближе второй вариант. И программу поиска именно таких паттернов попытаюсь описать ниже.

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

 

Общие требования к программисту:

  • Любой ООП язык;
  • Любой UI к нему;
  • Структуры и алгоритмы;
  • Многопоточность;
  • OOP;
  • OOD.

Входящие переменные:

  • Длинна искомых паттернов;
  • Время выхода из сделки;
  • Коэффициент расширения;
  • Исторические данные. Свечи.

Выводим соответствующие настройки на интерфейс. Вот как это выглядит у меня:

Трекер

Синими крестиками обозначены не обязательные элементы.

Далее необходимо скачать в память массив каких-то свечек. Предварительно разработать для них соответствующие классы и структуры.

Как работать с массивом:

Допустим что мы ищем паттерны длинной 3 и с выходом через две минуты.

1. Берём первые три свечи  и сохраняем их в шаблон:

Массив1

2. Подставляем с самого начала массива поочерёдно по одной свечке и ищем похожую формацию:

Массив2

3. Как только находим её, записываем close последней свечи найденной формации и close(или соответствующие open) свечи через время выхода, в нашем случае через две минуты. Для сохранения данных о паттерне не плохо сделать отдельный класс для хранения отчётов, в котором будут храниться сделки по паттерну и подробная статистика этих сделок:

Массив3

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

Массив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.

После обхода всех вариантов свечных формаций в массиве, естественно необходимо отфильтровать паттерны и выбрать лучшие. У меня для этого есть другая программа, но это уж совсем другая история…

Паттерн3

Свечная модель: Две чёрных вороны и один белый самурай рассматривают молот

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

 

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

Проблемы этого подхода

1. Прогон одной формации минуток за один год истории у меня занимает около двух сек. При загрузке одного ядра 100%. Из этого следует:

  • Агрессивной торговли на минутках сделать не получится. Т.к. надо одновременно искать множество вариантов паттернов, как по длине, так и по времени выхода.
  • И на пяти минутках, если просматривать множество паттернов на нескольких годах будет задержка в несколько секунд.

2. Сложность перехода из такого варианта торговли и тестирования на таймфрейм ниже минутки. Т.е. для того чтобы тестировать движения внутри минуты, в первом подходе можно просто схлопнуть тики в свечи по 5, 10, 15… секунд и работать с этими свечами как и с часовыми, а во втором подходе это просто не возможно, т.к. длинна свечи в некоторых случаях будет по времени совпадать с временем тестирования.

Back Top

Comments are closed.