Как Я Сделал Тестер-Оптимизатор Для Поиска Прибыльных Стратегий На Бирже



Введение

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

В алгоритмическом трейдинге при создании механических торговых систем (МТС) очень важен вопрос времени жизни торговых алгоритмов.

Да и найти их на самом деле довольно сложно.

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

И его нужно, что называется, «подкрутить» или оптимизировать под текущие рыночные условия.

Одними из наиболее распространенных являются торговые системы (ТС), работающие со свечными графиками и множеством индикаторов для технического анализа.



Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

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

Для решения этих проблем существуют различные тестеры оптимизации.



Методы оптимизации стратегий

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

Но когда количество изменяемых параметров становится больше двух-трех, а число возможных вариантов стратегии в диапазонах этих параметров начинает исчисляться тысячами и десятками тысяч, то метод перебора порой становится просто невозможным из-за длины времени такое тестирование занимает. Готовые оптимизаторы стратегий есть и в других программных продуктах, таких как Лаборатория богатства , АмиБрокер .

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

Как вы можете воплотить в них свои стратегии? Может ли этот тестер сделать все, что нам нужно? Будут ли тесты отражать реальность? И много других вопросов возникает, когда начинаешь изучать эту тему более детально.

Кроме того, это «черные ящики» и никто не знает, как на самом деле они производят расчеты.

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

Я не верю на слово создателям такого ПО.

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

При этом мы становимся зависимыми от людей, которые нам совершенно не нужны.

В общем, у меня нет к ним доверия.

Все эти проблемы сильно замедляют реализацию алгоритмов и соответственно отнимают наше время и деньги.

И я спросил себя: «Почему бы не написать свой оптимизатор? Неужели это так сложно? Это оказалось сложно, но вполне выполнимо.

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

С этими мыслями я и приступил к работе.

За основу я взял стохастическую оптимизацию.

Стохастическая оптимизация — это класс алгоритмов оптимизации, которые используют случайность в процессе поиска оптимума.

Алгоритмы стохастической оптимизации применяются, если целевая функция сложна, многоэкстремальна, имеет разрывы, шумы и т.п.

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

Я ознакомился с основными используемыми методами стохастической оптимизации - генетикой, Монте-Карло, роем частиц, их разновидностями и другими методами.

Вообще разновидностей стохастических методов очень много.

Например, Метод роя частиц или настолько популярный "Генетические алгоритмы" .

Есть также элегантные решения, такие как алгоритм "Имитация отжига" (красивая гифка справа, советую посмотреть).

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

Так как при таком методе он периодически отклоняется от траектории и дополнительно изучает соседние участки.

Но скорость исследования не самая высокая.

Суть методов одна — мы выбираем случайные значения и так или иначе их анализируем.

От метода к методу меняются только два параметра – скорость исследования и точность.

Более того, оно обратно пропорционально.

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



Ищите крайности

Например, метод «Имитированный отжиг» позволяет найти глобальный экстремум.

Однако, если вдуматься, то сам глобальный экстремум нам ни к чему, если к нему нет сходимости.

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

Вот почему так важно изучать параметры вблизи экстремума.

Если есть конвергенция, значит есть система и эту стратегию можно изучать дальше.

У всех методов стохастической оптимизации есть один общий недостаток — они могут наткнуться на какой-то локальный экстремум и потерять из виду тот самый оптимальный.

Чтобы этого избежать, нужно максимально увеличить площади выборки и количество итераций.

Но от этого страдает скорость вычислений.

Поэтому всегда нужно искать золотую середину.

Из-за сложности и неочевидности расчетов я отложил «Имитированный отжиг» и другие методы «Роев частиц» в сторону.

В результате я пришел к выводу, что самый доступный и удобный метод в моем случае — оптимизация методом Монте-Карло.



Первая версия тестера оптимизатора Монте-Карло



Классический поиск максимума
Логику из статьи я решил взять за основу для своего первого тестера-оптимизатора.

«Нелинейная стохастическая оптимизация методом Монте-Карло» из коллекции СПбГУ.

Всем, кто интересуется этим направлением, советую прочитать их сборники.

Есть много интересных, разнообразных статей об оптимизации в самых разных областях.

Где не используются эти стохастические методы? Итак, вот оно.

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

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

До сих пор я считал критерием прибыльности математическое ожидание.

И так вы можете создать сложный параметр.

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

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

Продолжаем так, пока не достигнем экстремума.

Существует много способов определить величину уменьшения площади образца.

Статистический, где изучают изменение градиента целевой функции, или эмпирический, где смотрят, как быстро меняется сам экстремум от итерации к итерации.

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

Так называемый критерий остановки.

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

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

То есть, насколько урезать многомерную матрицу после каждой итерации на 1% или на 20%, мы решаем в самом начале.

Также мы сразу, учитывая свои временные возможности, решаем, сколько стратегий будем брать из матрицы на каждой итерации для тестирования.

Таким образом, размер матрицы нам совершенно не важен, мы точно знаем, сколько итераций и в каком объеме мы будем проводить! В этом прелесть стохастических методов.

На основании вышеизложенного я написал программу для поиска оптимальных параметров стратегии.

Исходные данные для оптимизации:

  • тестирование торгового инструмента,
  • исторический диапазон,
  • свечные таймфреймы (хоть все, от 5 секунд до нескольких часов),
  • диапазоны рассматриваемых параметров стратегии,
  • шаг в этих диапазонах,
  • процент уменьшения площади выборки после итерации,
  • количество элементов в выборке,
  • количество стратегий, отправленных на тестирование.

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

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

И вообще, диверсифицируя риск того, что что-то не получится.

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

Я долго ломал голову как все синхронизировать, но все получилось автономно, быстро и удобно! При этом все параметры и результаты отображаются в главном окне программы Монте-Карло.

Итак, все, что там происходит, видно и понятно.

Есть окно логирования и окно с результатами тестирования.

После каждой итерации программа открывает сериализованные файлы, подсчитывает по ним статистику, сортирует и отображает на экране.

Интерфейс тестера оптимизатора Монте-Карло:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

В работе:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Конец тестирования.

Лучший результат был с математическим ожиданием 88%.

При этом из 6060 вариантов было проверено только 778, из них 116 повторились.



Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Перед тестированием стратегии проверяются на предмет того, тестировались ли они ранее, потому что ближе к экстремуму плотность увеличивается и в итоге область вокруг максимума покрывается полностью.

И мы не будем тестировать одно и то же снова и снова.

Все результаты тестирования без проблем обрабатываются программой визуализации стратегии «Анализатор».

Вы всегда можете вручную настроить ГЦБ (гарантированное обеспечение), комиссию или изменить стартовый депозит:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

В окне результатов тестирования отображается большая статистическая таблица всех результатов тестирования и оптимизации.

Любой параметр можно отсортировать по столбцу.

При двойном клике по любой строке все параметры переходят в окно визуализации, поэтому в ячейки ничего вводить не нужно (я очень доволен)! Окно результатов теста:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Вместе:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Однако, внедрив первый тестер-оптимизатор Монте-Карло и изучив его работу, я пришел к выводу, что свою задачу он выполняет, но не в том качестве, которое мне хотелось.

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

В моем случае по этому поводу я отсек матрицу вариантов стратегии.

Условная схема работы алгоритма стохастического поиска максимума методом Монте-Карло:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже



Улучшенный алгоритм

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

Но об этом пространстве мы пока почти ничего не знаем и отсекать неизвестные области, мне кажется, довольно опрометчиво.

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

Нам необходимо знать все параметры, при которых стратегия может принести прибыль.

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

При этом мы не можем детально исследовать пространство, а полный поиск обходится нам достаточно дорого.

Что делать в этом случае? Я решил отойти от классической схемы и действовать как в трейдинге: «Вы не можете контролировать свою прибыль, вы можете контролировать только свои риски».

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

Как тогда обрезать матрицу? Мы обрезаем только те участки, которые осмотрели! То есть мы удалим микрообласти вокруг худших изученных стратегий.

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

И мы можем продолжить изучение лучших стратегий в конце оптимизации.

Этот алгоритм показывает, как это работает:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

На самом деле матрица многомерная (в моем случае максимум 9 измерений), но для объяснения принципа работы мы будем использовать наши любимые три измерения:

  • Ось X – параметры «длинной» скользящей средней
  • Ось Y – параметры «короткой» скользящей средней
  • Ось Z — результат тестирования стратегии пересечения «коротких» и «длинных» скользящих средних, в данном случае я взял мат.
Точки в этом пространстве — это уже опробованные варианты стратегий с разными значениями «длинных» и «коротких» скользящих средних.

Чем светлее точка, тем лучше ее ожидание.

В принципе, это можно было бы изобразить в двух координатах:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Но мне больше нравится в трёх координатах — так нагляднее.

Итак, черные точки в пространстве — худшие стратегии по результатам тестирования.

Их линии соединяют путь алгоритма от точки к точке.

Серые точки на плоскости — это стратегии, которые мы удаляем из исследуемой области.

Линии между ними — путь алгоритма удаления стратегий из матрицы.

Линии между черными и серыми точками — это проекция наихудшей стратегии на плоскость.

Одиночные серые точки на плоскости — это проекции на плоскость уже опробованных стратегий.

Здесь вы можете увидеть, как алгоритм переходит от одной худшей стратегии к другой, начиная с худшей:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже



Преимущества алгоритма:

Мы сознательно удаляем худшие стратегии из пространства исследования.

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

В конечном итоге, наша область исследования сходится ко всем максимумам пространства.

В результате мы получаем что-то вроде этого:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Интерполяцию мне пока накрутить не удалось, поэтому поверхности у меня нет, довольствуюсь точками.

В многомерной матрице можно просмотреть сечения по размерам: «Длинная – математическое ожидание»

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

«Короткая – математическое ожидание»

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Внешний вид тестера-оптимизатора «Исследователь»:

Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Все приложения были полностью написаны на C#.

Прежде чем приступить к оптимизации, настройте следующие параметры:

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

    От этого зависит общее количество итераций и точность оптимизации.

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

    Зависит от мощности ПК, объёма оперативной памяти и глубины исторических данных.

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

Вместо оптимизации можно запустить «случайный поиск».

Здесь стратегии тестируются не на сетке, а в случайном порядке.

То есть мы можем в любой момент остановить исследование и оценить результат. Конечно, чем больше стратегий мы протестируем, тем яснее будет наше понимание пространства.



Как я сделал тестер-оптимизатор для поиска прибыльных стратегий на бирже

Допустим, мы исследовали космос и примерно можем представить, сколько там максимумов.

И что это нам дает? Пока почти ничего.

Нам необходимо исследовать эти максимумы, независимо от того, являются ли они случайными или системными.

Для этого в тестере-оптимизаторе предусмотрена возможность выбирать лучшие стратегии и дополнительно более детально исследовать области вокруг них.

Изучите те стратегии, которые мы пропустили при оптимизации.

Теперь мы знаем почти все о крайностях космоса! Полученные данные можно дополнительно изучить на предмет кластеризации, повторной оптимизации и т. д. Но это уже другая история! P.S. Немного о себе.

С трейдингом познакомился около года назад, сначала торговал вручную, потом понял, что это не для меня.

Я пришел к выводу, что лучше торговать по четким правилам и автоматизированно.

Первый алгоритм был написан на скриптовом языке терминала Quik, но этот язык (qpile) оказался невероятно бедным.

Затем я начал знакомиться с C# и писать на нем своих первых торговых роботов.

Сейчас я создаю многофункциональную платформу для алгоритмического трейдинга.

Всем удачи! С уважением, Алексей.

Теги: #торговые роботы #алготрейдинг #трейдинг #оптимизация #C++ #Алгоритмы #математика

Вместе с данным постом часто просматривают: