Преимущества и недостатки систем бэктестинга

mobile-phone-1513945_640О том, что такое бэктестинг и о проблемах, с которыми можно столкнуться, мы говорили в прошлой статье. Теперь рассмотрим преимущества и недостатки каждой системы.

Цикл с фиксированным числом итераций

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

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

Вот пример когда такого алгоритма:

do_something_with_prices();

    buy_sell_or_hold_something();

    next_bar();

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

Преимущества

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

Недостатки

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

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

Бэктесты «for-цикл» подвержены систематической ошибке опережения из-за багов при индексации.

Бэктесты «for-цикл» на самом деле следует использовать исключительно в качестве механизма фильтрации. Вы можете использовать их, чтобы исключить заведомо плохие стратегии, но к хорошей результативности стоит относиться скептически. Часто нужны дальнейшие исследования. Стратегии редко оказываются лучше в реальной торговле, чем в бэктесте!

Система, основанная на событиях

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

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

- события движения цены вниз или вверх – существенное появление новых рыночных данных

- события для сигнала – создание новых торговых сигналов

- события для ордера – ордера, готовые к отправке брокеру

- информационное событие – поступление информации от брокера

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

Пример псевдо-кода системы, основанной на событиях:

while event_queue_isnt_empty():

    event = get_latest_event_from_queue();

    if event.type == «tick»:

        strategy.calculate_trading_signals(event);

    else if event.type == «signal»:

        portfolio.handle_signal(event);

    else if event.type == «order»:

        portfolio.handle_order(event);

    else if event.type == «fill»:

portfolio.handle_fill(event)

    sleep(600);  # Sleep for, say, 10 mins

Как можно видеть, существует сильная зависимость от модуля обработки портфеля. Такой модуль – это «сердце» управляемой событиями системы бэктеста.

Преимущества

Преимуществ использования системы, основанной на событиях, много:

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

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

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

«Правильное» управление рисками/позицией – можно легко применять модульное проектирование управлением рисками и позицией. Можно легко ввести рычаги и методики, такие, как критерий Келли. Также можно легко включать предупреждения о подверженности сектора риску, ограничения по стоимости, ограничения волатильности и предупреждения о неликвидности.

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

Недостатки

Серьезные недостатки у этой системы тоже есть:

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

Требует ориентации на объект — модульная конструкция предполагает использование принципов объектно-ориентированного программирования (ООП), и, следовательно, языка, который может поддержать ООП. Однако это делает тестирование гораздо более простым.

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

Медленное исполнение – характер передачи сообщений у кода делает его гораздо медленнее по исполнению по сравнению с векторизированным подходом «for-цикл». Из-за многочисленных комбинаций параметров на вычисление неоптимизированных кодов может уйти много времени.

А еще можно опубликовать статью в своем блоге:

  Опубликовать в своем блоге livejournal.com     Опубликовать в twitter.com  
Получайте свежие статьи
блога на ваш e-mail!
Вы можете прокрутить страницу вниз и оставить комментарий. Пинг в настоящее время не разрешен.

Ваши комментарии к статье:

ВКонтакте
FaceBook

Оставьте Сообщение