Рубрики
Без рубрики

Как получить исторические данные рынка от интерактивных брокеров с помощью Python

При изучении мира количественных финансов или алгоритмической торговли вы быстро заканчиваете … Теги с финансами, Python.

При изучении мира количественного финансирования или алгоритмической торговли вы быстро заканчиваетесь с очень распространенным вопросом: где я получаю данные исторического рынка? Независимо от того, какой анализ или торговля вы планируете делать, вам понадобится доступ к качеству рыночных данных для ваших исследований и разработок. Это может быть сложным и, возможно, дорогим процессом. Если все, что вы хотите, это ежедневно заключает цены на акции США для крупных запасов шапов, вы, вероятно, сможете найти это из нескольких бесплатных или близких к бесплатным источникам. Однако, если вы хотите получить доступ к интрадующим данным (цены в почасовой, минуте или даже набитых уровнях) или данные для других видов ценных бумаг (например, фьючерсы, облигации, иностранные акции), вы найдете данные, чтобы быть немного дороже и трудно найти. Например, я обнаружил, что исторические 1-минутные данные для полных S & P 500, возвращаясь к 1998 году, будут стоить более 750 долларов от нескольких поставщиков, и будет более 50 ГБ данных.

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

Хорошо, должен быть поймать, верно?

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

  • Быть вынужденным использовать Clunky API вместо того, чтобы загружать объемные файлы CSV. Некоторые продавцы, как Полигон Предлагайте объемные файлы загрузки исторических данных, но IB заставляет вас использовать их API, который добавляет немного сложности к процессу.
  • IB установила ограничения на их API для предотвращения того, чтобы пользователи осиливали систему, поэтому загрузки должны быть ограничены, чтобы не помечены для злоупотребления системы. Их серверы также будут оцениваться ограничить ваши результаты, если вы отправите слишком много запросов, и вы можете отключиться.
  • IB не предлагает исторические данные для акций, которые больше не перечислены, поэтому ваш набор данных автоматически пострадает от смещения выживших. Некоторые компании будут приобретены по высоким ценам, другие будут обанкротиться или быть обманутыми, и ваши исторические блики не будут иметь ни одного из этих сценариев. Он также появляется некоторые данные с просроченными фьючерсами, недоступны, но я еще не смог проверить это.

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

Процесс

Для того, чтобы извлечь исторические данные, вам необходимо соответствовать нескольким критериям:

  • Открыл счет IB и финансировал его
  • Загружены и настроили программное обеспечение TWS и Python API
  • Подписано на уровень рынка на уровне 1 (верхнюю часть книги) для любых договоров, которые вы хотите запросить

Пожалуйста, смотрите мой предыдущий пост о том, как сделать все вышеперечисленное. Существует пример приложения, который описывает основы API к IB.

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

  • Не более 50 выдающихся запросов одновременно. Они отмечают, что, вероятно, более эффективно делать меньше запросов, а не пытаться проверить верхний предел.
  • Если просить 30 секундных баров или ниже, нет 6 запросов на тот же договор за 2 секунды, 60 запросов за 10 минут или два идентичных за 15 секунд. Если вы собираетесь последовательные односторонние дни для символа, вы можете ударить этот предел довольно легко.
  • В целом, если ваш запрос вернет более нескольких тысяч баров, вы должны рассмотреть его.

Итак, какие данные доступны? Данные бара доступны в размерах 1, 5, 10, 15 и 30 секунд, но резолюции ниже 30 секунд доступны только в течение шести месяцев с текущей даты. Они также будут генерировать большие стержни 1, 2, 3, 5, 10, 15, 20 и 30 минут и 1, 2, 3, 4 и 8 часов, а также ежедневно, еженедельные и ежемесячные бары. Эти бары могут состоять из сделок, предложений и спрашиваться, средней точки и различных других областей, описанных в Документация Отказ Обратите внимание, что строительные батончики с последней ценой и ставками/просьбой потребуют как минимум на два запроса (торги и Bid_ask), а затем объединить данные вместе. При рассмотрении учета запросов это может факторовать какие-либо решения для загрузки.

В моем тестировании я обнаружил, что более чем несколько тысяч строк данных возвращаются для некоторых запросов (например, для получения ежедневных данных в течение 40 лет AAPL возвращает более 9000 строк, 20 лет NVDA возвращает более 5000 строк одновременно. Для данных Minue Bar я обнаружил, что запросы нескольких дней ежедневных данных будут вызывать ограничение скорости, чтобы вступить в силу.

Конфигурация

Чтобы запустить мой код, вам нужно следовать направления от моего предыдущего поста Чтобы установить IB API. Как только вы активировали свой Python Virtualenv, вам также необходимо убедиться, что вы установили еще несколько библиотек Python.

pyenv activate ib-examplepip install python-dateutil matplotlib jupyter

Код

Я разместил приложение командной строки в Github Это позволяет для некоторых гибких загрузок данных. Он поддерживает несколько различных вариантов командной строки для запроса различных диапазонов данных.

$ ./download_bars.py --help
usage: download_bars.py [-h] [-d] [-p PORT] [--size SIZE] [--duration DURATION] [-t DATA_TYPE] [--base-directory BASE_DIRECTORY] [--currency CURRENCY] [--exchange EXCHANGE] [--security-type SECURITY_TYPE] [--start-date START_DATE] [--end-date END_DATE] [--max-days] symbol [symbol ...]

positional arguments: symbol
optional arguments:
-h, --help show this help message and exit
-d, --debug turn on debug logging 
-p PORT, --port PORT local port for TWS connection 
--size SIZE bar size 
--duration DURATION bar duration 
-t DATA_TYPE, --data-type DATA_TYPE bar data type 
--base-directory BASE_DIRECTORY base directory to write bar files 
--currency CURRENCY currency for symbols 
--exchange EXCHANGE exchange for symbols 
--security-type SECURITY_TYPE security type for symbols 
--start-date START_DATE First day for bars 
--end-date END_DATE Last day for bars 
--max-days Set start date to earliest date

Например, чтобы получить все исторические данные для AAPL в качестве ежедневных баров и поместите файл CSV в ./data/stk/1_day/aapl.csv , бегать:

./download_bars.py --max-days --size '1 day' AAPL

Чтобы получить неделю 1 минуты баров для AMGN, с каждым днем сохранены в качестве отдельного файла CSV в ./data/stk/1_min/amgn , бегать:

./download_bars.py --size "1 min" --start-date 20200202 --end-date 20200207 AMGN

Вы можете ссылаться на код для более подробной информации. Однако на более высоком уровне использование IB исторические данные API включает несколько методов. Во-первых, я использую ReqheadTimestamp Способ найти временной метку для самых ранних данных, доступных для договора. Это полезно, если мы хотим получить доступ к всей истории данных, или проверять, что мы не запрашиваем данные до самой ранней даты. Наш результат для этого запроса обрабатывается в HeadTimestamp метод. Далее мы вызываем ReqhistoricalData Метод, обязательно запросить разумное количество данных. Результаты этого вызова обрабатываются в Историкалатата Метод, который называется один раз для каждого бара. Как только все данные были доставлены, Историкидаленда метод вызывается. Там мы проверяем, что мы получили все наши данные, сохраняйте его на диск и проверьте, есть ли у нас больше данных в нашем TimeSpan для скачивания. Если это так, мы вызываем ReqhistoricalData Способ снова, повторяя этот процесс, пока все данные не будут загружены. Все методы IB хорошо документированы в IB API Документация.

Я также создал Очень простая ноутбука Jupyter Это показывает, как выглядит некоторые данные.

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

Оригинал: “https://dev.to/wrighter/how-to-get-historical-market-data-from-interactive-brokers-using-python-3bcn”