История цен с Quandl и IEX

Я сейчас выбираю базу данных для хранения ⏳временных рядов, к которым относится история цен📈. Для себя подготовил несколько классов для скачивания и хранения данных, чтобы упростить дальнейшие тестирования. Со мной Python🐍.

В этот раз мы рассмотрим:

  • Класс для скачивания бесплатной истории цен с Quandl единым архивом.
  • Класс-обертка для хранения данных в HDF5.
  • Класс скачивания цен с биржи IEX.

Quandl, если кратко, это большой онлайн-магазин данных. В частности, там есть история цен акций от разных бирж, фундаментальная история и многое другое. Среди множества платных баз данных там есть бесплатная история цен на ~3000 компаний под кодом WIKI. Данные качественные. Минус в том, что там нет фондов (ETF) и некоторых других активов, что составляет другую половину профессионального рынка США.

Есть платная альтернатива, охватывающая все активы профессионального рынка США, — база EOD. Мы же будем работать только с бесплатной версией.

HDF5 — файловая база данных, которая позволяет быстро записывать на диск pandas-объекты (DataFrame, Series). В основе механизма лежит пакет pytables.

IEX — молодая биржа с большим количеством бесплатных данных, включая тиковую историю за текущий день. Данные предоставляются без задержки, в реальном времени. Мы рассмотрим только получение истории цен.

Aiohttp — данные будем скачивать с помощью асинхронной библиотеки. Быстрая, удобная, хоть и излишняя для наших простых нужд.

🛠Настройки

У нас много задач, а у сайтов-источников разные условия получения данных. Хорошо бы нам всё это настроить для работы. Для этого есть класс Config, который загрузит готовый YAML-файл или, при первом запуске, задаст вопросы, чтобы вы могли всё заполнить самостоятельно. Все настройки будут сохранены на диск в файле config.yaml.

Вам понадобится API-ключ Quandl. Его вы можете получить в личном кабинете на сайте.

Запустить настройки можно командой:

config = Config()

Чтобы все скрипты работали, в репозитории доступен файл requirements.txt, с помощью которого вы можете установить необходимые библиотеки командой:

pip install -r requirements.txt

💾Хранилище HDF5

Для хранилища также создан отдельный класс, который позволит в будущем заменить себя обертками для других баз данных. Хранилище создается командой:

storage = StorageHDF(config.settings, prefix='Quandl')

Теперь полученный объект storage можно передать в объект скачивания цен Quandl, для записи информации в базу данных.

Данные из БД можно получить командой:

data = storage.read(symbols=['AAPL', 'IBM'])

На удивление, данное хранилище абсолютно не подходит для работы с большим количеством тикеров, которые я сделал ключами БД. Чтение по ключу проходит быстро, но запись и получение списка ключей выполняются минуты, десятки минут…

Хранилище подходит для временного хранения промежуточных данных, но бесполезно даже для домашнего хранения истории цен. Просто не хватает терпения их туда залить. MySQL справляется с этим в разы быстрее. А ещё хранилище занимает довольно много места на диске.

💽База данных PostgreSQL

Обновление от 30 июля 2017

Для работы с PostgreSQL создан отдельный класс. Использованы быстрые методы добавления и чтения данных. Пример использования и структура БД описаны в этой статье. Код создания объекта:

storage = StoragePSQL(config.settings)

Полученный объект storage передаем в Quandl для скачивания данных и записи в БД.

Учитывая использованную быструю реализацию получения цен, с объектом работать комфортно. Данные добавляются в БД около 6 минут. На диске база занимает около ~1.5Gb (700Mb индекс).

 

📡Скачиваем всю БД с Quandl

Самое интересное — это скачать за один присест всю базу данных с Quandl. Мы всё скачиваем в pandas.DataFrame, что сразу позволит нам работать с данными.

Команда скачивания и возврата данных в виде pandas.DataFrame (~1.5Gb):

qb = QuandlBundle(config.settings)
df = qb.parse_to_dataframe()

Команда записи в БД. Ограничение (limit=100) необходимо, иначе сохранения на диск придется подождать около часа:

storage = StorageHDF(config.settings, prefix='Quandl')
qb.save_to_db(storage, limit=100)

Чтение напрямую из архива Quandl проходит за пару минут, и вы можете пользоваться всем набором. Если готовы один раз подождать, тогда уберите ограничение и залейте всё в БД. Это сократит время получения истории при следующем сеансе работы.

Чтение из БД осуществляется командой:

storage = StorageHDF(config.settings, prefix='Quandl')

symbols = storage.get_symbols()

data = storage.read(symbols=symbols)

👶IEX

API на бирже бесплатный. Но если вы планируете публиковать полученные данные, то необходимо указать ссылку на сайт IEX. API удобный, цены в реальном времени, есть фундаментал и тиковая история.

Как можно увидеть в документации, история цен сейчас находится в разработке. В API описана возможность получить данные за разные периоды (максимум 5 лет). Описаны правила получения фундаментальных показателей. Можно бесплатно подписаться на тиковые данные в реальном вермени через websocket.

Есть ограничение на 5 запросов в секунду.

Пять лет — это мало, но мы будем надеяться на улучшения в будущем. Вызов для записи цен в БД выглядит так:

iex = IEXPrices(config.settings)

storage = StorageHDF(config.settings, prefix='IEX')
iex.save_to_db(storage, limit=10)

Получение данных из БД осуществляет кодом, аналогичным Quandl.

🎁Код в студию

Поделитесь статьей для доступа к репозиторию с исходным кодом. Вопросы по коду пишите в комментариях💬.

🏁Вывод

Сейчас данных всё больше и они становятся доступны. Есть бесплатные источники, есть качественные источники за адекватную цену… Можно скачивать данные к себе, а можно использовать скачивая при необходимости.

Мне же осталось выбрать хранилище, которое будет масштабируемым, быстрым, компактно хранить данные и при этом быстро работать с Python, учитывая проблемы описанные здесь. Буду это освещать по мере продвижения в следующих статьях.

💬В комментариях напишите, как вы храните историю цен. Какие используете базы данных? А какие базы данных можете посоветовать?

Александр Румянцев aka "i.am.raa"
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.
☝Хотите торговать акциями? 🎓Учитесь у профи👍.