Блог им. uralpro
Под заголовком «построение системы» будут публиковаться статьи о разработке автоматических алгоритмов, которые помогут трейдерам понять некоторые тонкости создания таких систем и избежать распространенных ошибок. Лучшие советы от популярных западных блоггеров, с моими комментариями по некторым вопросам. Первая статья о том, как правильно готовить исходные данные для стратегии из блога Investment Idiocy.
Тип данных
Алгоритмы автора представляют собой технические системы, использующие только ценовые данные. Не применяются графики на свечах, анализ производится только для временных дискретных серий.
Внутри дня записывается средняя цена ((бид+аск)/2) контракта, предназначенного для торговли. Для тех же временных точек сохраняется величина спреда (аск минус бид) для измерения ликвидности. Таким образом данные Level 2 (для западных рынков) не используются. Также могут быть взяты цены закрытия для базового ( в случае фьючерсной торговли) или взаимосвязанного контракта для измерения контанго/роллирования и т.п. Кроме того могут понадобится цены закрытия линейки фьючерсов и их объемы для осуществления роллирования, подробнее об этом позже.
Средняя цена или цена сделок
Как было сказано выше, коллекционируется в качестве исходных данных средняя цена. Она не является той ценой, по которой совершаются сделки. Но в зависимости от вашей стратегии, вы можете использовать и цену сделок, или даже обе эти цены. Если ваши алгоритмы относительно медленны ( как и у автора блога) разница между ними невелика, на более высоких скоростях вы столкнетесь с эффектом скачков цены между бидом и аском («bid-ask bounce») в случае применения средней цены, что добавит вашим данным дополнительную волатильность. Также в случае высокочастотных алгоритмов может оказывать серьезное влияние задержка в приходе данных.
HFT торговля и сложные алгоритмы исполнения используют данные из более глубоких уровней стакана (level 2), что значительно увеличивает объем сохраняемых данных.
Цены открытия, закрытия и внутри дня
В реальной торговле есть несколько вариантов выбора.
Первый — собирать цены закрытия для тестирования. Здесь вы получаете преимущество, что ваш тест будет относительно точным. Недостаток заключается в том, что вы используте преднамеренно устаревшую информацию для торговли на следующий день. Хотя это не будет сильно влиять на вашу ожидаемую прибыль, мало удовольствия наблюдать, как большая позиция приносит убыток с самого утра, и вам приходится ждать закрытия, чтобы убедится, что система верно предсказала направление.
Может быть большая разница между ценой, которую вы определили и ценой, которую вы наблюдаете в течение дня. Из теста вы знаете, что в результате, скорее всего, получится не столь большое расхождение, но очень неспокойно видеть, как ваш алгоритм находится в длинной позиции при приходе новости, которая, возможно, потребует срочно продавать.
Кроме того, цены закрытия могут быть слегка неверны. Может и нет, если вы торгуете не сильно ликвидными контрактами, тогда они могут быть репрезентативными для реальных торгов.
Другой вариант — использовать внутридневные цены. Это выбор тех, чьи алгоритмы используют сигналы внутри дня, которые настолько часты, что требуют принятия немедленных решений.
Также вы можете сохранять и тот, и другой вид цен, что и делает автор. Нужно быть осторожным и правильно присваивать временную метку ценам закрытия, отмечая их отдельно, либо записывая их в другую таблицу. Не записываются цены открытия, наибольшая и наименьшая цена.
Когда и как часто?
Как часто вы должны забирать данные внутри дня? Скорость и сложность вашей системы, число торгуемых инструментов и частота запросов вашего провайдера могут накладывать верхний предел на этот показатель. Также не имеет большого смысла сохранять данные каждые несколько миллисекунд, если ваша стратегия удерживает позицию несколько недель. Много данных требуют большой емкости носителя и доступ к ним будет медленным.
Должны ли вы использовать фиксированные моменты времени? То есть сохранять данные в 12:00, 13:00 или случайным образом? Фиксированные моменты могут нанести урон, особенно крупным трейдерам, если все будут знать, когда они предпринимают какие-либо действия. Однако, если вы сохраняете данные с иррегулярными интервалами, вы должны потом их правильно обрабатывать, об этом ниже.
Автор собирает данные в часовые серии с иррегулярными промежутками между ними, для его алгоритмов это даже несколько чаще, чем необходимо.
Иррегулярные временные серии
Рассмотрим временную серию фьючерсного контракта на Евродоллар на август 2018 года:
2015-04-23 14:18:54 97.8525 184534 2015-04-23 15:19:41 97.8375 184535 2015-04-23 16:42:34 97.8575 184536 2015-04-23 17:42:56 97.8600 184537 2015-04-23 18:43:21 97.8675 184538 2015-04-23 19:43:42 97.8825 184539 2015-04-23 23:00:00 97.8750 184546 2015-04-24 12:14:24 97.8675 184550 2015-04-24 13:15:26 97.8575 184551 2015-04-24 14:17:33 97.9075 184552 2015-04-24 15:18:31 97.9125 184553 2015-04-24 16:41:23 97.9125 184554 2015-04-24 17:41:42 97.9075 184555 2015-04-24 18:42:01 97.9075 184556 2015-04-24 19:42:22 97.9025 184557 2015-04-24 23:00:00 97.9250 184564 2015-04-27 12:00:05 97.9125 184568 2015-04-27 13:00:29 97.8975 184569 2015-04-27 14:00:55 97.8875 184570
Обратите внимание на последний столбец, представляющий идентификационный номер записи в таблице данных. Цены закрытия помечены здесь временной меткой 23:00:00. Также можно видеть, что интервалы между данными различны, хотя и близки к часовым.
Самое главное для нас, это понять, как использовать эту смесь внутридневных часовых цен и цен закрытия для системы на дневных интервалах. Это же решение мы будем применять и для дневных исторических данных. Давайте предположим, что нам нужно все свести к анализу временных серий на регулярных интервалах. Это должно быть что-то вроде скользящей средней или оценки волатильности.
Здесь мы имеем дело с общей проблемой, характерной для нерегулярных временных серий, когда большая часть теории разработана для данных с одинаковыми промежутками времени. Есть два пути для регуляризации данных — преобразование к равным промежуткам или использование особого кода для управления нерегулярными данными.
Некоторые вещи, которые делать не нужно:
Есть лучшее решение:
В коде автора используются две цены для каждого дня, в соответствии с последним пунктом. Например, на 6 часов 24 апреля применяется цена закрытия 23 апреля (отмеченная 23:00:00) и последняя цена 24 апреля с временной меткой 17:41
2015-04-23 23:00:00 97.8750 184546 2015-04-24 17:41:42 97.9075 184555
Временные метки
Цены должны иметь правильную временную метку. Если она будет неточна, то вы можете получить нехорошую ситуацию с «заглядыванием в будущее», когда тест получает данные раньше, чем это происходит в реальности. Можно использовать время биржи или локальное, фиксируемое в момент прихода данных на вашем компьютере. Если вы сохраняете местное время, то должны записывать и временную зону, это особенно важно при торговле активами из разных временных поясов. Если сохраняете время вашего компьютера, то позаботьтесь о синхронизации времени с другими источниками, чтобы сопоставлять разные события, например, выход новостей.
Также вы можете оставлять время, приходящее с данными, или ставить свою собственную метку.Оба этих метода могут дать неверные результаты. Метки не всегда верны в потоке данных вендора, а тики могут иметь разные величины задержек и приходить в неправильной последовательности. Высокочастотные трейдеры должны брать во внимание эти особенности и учитывать их в своих тестах. Для медленных стратегий разница невелика, используйте простое решение со временем на вашем компьютере и помечайте данные по их приходу.
Имейте, в виду, что цена закрытия не имеет нормальной временной метки. По умолчанию биржевые системы присваивают им метку полночь. Это неверно, так как мого времени до полуночи проходит после закрытия торгов. Вы можете использовать собственно установленную метку для настоящего времени закрытия. Даже если вы используете реальное время закрытия, то лучше сдвинуть его на пять минут позже до округленного значения. чтобы различать внутридневные цены и цены закрытия.
Будьте внимательны к рынкам, которые торгуются 24 часа (например, forex). Узнайте точно, как вычисляются на них цены открытия или закрытия. Нужно быть осторожным и на азиатских рынках, если вы торгуете по европейскому или американскому времени. Цены закрытия могут быть отмечены уже следующим днем относительно вашего часового пояса. И это будет неправильным подходом в случае использования времени вашего компьютера.
В следующей части продолжим рассказ о подготовке данных и узнаем, как осуществлять синхронизацию времени с другими рынками, очищать данные от выбросов, получать данные с малоликвидных рынках и т.д. В конце будет приведен псевдокод для всего процесса подготовки.
Продолжение смотрите на моем сайте или позднее на smart-lab.ru
Спасибо за статью. Всегда читаю вас и правда пытаюсь понять, о чем речь, но не получается полностью. Ну могли бы вы написать небольшую статью или просто комментарий по поводу литературы, которую можно почитать, чтобы понимать изложенное в статье, например, про модель Маркова?
Для людей, которые знакомы только с общим курсом матстата и теорвера с небольшими навыками программирования на ООП (которым я являюсь).
Спасибо.
Статья обычный мусор из интернета.