Michael Halls-Moore Знания | Статьи | Системы / Стратегии

Успешная проверка алгоритмических торговых стратегий на исторических данных

14 сентября 2013  Источник / http://www.wave-trading.ru
Пакеты программного обеспечения для бэктестирования

Область программного обеспечения для бэктестирования обширна. Решения простираются от полностью интегрированного институционального высококачественного сложного программного обеспечения до таких языков программирования, как C++, Python и R, где почти все должно быть написано с нуля (или с использованием существующих «плагинов»). Как количественных трейдеров, нас интересует баланс между возможностью «обладания» торговым технологическим стеком и скоростью/надежностью методологии разработки. Вот основные соображения для выбора программного обеспечения:

- Навыки программирования. Выбор среды будет в большой части зависеть от вашей способности программировать. Я считаю, что контроль всего стека приведет к лучшим результатам ваших долгосрочных P&L, чем аутсорсинг, на сколько это возможно для программного обеспечения продавца. Это происходит из-за риска снижения курса акций при наличии внешних ошибок или особенностей, которые вы неспособны исправить в программном обеспечении продавца, и которые были бы легко исправлены, если бы вы имели больший контроль над своим «стеком технологий». Вы также хотите использовать такую среду, которая устанавливает верный баланс между производительностью, доступностью библиотек и скоростью исполнения. Мои рекомендации будут ниже.

- Способность исполнения/ взаимодействие с брокером. Некоторое программное обеспечение для бэктестирования, такое как Tradestation, привязано напрямую к брокеру. Я не поклонник такого подхода, поскольку сокращение операционных издержек часто является важным компонентом получения более высокого коэффициента Шарпа. Если вы будете привязаны к конкретному брокеру (а Tradestation «вынуждает» вас это делать), то вам будет труднее переходить на новое программное обеспечение (или к новому брокеру), если возникнет такая потребность. Interactive Brokers предоставляют API (интерфейс программирования приложения, Application Programming Interface), который является функциональным, хотя и немного непонятным.

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

- Сложность стратегии. Некоторое программное обеспечение просто не подходит для решения числовых задач большого объема или большой математической сложности. Excel является одним из них. В то время как он хорош для более простых стратегий, но не может быстро справиться с большим количеством активов или более сложными алгоритмами.

- Минимизация ошибок. Не является ли конкретная часть программного обеспечения или данных источником ошибок торговли? Если вы хотите самостоятельно реализовывать всю функциональность, то должны удостовериться, что не вводите ошибок, приводящих к искажениям.

- Скорость разработки. Не следует проводить месяцы за реализацией инструмента бэктестирования. Разработка прототипа должна занять лишь несколько недель. Удостоверьтесь, что ваше программное обеспечение сильно не препятствует вашему прогрессу, пытаясь захватить лишь несколько дополнительных процентных пунктов быстродействия. Использование здесь C++ явно является избыточным!

- Скорость исполнения. Если ваша стратегия полностью зависит от своевременности исполнения (как для высокочастотной торговли (high frequency trading, HFT) и сверх-высокочастотной торговли (Ultra-high frequency trading, UHFT)) тогда будет необходимо использовать такой язык, как C или C++. Однако это будет граничить с оптимизацией ядра Linux и использованием FPGA (Field Programmable Gate Array, логическая матрица, программируемая пользователем) для этих задач, что выходит за рамки этой статьи!

- Стоимость. Многие программные среды, с помощью которых вы можете программировать алгоритмические торговые стратегии, абсолютно бесплатны и имеют открытый исходный код. Фактически, многие хедж-фонды используют общедоступное программное обеспечение для всех своих алгоритмических торговых стеков. Кроме того, Excel и MATLAB и относительно дешевы, и даже существуют их бесплатные аналоги.

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

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

Сравнение программных средств для бэктестирования

Excel MS

Описание: Программное обеспечение WYSIWYG (what-you-see-is-what-you-get, получаете то, что видите) в виде таблицы. Широко распространено в финансовой сфере. Данные и алгоритм тесно связаны.

Исполнение: Да, Excel можно привязать к большей части брокеров.

Настраиваемость: Макросы VBA предоставляют более продвинутую функциональность ценой сокрытия реализации.

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

Минимизация ошибок: ошибки заглядывания вперед легко обнаружить посредством выделения ячеек (не принимая во внимание VBA).

Скорость разработки: Быстрый для осуществления основных стратегий.

Скорость исполнения: Маленькая скорость исполнения, подходящая только для низкочастотных стратегий.

Стоимость: Дешевый или бесплатный (в зависимости от лицензии).

Альтернатива: OpenOffice

MATLAB

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

Исполнение: Нет родной возможности исполнения, MATLAB требует отдельной системы исполнения.

Настраиваемость: Огромное число плагинов от сообщества для почти всех областей вычислительной математики.

Сложность стратегии: Многие передовые статистические методы уже доступны и тщательно протестированы.

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

Скорость разработки: Короткие скрипты могут легко создать сложную систему бэктестирования.

Скорость исполнения: С учетом алгоритма векторизации/параллелизации, MATLAB чрезвычайно оптимизирован. Беден на традиционные способы итерации.

Стоимость: Лицензия около $1000.

Альтернатива: Octave, SciLab

Python

Описание: Язык высокого уровня, разработан для скорости разработки. Огромное количество библиотек для практически любой вообразимой задачи с программным управлением. Получил широкое признание в хедж-фондах и инвестиционных банках. Скорость исполнения не такая большая, как у C/C++.

Исполнение: Плагины Python существуют для крупных брокеров, таких как Interactive Brokers. Следовательно и бэктестирование, и система исполнения могут быть частью того же самого «технического стека».

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

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

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

Скорость разработки: Главное преимущество Python заключается в скорости разработки с надежными встроенными возможностями тестирования.

Скорость исполнения: Не так быстр, как C++, но научные вычислительные компоненты оптимизированы, и Python может взаимодействовать с нативным C посредством определенных плагинов.

Стоимость: Бесплатный/с открытым исходным кодом

Альтернатива: Ruby, Erlang, Haskell

R

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

Исполнение: R обладает плагинами для некоторых брокеров, в особенности Interactive Brokers. Таким образом, можно написать полную систему полностью на R.

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

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

Минимизация ошибок: Аналогичный уровень вероятности появления ошибок, как и для любого другого языка высокого уровня, такого как Python или C++. Таким образом, должно проводиться тестирование.

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

Скорость исполнения: R медленнее, чем C++, но остается относительно оптимизированным для векторных операций (как MATLAB).

Стоимость: Бесплатный/с открытым исходным кодом

Альтернатива: SPSS, Stata

C++

Описание: Сформировавшийся, высокоуровневый язык, разработан для скорости исполнения. Огромное количество библиотек количественных финансов и числовых библиотек. Его тяжелее отладить, и это часто занимает больше времени, чем на Python или MATLAB. Чрезвычайно распространен как на стороне покупателя, так и на стороне продавца.

Исполнение: Большая часть брокерского API написана на C++ и Java. Таким образом, существует много плагинов.

Настраиваемость: C/C++ предоставляет прямой доступ к основной памяти, следовательно могут быть реализованы сверх-высокочастотные стратегии.

Сложность стратегии: C++ STL предоставляет огромное число оптимизированных алгоритмов. Почти любой специализированный математический алгоритм обладает бесплатной реализацией C/C++ в сети с открытым исходным кодом.

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

Скорость разработки: C++ более многословный по сравнению с Python или MATLAB для того же самого алгоритма. Больше строк кода (lines-of-code, LOC) часто приводит к увеличению вероятности появления ошибок.

Скорость исполнения: C/C++ имеет чрезвычайно большую скорость исполнения и его можно хорошо оптимизировать для определенной вычислительной архитектуры. Это основная причина его использования.

Стоимость: Разные компиляторы: Linux/GCC бесплатный, MS Visual Studio имеет разные лицензии.

Альтернатива: C#, Java, Scala

Разные стратегии потребуют использования разных пакетов программ. Стратегии HFT и UHFT пишутся на C/C++ (сейчас они часто выполняются на GPUs и FPGAs), тогда как низкочастотные стратегии для акций легко осуществить в TradeStation из-за структуры «все в одном» программного обеспечения/брокерского API.

Лично я отдаю предпочтение Python, поскольку он обеспечивает нужную степень настраиваемости, скорости разработки, возможности тестирования возможностей и скорость исполнения для моих потребностей и стратегий. Если я нуждаюсь в чем-нибудь более быстром, я могу «обратиться» к C++ непосредственно из моих программ, написанных на Python. Многие количественные трейдеры предпочитают писать прототип стратегии на Python, а затем циклически преобразовывать более медленные части исполнения на C++. В конечном счете, весь алгоритм будет написан в C++ и его можно будет «оставить в покое для торговли»!

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

В предыдущих частях мы обсудили статистические и поведенческие ошибки, которые оказывают влияние на результаты нашего бэктестиования. Мы также обсудили пакеты программ для бэктестиования: Excel, MATLAB, Python, R и C++. В этой статье мы рассмотрим как учитывать операционные издержки, а так же и конкретные решения, которые необходимо принять при создании инструмента бэктестиования, такие как тип заявок и частотность данных.

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

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

Комиссии/сборы

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

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

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

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

Инструмент с более высокой волатильностью более склонен к движению, и цены сигнала и выполнения могут существенно отличаться. Задержка (latency) определена как разница между временем генерирования сигнала и временем его выполнения. Высокочастотные стратегии более чувствительны к проблемам с задержками, и улучшение времени ожидания на миллисекунды может повлиять на доходность. Также важен тип стратегии. Импульсные системы (momentum system) в среднем больше страдают от проскальзывания, потому что пытаются использовать инструменты, которые уже двигаются в направлении прогноза. Обратное верно и для стратегий возврата к среднему, так как они двигаются в направлении, противоположном сделке.

Воздействие на рынок / Ликвидность

Воздействие на рынок – затраты, понесенные трейдерами из-за динамики спроса/предложения биржи (и актива), через которую они пытаются торговать. Крупная заявка на относительно неликвидный актив, скорее всего, существенно сдвинет рынок, поскольку сделка должна будет получить доступ к большой части текущего предложения. Чтобы противостоять этому, крупные сделки делят на более мелкие, которые периодически проводятся по мере того, как новая ликвидность поступает на биржу. С другой стороны, для высоколиквидных инструментов, таких как фьючерсный контракт индекса S&P500 E-Mini, малообъемные сделки вряд ли сдвинут «текущую цену» на какое-то большое значение.

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

Модели операционных издержек

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

Модели плоских/постоянных операционных издержек

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

Модели линейных/кусочно-линейных/квадратичных операционных издержек

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

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

Проблемы реализации бэктестиования стратегии

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

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

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

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

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

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


Особенности данных OHLC

Есть специфические проблемы, связанные с бэктестиованием стратегий, у которых ежедневные данные используются в форме OHLC (цена открытия (Open), максимум (High), минимум (Low), цена закрытия (Close)), особенно для акций. Заметьте, что в такой форме предоставляет данные Yahoo Finance, а они являются самым распространенным источником данных для розничных алгоритмических трейдеров!

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

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

Мы продолжаем серию статей по количественной торговле, которая началась с постов «Количественные торговые стратегии: гид для начинающих» и «Как идентифицировать алгоритмические торговые стратегии». Эти длинные и сложные статьи стали очень популярны, так что я продолжу в аналогичном ключе и расскажу о бэктестировании стратегии . Алгоритмическое бэктестирование требует знаний во многих областях, включая психологию, математику, статистику, разработку программного обеспечения и микроструктуру рынка/биржи. Я не могу затронуть все эти темы в одной статье, так что разобью их на две или три части. Что мы обсудим сейчас? Я начну с определения бэктестирования, а затем опишу основы его выполнения. Потом опишу ошибки, которые упоминались в статье «Количественные торговые стратегии: гид для начинающих». И далее приведу сравнение различных доступных вариантов программного обеспечения для бэктестирования.

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

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

Что такое бэктестирование?

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

Проще говоря, бэктестирование проводится, предоставляя ваш конкретный алгоритм стратегии потоку исторических финансовых данных, что приводит к получению набора торговых сигналов. У каждой сделки (под которой здесь мы будем подразумевать «двустороннюю передачу» двух сигналов) будут соответствующие прибыль или потери. Накопление этих прибыли/потерь по ходу работы вашей стратегии, бэктестирование приведет к общей прибыли и потерям (profit and loss, «P&L» или «PnL»). Это является сутью идеи, хотя, конечно, «дьявол всегда прячется в мелочах»!

Какие основные причины для использования бэктестирования в алгоритмической стратегии?

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

- Моделирование. Бэктестирование позволяет нам (надежно!) проверить новые модели конкретных явлений рынка, таких как операционные издержки, направление ордеров, время отклика (latency), ликвидность или другие детали микроструктуры рынка.

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

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


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

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

Ошибки, оказывающие влияние на бэктестирование стратегии

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

Есть четыре основных ошибки, которые я хочу обсудить: ошибка переоптимизации (Optimisation Bias), ошибка заглядывания вперед (Look-Ahead Bias), систематическая ошибка выжившего (Survivorship Bias) и искажение психологической толерантности (Psychological Tolerance Bias).

Ошибка переоптимизации

Эта ошибка, вероятно, является самой коварной из всех ошибок бэктестирования. Она приводит к подгонке или введению дополнительных параметров торговли, если результаты работы стратегии при использовании набора данных для бэктестирования не очень привлекательны. Однако результаты стратегии при торговле вживую могут заметно отличаться. Другое название этой ошибки: «подгонка кривой» (curve fitting) или ошибка «совать нос в чужие данные» (data-snooping bias).

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

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

Ошибка заглядывания вперед

Ошибка заглядывания вперед появляется в системе бэктестирования, когда в имитации будущие данные случайно добавляются к тестовому набору, хотя фактически они не могли быть доступны. Если мы запускаем бэктестирование в хронологическом порядке, и достигаем момента времени N, то ошибка заглядывания вперед происходит, если данные включены для каждого пункта N+k, где k>0. Ошибки заглядывания вперед могут быть невероятно неуловимыми. Вот три примера возможности появления такой ошибки:

- Технические ошибки. У массивов/векторов в коде часто есть итераторы или индексные переменные. Некорректное измерение этих индексов может привести к ошибке заглядывания вперед, включая данные в N+k для отличного от нуля k.

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

- Максимумы/минимумы. Некоторые торговые стратегии используют значения экстремумов за какой-то период времени, такие как объединение максимальных или минимальных цен в данных OHLC (цена открытия (Open), максимум (High), минимум (Low), цена закрытия (Close)). Однако, поскольку значения максимума/минимума могут быть вычислены только в конце периода, то появляется ошибка заглядывания вперед, если эти значения используются во время текущего периода. Необходимо всегда получать значения максимума/минимума с запаздыванием, по крайней мере, на один период, для любой торговой стратегии, использующей их.

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

Систематическая ошибка выжившего

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

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

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

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

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

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

Искажение психологической толерантности

Это явление не часто обсуждается в контексте количественной торговли. Однако оно широко обсуждается по отношению к не-систематическим (discretionary) торговым методам. Его называют по-разному, но я решил назвать его «искажением психологической толерантности» (psychological tolerance bias), потому что это отражает сущность проблемы. Создавая систему бэктестирования в течение 5 лет или больше, легко смотреть на идущую вверх кривую эквити, вычислять составную годовую прибыль, коэффициент Шарпа и даже характеристики просадки, и быть удовлетворенным результатами. Например, стратегия может обладать максимальной относительной просадкой 25% и максимальной продолжительностью просадки 4 месяца. Это типично для импульсной стратегии. Не трудно убедить себя, что просто терпеть такие убыточные периоды, потому что общая картина нарисована в розовом цвете. Однако, на практике, все намного труднее!

Если историческая просадка в 25% или более произойдет при бэктестировании, то, скорее всего, вы увидите периоды подобной посадки при торговле вживую. Психологически трудно вынести такие периоды просадки. Я на собственном опыте наблюдал, что может представлять собой затянувшаяся просадка в общественном институте, и это неприятно, даже если бэктестирование прогнозирует такие периоды. Причина, по которой я считаю это «искажением», состоит в том, что часто успешной стратегии мешают торговать во время затянувшейся просадки, а это приводит к существенному невыполнению плановых показателей по сравнению с бэктестированием. Таким образом, даже при том, что стратегия является алгоритмической по своей природе, психологические факторы все еще могут иметь сильное влияние на ее прибыльность. Основная мысль заключается в уверенности, что если при бэктестировании вы видите просадки определенных размера и продолжительности, то вам следует ждать их при торговле вживую, и необходимо упорно продолжать придерживаться плана, чтобы вновь добиться прибыльности.
При полном или частичном использовании материалов - ссылка обязательна http://elitetrader.ru/index.php?newsid=188062. Об использовании информации.