ГЛАВА 11
Поговорим о данных
Когда вы определили вход, выход, рынок и таймфрейм/длину бара, наступает время одного из самых важных, самых недооцененных и при этом наименее понятных аспектов тестирования: рыночных данных. Люди принимают данные как нечто само собой разумеющееся, и это может быть большой ошибкой. Мне доводилось видеть огромные различия в производительности стратегий лишь из-за разных источников данных. Я допускаю, что ваши данные чистые, корректные, без пропусков и прочего. Конечно, в реальности такого почти никогда не бывает, независимо от поставщика. Большинство людей понимают, что данные могут содержать ошибки, но не понимают некоторые моменты, связанные с данными:
■ Какое количество данных следует использовать?
■ Использовать данные с биржи или электронные данные?
■ Использовать ли данные непрерывных контрактов?
■ Повлиял ли приход электронных торгов на рыночные данные?
■ Как проводить тестирование на данных с валютного рынка?
Рассмотреть все эти вопросы и принять решения нужно именно сейчас, перед началом тестирования. Возвращение назад и повторное тестирование стратегии с иной структурой данных обычно означает, что вы будете использовать некачественные данные, а это плохо.
■ Какое количество данных следует использовать?
Если вы в чем-то похожи на меня, то наверняка не раз проводили «тестирование на глаз». Вы смотрите на график и, зная свои критерии входа и выхода, проводите быстрое тестирование на нескольких днях или неделях истории. Если после нескольких сделок вы получаете достаточно прибыли, вы воодушевляетесь и переходите к более глубокому анализу. Если же вы получаете убытки, то либо бросаете эту стратегию, либо вносите в нее небольшие корректировки и тестируете ее снова.
Надеюсь, вы понимаете бесполезность такого примитивного теста. Слишком мало сделок, мало рыночных условий – слишком мало всего, чтобы принять взвешенное решение. Чтобы добиться долгосрочного успеха, нужен бо́льший объем данных.
Так какой же объем данных можно считать приемлемым? Когда меня спрашивают об этом, я почти всегда отвечаю: «Как можно бо́льший». Бо́льшее количество данных воспроизводит больше рыночных условий: больше бычьих рынков, больше медвежьих рынков, больше боковых рынков; больше спокойных периодов и больше волатильных. Чем больше сделок вы совершите и чем дольше ваша система остается прибыльной, тем меньше вероятность того, что результаты были случайными. Вспомните подбрасывание монеты. Подбросив ее один раз, вы получаете шанс выпадения орла 50/50. Если же вы подбросите монету 10 раз, вероятность того, что орел выпадет хотя бы один раз, уже выше. А если вы подбросите монету 100 раз, то у вас практически гарантированно выпадет как минимум один орел. Чем больше бросков, тем выше уверенность; аналогичным образом больше уверенности придаст вам и бо́льшее число сделок.
Для свинговых стратегий на дневных графиках (сделки в них удерживаются от нескольких дней до нескольких недель) оптимальным компромиссом я считаю применение 10-летних данных. Это позволяет протестировать стратегию в разных рыночных условиях и хорошо подходит для пошагового форвардного тестирования (которому требуется время для инициализации).
Для внутридневных и краткосрочных стратегий я тоже предпочитаю использовать 10-летние данные. Однако на практике – например, после перехода на электронную торговлю – это трудно реализовать. Поэтому часто я использую лишь 5-летние данные, понимая, что результаты, возможно, будут менее надежными, чем у стратегии, протестированной на 10-летней истории.
Для некоторых людей период 5-10 лет является слишком длинным или такие данные им попросту недоступны. В подобных случаях я рекомендую воспользоваться следующим подходом: на каждое правило и параметр торговой стратегии должно приходиться как минимум от 30 до 100 сделок. Например, если стратегия имеет два условия для входа и два условия для выхода, то я хотел бы протестировать ее на 120-400 сделках. Возможно, будет приемлемым и меньшее количество сделок, но в этом случае возрастает риск «подгонки» стратегии под данные.
Недостаток использования максимального количества данных заключается в том, что разработка стратегии значительно усложняется. Давайте посмотрим правде в глаза: в лучшем случае большинство представленных на рынке торговых стратегий выходят на уровень безубыточности до вычета комиссий и проскальзывания. Это означает, что чем дольше вы ее тестируете, тем выше вероятность, что валовая прибыль вернется к нулю. Думаю, вы уже видели это: в течение одного, трех или шести месяцев стратегия показывает великолепные результаты – а в следующем периоде полностью возвращает в рынок всю накопленную прибыль. Так что спросите себя, что вы хотите – стратегию, дающую стабильный положительный результат в течение длительного периода, или «звезду», блестяще работающую короткое время? Первую найти гораздо сложнее – вторая чаще приводит к убыткам в реальной торговле.
■ Какие данные следует использовать: биржевые или электронные?
В былые времена, когда все торговые операции осуществлялись в биржевой яме, вопрос данных решался просто: использовались данные из ямы, поскольку других просто не существовало! Сегодня же, когда превалирует электронная торговля, вариантов стало гораздо больше:
■ Только биржевые данные
■ Только электронные данные
■ Как биржевые, так и электронные данные
■ Данные только в течение традиционных часов работы биржи
■ Данные за все часы работы биржи
■ Данные дневной/вечерней сессии
Выбор данных на будущее кажется очевидным: электронные данные являются наилучшим вариантом, поскольку именно в них сейчас сосредоточен наибольший объем информации. Но что делать при бэктестировании стратегии?
Чтобы подчеркнуть эту дилемму, приведу простой пример. Допустим, вы торгуете золото и хотите использовать 20-летние данные (отличный выбор!) на 60-минутном таймфрейме. 20 лет назад единственным источником данных была биржевая яма, иного выбора не было. В рамках внутридневной биржевой сессии было, грубо говоря, шесть-восемь баров (хотя количество 60-минутных баров в день менялось, поскольку менялись часы работы биржи). Допустим, в вашей стратегии используется скользящая средняя с периодом 14, т. е. данный период охватывает примерно два торговых дня.
Теперь переместимся на современные электронные рынки. Сейчас торговля идет почти 23 часа в сутки. Если вы по-прежнему используете скользящую среднюю с периодом 14, то теперь она охватывает лишь половину торгового дня, тогда как раньше – два полных дня. Как вы думаете, может ли это радикально повлиять на результаты вашего бэктестирования? Еще бы!
Как с этим быть? Я в значительной степени полагаюсь на дневные данные, особенно на расчетные цены дня. Биржевые и электронные расчетные цены идентичны. Мне не нравится использовать дневные максимумы и минимумы, потому что диапазон между максимумом и минимумом биржевой сессии, как правило, меньше, чем между максимумом и минимумом в электронной торговле. Если это звучит запутанно, просто представьте себе ночной ценовой шок, который длится час и затем возвращается к прежнему уровню. В былые времена, когда вся торговля проходила в биржевой яме, такой шок вообще не отразился бы в данных, потому что приходился бы на ночь. Для электронных данных дневной максимум будет включать этот ценовой шок. В результате в «старые времена» ваша стратегия будет работать иначе, чем сегодня.
Один прием, который помогает сделать все данные однородными – выбрать стандартное дневное торговое время и применить его ко всей базе исторических данных. Например, торговля валютами в биржевой яме когда-то проходила с 08:20 до 15:00 по восточному поясному времени. Чтобы сохранить этот интервал времени в электронную эпоху, я создаю специальную «биржевую сессию для валютного рынка» с 08:20 до 15:00 для всех исторических данных. Тогда мои данные становятся полностью согласованными.
При таком количестве вариантов я настоятельно рекомендую уделить время и подумать, какие данные вы используете. Лучший способ – убедиться в их согласованности на всем протяжении бэктестирования. Хотя создать такие данные может быть совсем не просто.
■ Непрерывные контракты
Одна из концепций, которая заводит в тупик многих начинающих разработчиков торговых стратегий – это использование непрерывных контрактов при тестировании фьючерсов. Необходимость непрерывных контрактов диктуется тем, что каждый фьючерсный контракт имеет ограниченный срок действия, а непрерывные контракты создают беспрерывный поток данных. Концепция проста: искусственно «сшить» истекающие контракты, чтобы получился один непрерывный поток. Но ее реализация усыпана ловушками, поджидающими новичков. Я расскажу об этих ловушках в рамках трех основных методов выбора фьючерсных данных.
Самый «чистый» способ тестирования фьючерсов – просто использовать «сырые» контракты без сшивки. Тогда вообще не нужно беспокоиться о непрерывных контрактах. Но проблема в том, что большинство торговых платформ не приспособлены для этого. Допустим, вы хотите протестировать стратегию на фьючерсе на евродоллар. Если бы вы тестировали его в 2013 году, то с 1 января до 15 марта использовали бы мартовский контракт 6EH13. С 15 марта до 15 июня – июньский контракт 6EM13. Так вы прошли бы через все годы своей базы данных. Но такой подход создает проблемы в тестировании. Во-первых, вам пришлось бы прописывать логику: (1) определять правильную дату завершения торгов для каждого контракта (то есть до первого дня уведомления или до последнего торгового дня, в зависимости от того, что наступит раньше) и (2) выполнять ролловер текущей позиции из старого контракта в новый. Это, безусловно, можно реализовать, но потребуется детальное программирование. Более серьезная проблема возникнет, если вы захотите оптимизировать стратегию на всех этих контрактах. Большинство торговых платформ требуют, чтобы оптимизация запускалась на одном графике данных. При наличии множества отдельных контрактов вы не сможете выполнить оптимизацию, кроме как вручную, а это утомительный и долгий процесс.
Чтобы обойти ограничения тестирования на отдельных контрактных данных, многие объединяют данные контрактов в так называемый непрерывный контракт. Существует два основных (и множество менее популярных) способа создания непрерывного контракта – и, разумеется, у обоих есть серьезные недостатки.
Первый способ – нескорректированный непрерывный контракт. В приведенном выше примере 15 марта данные переходят с мартовского контракта на июньский. Преимущество этого метода в том, что исходные данные сохраняются – никаких корректировок дат не проводится. Недостаток этого метода заключается в том, что на момент ролловера цена двух контрактов редко, если вообще когда-либо, будет абсолютно одинаковой. Часто ближайший месяц торгуется с заметным дисконтом или премией к следующему месяцу. На рисунке 11.1 показан пример. Использование этих данных в неизменном виде будет приводить к ложным сигналам, а также к ложным прибылям и убыткам. Предположим, вы находитесь в длинной позиции по ноябрьскому контракту по сое и переходите на майский контракт. При спреде 38 пунктов стратегия на нескорректированном непрерывном контракте решит, что на рынке произошел реальный гэп и вы на нем заработали. Но на самом деле вы никак не могли получить прибыль на этом гэпе. Он существует лишь потому, что изменился срок экспирации контракта.
Многие обходят этот искусственный гэп, используя так называемый контракт с корректировкой прошлых цен. В этом случае гэпы устраняются, а все предыдущие данные соответствующим образом корректируются. Пример: 15 марта июньский контракт по фьючерсу на евродоллар закрывается по цене 1,3512, а мартовский – по 1,3516, разница составляет 0,0004. Чтобы устранить этот гэп, ко всем данным, начиная с марта и далее в историю, нужно прибавить 0,0004. Это устранит гэп и даст красивый непрерывный поток данных. Такое решение кажется идеальным.
Рисунок 11.1. Цены контрактов в разные месяцы различаются.
Рисунок 11.2. Непрерывные контракты с корректировкой прошлых цен могут показывать отрицательные цены
Разумеется, идеальных методов не бывает, и у этого метода тоже есть две проблемы, одну из которых почти никто не обсуждает (по крайней мере, я никогда не встречал никаких упоминаний о ней). Первая проблема заключается в том, что постоянный учет гэпов при каждом ролловере приводит к тому, что исторические данные могут стать отрицательными. На рисунке 11.2 показан пример этого. Очевидно, что нефть никогда не имела отрицательной цены, но непрерывный контракт будет показывать минус, и ваша стратегия будет тестироваться на таких данных. Хотя эти данные выглядят странно (лучше не показывайте друзьям ваш «Святой Грааль» – стратегию на таких данных – люди подумают, что вы сошли с ума), результаты остаются корректными, если только вы не попадете во вторую ловушку.
Вторая ловушка контрактов с корректировкой прошлых цен – это как раз та проблема, которая с наибольшей вероятностью приводит к некорректным торговым результатам. В двух словах: когда вы применяете непрерывные контракты, нельзя использовать индикаторы, которые делят или умножают цены. Лучше всего это видно на примере:
Предположим, стратегия использует процентное изменение цены закрытия: closei/closei-1. 10 марта вы используете мартовский контракт, и цена закрытия составляет 1,3500. Днем ранее она была 1,3420. Таким образом, процентное изменение цены равно: 1,3500 / 1,3420 = 1,00596.
Перемотаем вперед до 20 марта, когда первоначальным контрактом стал июньский. При создании непрерывного скорректированного контракта к мартовским данным была добавлена корректировка +0,0030 (это крайне большая величина для корректировки цены при ролловере, просто чтобы подтвердить данные умозаключения). Теперь цена закрытия 10 марта составляет 1,353, а предыдущая – 1,345. И новое процентное изменение цены уже равно: 1,353 / 1,345 = 1,00595. Значение за ту же дату изменилось! И при каждом следующем ролловере оно снова будет меняться. Это означает, что при тестировании стратегии, использующей такие отношения цен, сигналы, полученные на исторических данных, будут отличаться от сигналов, полученных в реальном времени. Возможно, разница будет небольшой, но она будет всегда. И возникает вопрос: «Можно ли доверять результатам тестирования, о которых вы заранее знаете, что в будущем они изменятся?»
Если это различие кажется вам незначительным, то представьте, что произойдет, когда ценовые данные будут приближаться к нулю – еще одна известная проблема скорректированных данных. Деление на ноль или на число, близкое к нулю, даст гигантский результат! В реальном времени этого, естественно, никогда бы не произошло, если только цена инструмента действительно не упала бы до ноля. Но рассчитывать на такое не стоит.
Единственный способ избежать этой ловушки – проявлять особую осторожность, чтобы деление или умножение не применялось к ценовым данным в непрерывных контрактах с корректировкой прошлых цен. В этом случае строго запрещается использовать отношения цен и их процентные изменения. Если вы не будете соблюдать это правило, не удивляйтесь, когда (1) производительность вашей стратегии на исторических данных будет со временем меняться и (2) ваши прошлые результаты перестанут совпадать с будущими.
■ Влияние перехода на электронные рынки
Многие разработчики тестируют свои торговые стратегии только на электронных данных. Они игнорируют данные, полученные с биржевых ям, и потому их тесты обычно охватывают лишь последние несколько лет. Их логика такова: когда появились электронные рынки, сами принципы функционирования изменились настолько, что стратегии, работающие сейчас, вовсе не обязаны работать в давно забытой эпохе биржевых ям. С этим доводом я и согласен, и не согласен.
Электронные рынки, без сомнения, изменили рынок фьючерсов. Без заполненной трейдерами биржевой ямы изменилась вся динамика формирования цены. Многие бывшие трейдеры из ямы, которые отлично зарабатывали на полу, пережили огромные трудности, переходя на электронную торговлю. Большинство пыталось торговать так же, как в яме, но рынок изменился настолько, что эти методы перестали приносить прибыль. Добавьте сюда появление современных компаний высокочастотного трейдинга и тот факт, что торговля на краткосрочных таймфреймах сегодня совершенно не похожа на торговлю в яме.
Тем не менее, в более долгосрочном масштабе почти всеми сырьевыми товарами управляет закон спроса и предложения. Площадка торговли – электронная, яма или смешанная – не влияет на долгосрочную перспективу. Нелогично думать, что высокочастотные трейдеры, находящиеся в сделке всего несколько секунд, могут повлиять на цену товара через два или три месяца.
Учитывая эти противоположные точки зрения, при разработке своих долгосрочных свинговых стратегий я всё же использую данные, полученные в биржевых ямах, и ту историю, которую они предоставляют. Таким образом, моя стратегия может протестировать бо́льшее количество рыночных условий. Если стратегия, которую я создаю для сои, показывает хорошие результаты в 1990-е, 2000-е и 2010-е годы, я отношусь к ней с бо́льшей уверенностью и уважением. Некоторые люди выполняют бэктестирование даже на данных 1970-х и 1980-х годов! Для краткосрочных стратегий, особенно внутридневных, возможно, будет разумным использовать только электронные данные. Если вдобавок ко всему эта стратегия работает и на данных биржевых ям – прекрасно, но я бы не стал делать это обязательным требованием.
■ Тестирование на данных валютного рынка
Если вы тестируете систему для валютного рынка, вам нужно помнить о двух серьезных проблемах. Первая заключается в том, что данные рынка форекс у разных источников значительно различаются. Поскольку рынок форекс децентрализован, в нем нет единой официальной потоковой котировки, как на рынке фьючерсов. Это означает, что у каждого брокера будет свой набор ценовых данных. Разумеется, если вы тестируете и затем торгуете, используя один и тот же источник данных, проблем не возникнет.
Но если вы тестируете стратегию на данных брокера A, а собираетесь торговать у брокера Б, ваша стратегия столкнется с совершенно другими ценовыми данными. В этом случае ваши бэктесты можно смело выбросить: они будут неактуальными. В зависимости от различий в данных результаты могут оказаться лучше или хуже. Но суть в том, что смена источника данных полностью нивелирует результаты всех предыдущих тестирований.
Вторая проблема при тестировании данных на рынке форекс – это типы используемых ордеров. Если вы тестируете систему на данных рынка форекс, нужно очень тщательно контролировать, как ваша стратегия размещает ордера. Из-за проблемы, которую я покажу далее, я использую для входа и выхода только рыночные ордера. В моих стратегиях торговли на валютном рынке нет ни лимитных, ни стоп-ордеров. Разумеется, в итоговой прибыли/убытке каждой сделки я всегда учитываю спред, но благодаря рыночным ордерам мне не приходится беспокоиться о «фантомных» исполнениях.
В чем же заключается ловушка использования лимитных и/или стоп-ордеров на рынке форекс? На фьючерсных рынках существует единый поток данных, который всегда показывает цену, по которой были совершены сделки. На валютном рынке есть поток цен bid и поток цен ask. Разница между ними – это текущий спред, обычно в несколько пунктов. По определению, купить можно только по цене ask, а продать – только по цене bid.
Проблема тестирования торговой стратегии на данных рынка форекс состоит в том, что поток, отображаемый на графике – это, как правило, поток цен bid. Хотя в качестве альтернативы можно отобразить поток данных по запросу (если он доступен), большинство программных средств для тестирования торговых стратегий могут использовать только один поток для расчета результатов сделок. Если ваш софт для торговли умеет рассчитывать исполнение сделок, одновременно используя данные цен bid и ask, вы можете никогда не столкнуться с этой проблемой. Например, необъектно-ориентированная платформа TradeStation может выполнять тестирование только по ценам bid или только по ценам ask. А вот платформа MultiCharts способна выполнять тестирование одновременно как по ценам bid, так и по ценам ask. Так что разумно будет сначала проверить свое ПО. Если же эта проблема для вас актуальна, вот пример, почему это может оказаться серьезным препятствием.
Предположим, вы торгуете на валютной паре EURUSD. Текущая цена – 1,3502/1,3505 (для примера я использую нереалистично большой спред в три пункта, но данный принцип сохраняется и при меньших спредах). Это означает, что цена bid составляет 1,3502, а цена ask – 1,3505. Помните: вы можете купить по цене ask, но не ниже нее, и продать по цене bid, но не выше. Допустим также, что ваше ПО показывает данные bid, поэтому сейчас оно выводит цену 1,3502.
В этом примере ваша стратегия выставляет ордер на покупку по цене 1,3500. Вскоре после этого цена падает до 1,3499/1,3502. Поскольку теперь цена на графике 1,3499, а ваша цена покупки – 1,3500, платформа для тестирования стратегий считает, что вы получили исполнение по 1,3500. Она «думает», что сейчас вы находитесь в длинной позиции, но цена ask дошла только до уровня 1,3502, т. е. в реальности вы не получили бы исполнения.
«Пустяки!» – скажете вы. – «Как часто такое происходит?» Такое никогда не произойдет в убыточных сделках, поскольку в убыточных позициях цена будет продолжать падать, и в реальной торговле вы получите исполнение по такой же цене, как и в бэктесте. Но для прибыльных сделок, которые становятся прибыльными еще до того, как цена ask достигнет уровня 1,3500, ваша сделка на реальном рынке вообще никогда не исполнится. В зависимости от вашей торговой методологии это может привести к огромной разнице между результатами тестирования и результатами реальной торговли. Отчет по бэктесту будет выглядеть чрезмерно оптимистично. А поскольку вы используете эту информацию для разработки своей стратегии, вы можете основывать свои торговые решения на весьма сомнительных данных. Данный пример приведен для отложенных лимитных ордеров, но аналогичная ситуация возникает и со стоп-ордерами: вы можете получить исполнение по цене, которой никогда не было на графике цен bid.
Чтобы избежать этой проблемы, недостаточно просто добавить проскальзывание к каждой сделке, как это часто делают на фьючерсах. Ведь проблема с ценами bid/ask – это не «слегка худшее исполнение», а «либо исполнение, либо отсутствие исполнения». Некоторые торговые платформы предоставляют продвинутые методы обработки ордеров (на платформе TradeStation это называется “price series providers” – «поставщики ценовых серий»). Главное – иметь возможность тестировать стратегию так же, как вы торгуете в реальном времени. Именно поэтому во всех своих стратегиях торговли на валютном рынке я использую рыночные ордера. Поскольку я использую ордера вроде “sell next bar at market” («продай на следующем баре по рыночной цене»), я могу получить убытки, которые будут гораздо больше заранее установленного стоп-лосса, и в этом главный недостаток рыночных ордеров. Представьте, как может измениться цена внутри 5-минутной свечи во время заявления Федеральной резервной системы. Однако в долгосрочной перспективе я знаю, что рыночные ордера всегда будут исполнены, и их результаты в бэктестах – с учетом спреда – совпадают с результатами реальной торговли. Поэтому я считаю такой подход приемлемым, поскольку он дает результаты тестирования, достаточно близкие к реальным исполнениям.
■ Резюме
Как видите, вопросы, связанные с рыночными данными, являются гораздо более сложными, чем кажется из интерфейса торгового софта. Крайне важно заранее потратить время и усилия на изучение и понимание тех данных, с которыми вы работаете. Использование некорректных данных или неправильное использование корректных данных может привести к ложным результатам тестирования. И чаще всего вы даже не будете знать о существовании той или иной проблемы. Я рекомендую вначале уделять столько же времени изучению рыночных данных, сколько вы тратите на формулирование критериев входа и выхода.
Кевин Дейви
Переведено для TLAP
