mirovan
0
All posts from mirovan
  mirovan in mirovan,

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

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

 

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

 

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


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

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

Подробное описание алгоритм определения экстремумов.
 
Итак, с алгоритмом определения экстремумов и точкой входа мы определились. Теперь нужно понять, в каком месте мы будем закрывать позицию.  Для систем я обычно использую следующие способы выхода из позиции:
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. Результат тестирования для фьючерса доллар-рубль




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

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

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

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

 

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

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

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

 

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

 

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





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

 
Оригинал статьи на сайте robostroy.ru