Успешная проверка алгоритмических торговых стратегий на исторических данных.
Часть 1: Ошибки, оказывающие влияние
Часть 2: Пакеты программного обеспечения для бэктестирования
Часть 3: Операционные издержки
Мы продолжаем серию статей по количественной торговле, которая началась с постов «Количественные торговые стратегии: гид для начинающих» и «Как идентифицировать алгоритмические торговые стратегии». Эти длинные и сложные статьи стали очень популярны, так что я продолжу в аналогичном ключе и расскажу о бэктестировании стратегии .
Алгоритмическое бэктестирование требует знаний во многих областях, включая психологию, математику, статистику, разработку программного обеспечения и микроструктуру рынка/биржи. Я не могу затронуть все эти темы в одной статье, так что разобью их на две или три части. Что мы обсудим сейчас? Я начну с определения бэктестирования, а затем опишу основы его выполнения. Потом опишу ошибки, которые упоминались в статье «Количественные торговые стратегии: гид для начинающих». И далее приведу сравнение различных доступных вариантов программного обеспечения для бэктестирования.
В следующих статьях мы рассмотрим детали реализации стратегии, которые часто лишь упоминаются или игнорируются. Мы также обсудим, как сделать процесс бэктестирования более практичным, добавив особенности торговли на бирже. Затем обсудим операционные издержки и то, как правильно смоделировать их в установках бэктестирования. Мы закончим обсуждением работы бэктестирования и, наконец, рассмотрим пример общей количественной стратегии, известной как парный трейдинг возврата к среднему.
Давайте начнем с обсуждения того, что же такое бэктестирование, и почему мы должны проводить его при алгоритмической торговле.
Что такое бэктестирование?
Алгоритмическая торговля отличается от других типов инвестиционных классов, потому что мы можем с большей вероятностью оценить ожидаемые будущие результаты по прошлым результатам вследствие хорошей доступности данных. Процесс, который это реализует, известен как бэктестирование.
Проще говоря, бэктестирование проводится, предоставляя ваш конкретный алгоритм стратегии потоку исторических финансовых данных, что приводит к получению набора торговых сигналов. У каждой сделки (под которой здесь мы будем подразумевать «двустороннюю передачу» двух сигналов) будут соответствующие прибыль или потери. Накопление этих прибыли/потерь по ходу работы вашей стратегии, бэктестирование приведет к общей прибыли и потерям (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% или более произойдет при бэктестировании, то, скорее всего, вы увидите периоды подобной посадки при торговле вживую. Психологически трудно вынести такие периоды просадки. Я на собственном опыте наблюдал, что может представлять собой затянувшаяся просадка в общественном институте, и это неприятно, даже если бэктестирование прогнозирует такие периоды. Причина, по которой я считаю это «искажением», состоит в том, что часто успешной стратегии мешают торговать во время затянувшейся просадки, а это приводит к существенному невыполнению плановых показателей по сравнению с бэктестированием. Таким образом, даже при том, что стратегия является алгоритмической по своей природе, психологические факторы все еще могут иметь сильное влияние на ее прибыльность. Основная мысль заключается в уверенности, что если при бэктестировании вы видите просадки определенных размера и продолжительности, то вам следует ждать их при торговле вживую, и необходимо упорно продолжать придерживаться плана, чтобы вновь добиться прибыльности.
Автор: Michael Halls-Moore
Источник:
Sucessful backtesting of algorithmic trading strategies – part I
Другие статьи по теме:
Когнитивные и эмоциональные ошибки в инвестировании
Количественные торговые стратегии: гид для начинающих
Бэктестинг — полная чушь и подгонка под кривую?
Комментарии:
serg: оч.верно…