Блог им. uralpro

Построение системы. Подготовка данных-1

wheat-price

Под заголовком «построение системы» будут публиковаться статьи о  разработке автоматических алгоритмов, которые помогут трейдерам понять некоторые тонкости создания таких систем и избежать распространенных ошибок. Лучшие советы от популярных западных блоггеров, с моими комментариями по некторым вопросам. Первая статья о том, как правильно готовить исходные данные для стратегии из блога 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

★11
6 комментариев
Добрый день,

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

Для людей, которые знакомы только с общим курсом матстата и теорвера с небольшими навыками программирования на ООП (которым я являюсь).

Спасибо.
avatar
zerohedge, честно говоря, даже не знаю, что порекомендовать. Все, что я до сих пор публиковал, основано, по-моему, на школьном курсе математики. Оно выглядит просто страшно, в основном из-за обозначений и математических символов, но если разобраться, то все оказывается достаточно просто. Еще сложность есть в вычислении множества значений и использования матриц. Но все действия элементарны, их можно хоть в Википедии посмотреть. А книги по программированию, которыми пользовался, написал на своем сайте — нажмите рубрику Литература
avatar
uralpro, благодарю за ответ. Уже начинаю разбираться по немногу…
avatar
Да ни о чем статья. Понимать тут нечего. Для реальных торгов информации чуть менее чем ноль.
avatar
Полностью поддерживаю, вы обещали по делу говорить, а не воду лить.
Статья обычный мусор из интернета.
farok, пожалуй, с вами соглашусь. Для новичка может и есть что-то новое, но для тех, кто чуть-чуть хотя бы занимался торговлей, сведения не новые. Постараюсь в дальнейшем публиковать более содержательные статьи
avatar

теги блога uralpro

....все тэги



UPDONW
Новый дизайн