Заметка

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

  1  

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

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

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

 

Рис. 1. Паттерн «Двойное дно» на примере Роснефти от 8 и 9 августа 2013 г.

 

Рис. 2. Паттерн «двойное повышающееся дно»

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

Главный вопрос заключается в том, как определить – дно это или не дно? Конечно, по графику довольно просто сказать – есть двойное дно или нет, но как об этом сказать машине, ведь комбинация свечей на рисунке 3 по сути тоже двойное дно? Особенно хорошо это видно на более мелком таймфрейме. Можно конечно спорить о том, что изображено на Рис. 3 – боковик с выходом или двойное дно на большем таймфрейме, но в решении задачи алгоритмизации это вряд ли поможет.

 

Рис. 3. «Двойное дно» на большем таймфрейме

Таким образом, для правильного определения формации «двойное повышающееся дно» введем параметр «период», который будет обозначать, какое количество свечей должно быть между опорными точками (экстремумами дна). Конечно, можно попытаться воспользоваться индикатором Зиг Заг, но скорее это не решит других проблем, как, например, факт пробоя и закрепления, частичное перекрытие свечей и обновление экстремумов и т.д. Несмотря на это, подход будет очень похожий. Как и в Зиг Заге, для правильно работы нужно  определение экстремумов – локальных максимальных и минимальных точек (свечей). Собственно говоря, для этого и был введен параметр – период.

Опять же для правильно определения экстремума нужно знать от какой конкретно свечи мы будем искать его. В данном контексте эта та свеча, которая является пробойной и на которой осуществляется вход в лонг. Поэтому для текущей свечи нужно определить как минимум три ближайших экстремума:

1) минимальную точку первого дна
2) минимальную точку второго дна
3) максимальную точку между первым и вторым дном

Для удобства будем просматривать свечи в обратном порядке от текущей. Таким образом, сначала нужно определить второе дно. Алгоритм определения следующий:

1) Просматриваем все свечи от текущей (bar) в обратном порядке (назад).
2) Ищем новый минимум (minBar), такой, что между начальной свечой (bar) и этим минимумом должно быть не меньше period свечей.
3) После нахождения минимума просматриваем свечи дальше, чтобы убедиться, что слева от этого минимума нет нового минимума на протяжении period свечей. Если нашли новый минимум, то переходим к пункту 3 заново.

Иными словами, между каждой экстремальной точкой должно быть определенное количество свечей, не меньше чем мы определили в параметре period. С точки зрения человека, экстремумы довольно легко увидеть, но перевести это на машинный алгоритмический язык это не тривиальная задача.

Итак, с алгоритмом определения экстремумов и точкой входа мы определились. Теперь нужно понять, в каком месте мы будем закрывать позицию.  Для систем я обычно использую следующие способы выхода из позиции:

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. Результат тестирования для фьючерса доллар-рубль

Газпром

лучший результат при  параметрах:
количество свечей для поиска экстремума = 20
тейк-профит множитель = 6

 

Рис. 9. Кривая доходности для Газпрома

 

Рис. 10. Результат тестирования для Газпрома

Сбербанк

лучший результат при  параметрах:
количество свечей для поиска экстремума = 20
тейк-профит множитель = 6

 

Рис. 11. Кривая доходности для Сбербанка

 

Рис. 12. Результат тестирования для Сбербанка

Роснефть

лучший результат при  параметрах:
количество свечей для поиска экстремума = 16
тейк-профит множитель = 8

 

Рис. 13. Кривая доходности для Роснефти

 

Рис. 14. Результат тестирования для Роснефти

Сделаем несколько выводов из полученных результатов. Как видно из графиков тестирования данная система довольно нестабильна: при незначительном изменении параметров торговой системы кривая доходности и итоговая прибыль меняются кардинально. В связи с этим данная система для реальной торговли не подходит, т.к. она довольно не устойчивая. Но полученные результаты также дают и полезный данные – во всех случаях самыми прибыльными результатами получались те, у которых соотношение стоп-лосс/тейк-профит был довольно большой – 1 к 5 и более. Таким образом, система предусматривает ловлю больших движений.

Рассмотрим другой вариант торговой системы, в котором мы будем закрывать позицию в конце торговой недели. Для фьючерсов – в пятницу в 23,30, для акций в 18,30. В данном случае параметр в системе только один – количество  просматриваемых свечей.

Фьючерс на индекс РТС

лучший результат при  параметрах:
количество свечей для поиска экстремума = 18

Рис. 15. Кривая доходности для фьючерса на индекс РТС

 

Рис. 16. Результат тестирования для фьючерса на индекс РТС

Фьючерс на индекс доллар-рубль

лучший результат при  параметрах:
количество свечей для поиска экстремума = 14

 

Рис. 17. Кривая доходности для фьючерса на доллар-рубль

 

Рис. 18. Результат тестирования для фьючерса на доллар-рубль

Газпром

лучший результат при  параметрах:
количество свечей для поиска экстремума = 11

 

Рис. 19. Кривая доходности для Газпрома

 

Рис. 20. Результат тестирования для Газпрома

Сбербанк

лучший результат при  параметрах:
количество свечей для поиска экстремума = 11

 

Рис. 21. Кривая доходности для Сбербанка

 

Рис. 22. Результат тестирования для Сбербанка

Роснефть

лучший результат при  параметрах:
количество свечей для поиска экстремума = 2

 

Рис. 23. Кривая доходности для Роснефти

 

Рис. 24. Результат тестирования для Роснефти

Как видно из проведенных тестов, система с закрытием по времени работает еще хуже. Поэтому в таком виде её использовать, также как и первую систему нельзя.

Что в итоге у нас получилось в итоге? Хотя у нас не получилось хорошей прибыльной системы, мы смогли протестировать систему, основанную на двойном дне на разных ликвидных инструментах. Ни в одном случае система не показала свою стабильную работу.

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

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

Прикрепленные файлы

·   code.rar

Комментарии

Николай Камынин — 28 марта 2014 г.

Добрый день,
Максим Милованов,
Благодарю за статью.
Хочу заметить следующее:
1) Полагаю, что это рассказ на тему "А не замахнуться ли нам на Вильяма, так сказать, Шекспира"
Потому, что успешное решение подобных задач требует значительно больших трудозатрат и более серьезной модели.
2) Если Вы вспомните, что свеча - это графическое изображение четырех индикаторов, один из которых график локальных минимумов на заданном тайме, то задача о двойном дне легко формализуется и решается.
3) Ваш тезис о том, что "Однако если дно на одном таймфрейме будет выглядеть именно как чёткая формация, то на другом таймфрейме этот паттерн может и не являться самым низким дном" является ошибочным.

0 +

Максим Милованов — 29 марта 2014 г.

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

0 +

k-181987 — 18 мая 2015 г.

Здравствуйте Максим.
Понравилась ваша статья.Ваш алгоритм написан для Wealth-lab.
Скажите пожалуйста,можно ли его вставить его в Трейдматик и протестировать?
Зарание благодорю за ответ (я новичок) с ув.Евгений

0 +

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору