Лучший онлайн-брокер для работы на бирже
88,51
рейтинг
1 октября 2014 в 15:15

Разработка → Назад в будущее: проверка работоспособности торгового робота с помощью исторических данных

image

Ранее мы уже рассматривали вопрос об обязательных этапах разработки торговой стратегии для работы на фондовом рынке. Одной из наиболее важных стадий является тестирование производительности стратегии на исторических данных — бэктестинг. Сегодня мы поговорим именно о нем.

Что это


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

Общая величина дохода или убытка (profit and loss, P&L, PnL) за заданное в торговой стратегии время будет являться показателем успешности или неуспешности алгоритма.

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

  • Фильтрация — каждая стратегия имеет определенные показатели по призводительноси и эффективности работы, которые заложены в нее разработчиком. Соответственно, всякая стратегия, не позволяющая добиться поставленных целей, должна быть «отфильтрована».
  • Моделирование — с помощью бэктестинга разработчики могут тестировать различные рыночные модели (изменение условий ликвидности, транзакционных издержек, скорости обработки приказов, задержки каналов и т.д.) без риска потери реальных денег.
  • Оптимизация — с помощью «прогона» стратегии на исторических данных можно улучшить ее производительность в конкретных рыночных ситуациях.
  • Проверка работоспособности — с помощью тестирования разработчик может понять, не были ли допущены ошибки при описании стратегии в программном коде.

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

image

Заблуждения о бэктестинге


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

Ожидание столь же высоких результатов в будущем

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

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

Использование «будущих» данных

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

Неверная оценка своей психологической устойчивости

При проведении тестов разработчик видит конечную производительность своего алгоритма. Если на определенном временном отрезке (скажем, год или пять лет) система приносит прибыль, то велик соблазн не обращать внимание на просадки депозита (полученные убытки), которые случались по ходу этого пути к успеху. Людям кажется, что они легко смогут пережить потерю 25% своих денег (ведь потом робот должен отыграться).

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

Какие параметры нужно учитывать


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

Транзакционные издержки

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

Проскальзывание и задержки

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

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

Влияние ликвидности

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

Типы торговых приказов

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

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

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

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

image

Их плюсом, несомненно, является тот факт, что цена сделки заранее определена. Список текущих выставленных приказов типа Limit называется очередью заявок (Order book) и выводится в торговых терминалах отдельным окном.

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

Инструменты для бэктестинга


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

  • MS Excel — знакомый всем и каждому Microsoft Excel может быть использован и для написания механических торговых систем. Большинство брокеров позволяют связывать этот инструмент со своими программными продуктами (выгрузка данных и генерация торговых сигналов с помощью VBA). Минусом подобного решения будет невысокая скорость работ, а плюсом бесплатность и быстрота реализации простых стратегий. Альтернатива — Open Office
  • Matlab — программная среда, предназначенная для осуществления сложных вычислений. Существуют плагины для использования в биржевой торговле. С ее помощью можно создавать небольшие скрипты, которые тем не менее описывают довольно сложные стратегии. Минус — система платная и недешевая. Альтернативы для российского рынка TSlab и StockSharp. Также трейдеры используют для создания механических торговых систем продукты MetaStock, Wealth-Lab и Omega.
  • C++/C# — языки программирования, которые широко распространены в финансовом мире. Постепенно популярность набирают Java и Scala.
  • Встроенные инструменты торговых терминалов — в некоторых торговых терминалах есть встроенные средства для создания торговых роботов и бэктестинга стратегий. Соответствующий плагин можно установить в терминал SmartX. Для написания роботов используется скриптовый язык TradeScript.

image

Окно для бэк-тестинга плагина для создания роботов на TradeScript в терминале SmartX

Заключение


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

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

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

Внимание! В ITinvest открылась вакансия разработчика GUI C#, работа заключается в осуществлении фронтент-разработки программных продуктов для торговли на бирже. Подробности по ссылке www.itinvest.ru/about/vacancies/programmer-gui-c.

image

P.S. Если вы заметили опечатку или ошибку — напишите личным сообщением, и мы оперативно все исправим.

Ссылки и посты по теме:

Автор: @IT_invest
ITinvest
рейтинг 88,51
Лучший онлайн-брокер для работы на бирже

Комментарии (9)

  • +1
    Когда вы уже выпустите терминал под мак?
    Приходится с квиком в вайне работать
    Вы же самые продвинутые брокеры
    • 0
      Сейчас пока в приоритете другие проекты (Matrix, мобильные терминалы, новые услуги), но у нас есть желание сделать что-то под Mac. В следующем году вполне возможен какой-то проект в данном направлении
      • –2
        клёво-клёво! если что — могу к вам консультантом пойти)
        я уже себе сделал на коленке терминальчик интересный
        • 0
          Нам бы разработчика :)
          • 0
            нее, пасиб, винда теперь, слава Богам — не моё)
          • 0
            Пишите UI на Sciter и будет вам шастя на Windows, Mac и Linux. Ибо HTML/CSS

  • +1
    ух ты, TradeScript от моего друга Ричарда, давно о нём не слышал. А ведь проработали вместе около 4 лет.

    И полностью согласен с csmile, еще когда работал в Modulus толкал эту тему но так и не прошла.
  • +6
    Забавная форма подачи объявления об открытии вакансии ).А вот по заголовку информации почти нет.
    Я не по наслышке знаю тему автоматических торговых систем (благо сам на МАМБе этому посвятил 6 лет жизни). И в бэктестинге есть определенные ловушки, которые не столь очевидны как вышеперечисленное.

    Любая механическая торговая система базируется на так или иначе заданных числовых параметрах. Допустим, нашли вы такую комбинацию параметров при которых по итогам бектестинга имеете профит. Но бедав том, что факт профита (и факт допустимой просадки на исторических данных) сам по себе почти ни о чем не говорит. Более того, чем больше числовых параметров содержит стратегия — тем проще подобрать такую их комбинацию (генетическим алгоритмом, брутфорсом, градиентным спуском — да кучей способов) при которой всё будет выглядеть радужно. И совершенно (т.е. вообще) не будет работать даже в ближайшем в будущем.

    Проблема состоит в том, что чем сильнее параметризирована система, и чем сложнее зависимости по которым система принимает решения — тем проще сгенерировать по сути своей случайны результат, который формально — выглядит хорошо. Иначе говоря, поскольку рынок есть весьма сильно зашумленная и стохастическая система, то (как и в любом почти-шуме) на любом отрезке данных можно найти «зависимость», которая по факту зависимостью не является а является локальным артефактом временного ряда данных. Т.е. существует ровно на этом отрезке данных (и убедительно существует если оценивать её чисто саму по себе) — но не существует слева и справа от этого окна данных… И увеличение длины окна данных эту проблему, к сожалению, почти никак решает.

    Лично я для борьбы с такими «псевдозависимостями» использовал целый ряд идей.
    Во первых, например, в окрестности найденной «профитной» точки параметров строилось «пространство прибыли». Т.е. числовые параметры системы трактовались как координаты в многомерном пространстве, а финансовый результат соответствующий конкретному набору параметров — как значение многомерной функции. И далее параметры (задающие систему принятия решений — т.е. генерирующие финансовый результат) прогонялись в широком диапазоне около найденной «хорошей» точки. Суть состояла в том, что если точка скорее случайная — то соответствующая многомерная гиперповерхность такой «функции прибыли» будет иметь очень резкий «пик». Т.е. уже при небольших отклонения от «хорошей» точки торговый результат будет драматически падать. Если такое наблюдалось — то такая точка параметров отбрасывалась. Если же многомерная функция прибыли была достаточно «гладкой», т.е. было плавное ухудшение торгового результата по мере удаления от «точки оптимума» (а в идеале — если было что-то типа «плато прибыли», когда вариации параметров в некотором нормальном диапазоне особо не сказывались на прибыли) то к такому набору параметров было намного больше доверия.
    Во вторых, делался тот же самый расчет по заметно мЕньшему окну данных, и ровно по тому же принципу. Далее это мЕньшее окно скользило вдоль основного ряда данных — и на каждом положении искался «локальный оптимум» параметров. Далее строилось облако оптимальных параметров (точек в многомерном пр-ве). И чем сильнее был объем, занимаемый таким облаком — тем менее стабильной была стратегия, и тем меньше было её доверия. Т.к. реально существующая зависимость должна быть относительно стабильна (в том смысле что описано выше — т.е. стабильна в многомерном «пространстве прибыли») на плюс-минус любой мЕньшей выборке данных.
    Ну и т.п.

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

    Это вот всё даже не упомянуто в посте выше, вопреки названию поста… Так что на будущее — пожелание писать побольше конкретики. Чтобы люди внятно понимали, насколько непростым вопросом является работа квантом. А в остальном — спасибо, понастальгировал по былым лихим временам. Да )
  • 0
    Моя любимая беда: это с помощью генетического алгоритма мощно зафититься на исторические данные, получить огромный профит на бектесте, а затем выйти на реальные торги с понятным результатом.

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

Самое читаемое Разработка