Пару месяцев назад завершил одну интересную программу, которая самостоятельно ищёт прибыльные свечные
паттерны. Решил было спрятать под подушкой, но недавно передумал. Пока доделывал, появилось несколько
HFT идей. Буду заниматься ими, а эту подарю миру.
Программу не выложу, но про идею расскажу подробно. Берите, реализуйте, кто может. Буду только рад. Удалось обнаружить такое огромное количество паттернов, что на всех
программистов хватит.
Plan:
- Что такое свечной паттерн;
- Алгоритм поиска паттернов;
- Подводные камни;
- Оптимизация, многопоточность;
- Альтернативы.
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… секунд и работать с этими свечами как и с часовыми, а во втором подходе это просто не возможно, т.к. длинна свечи в некоторых случаях будет по времени совпадать с временем тестирования.
Спустя несколько месяцев после написания этой статьи я всё таки выложил программу на основе этой идеи. Получилась крутая и уникальная штука. Вот здесь подробности:
smart-lab.ru/blog/205199.php
Я же предлагаю программистам модель программы, которая находит по нескольку сот прибыльных паттернов за сутки. Руками, для такого же результата, у сервиса Крамина несколько лет придётся просидеть, подставляя данные.
А окончательный статистический анализ был уже в екселе.
Думаю, не стоит изобретать велосипед. Используйте систему распознавания образов от общего к частному.
А теперь дарю более продвинутую идею:
создайте алгоритм, выявляющий на истории специфических инструментов прибыльные паттерны (возможно еще никому не известные).
Удачи увлеченным людям!
1. Берете ряд цен, преобразуете его в ряд разностей логарифмов.
2. По желанию дополняете его объемами, ценами на коррелированные и коинтегрированные активы, фазами Луны, да чем угодно (все в виде приращений логарифмов).
3. Генерируете на основе полученного ряда скользящим окошком обучающую выборку.
4. Натравливаете на нее алгоритм типа SVM или нейронную сеть, добиваетесь нормального качества обучения, делаете перекрестные проверки и тестируете out-of-sample.
…
5. PROFIT
1. Паттерн хранится в виде последовательности приращений логарифмов OHLC для каждой свечи, без указания диапазона. Эта последовательность представляет собой вектор, назовем его Vp.
2. Сравниваемая последовательность свечек аналогичным образом представляется в виде вектора, назовем его Vi.
3. В качестве меры похожести векторов можно взять косинус угла между векторами Vp и Vi (косинусная мера). Результат легко можно выразить в %.
Способ IMHO более удобный, т.к. он не зависит от масштаба и позволяет задать % требуемой «похожести» для сравнения паттернов.
Ищите баги. На минутках за год паттерны есть по нескольку тысяч вхождений, даже при малом коэффициенте расширения для шаблона.