Графики котировок ценных бумаг с Мосбиржи и NASDAQ
Графики котировок ценных бумаг с Мосбиржи и NASDAQ. Включает в себя кравлер суточных данных и платформу для отрисовки графиков.
Цель проекта — скачивать данные о котировках и рисовать по ним разные графики. Кравлер работает с суточными данными Московской биржи по акциям, облигациям, валюте и ETF через MOEX API Для котировок иностранных ценных бумаг (акций, индексов, биткоинов) используется API Alpha Vantage — оно позволяет скачивать суточные данные по любому тикеру с бирж NASDAQ или NYSE
API Московской бирже позволяет скачивать за раз все котировки определённого рынка. Например рынка облигаций.
Поэтому в одном файле хранятся все данные рынка за день. Например в quotes/2019/03/05/2019-03-05-stock-bonds.csv
содержатся цены открытия/закрытия/мин/макс (OHLC) по всем облигациям с указанием названий и ISIN.
Чтобы скачать данные за день, нужно запустить main.py в режиме download
с указанием даты (YYYY-MM-DD) и рынка:
# рынок облигаций, Мосбиржа
python main.py download --engine stock --market bonds --date 2019-03-01
# рынок акций/ETF, Мосбиржа
python main.py download --engine stock --market shares --date 2019-03-01
# индексы, Мосбиржа
python main.py download --engine stock --market index --date 2019-03-01
# валюта, Мосбиржа
python main.py download --engine currency --market selt --date 2019-03-01
Чтобы скачать данные за несколько дней, можно передать диапазон дат:
--date 2018-01-01 --dateend 2018-12-31
Данные скачиваются по заданному тикеру через параметр market
. При этом в качестве engine
нужно указывать nasdaq
.
В бесплатном аккаунте Alpha Vantage установлено ограничение на 5 запросов в минуту и 500 запросов в день.
# индекс S&P 500
python main.py download --engine nasdaq --market INX --date 2019-03-29
# биткоин
python main.py download --engine nasdaq --market BTC --date 2019-03-29
# акции на NASDAQ
python main.py download --engine nasdaq --market FB --date 2019-03-29
python main.py download --engine nasdaq --market GOOG --date 2019-03-29
python main.py download --engine nasdaq --market MSFT --date 2019-03-29
python main.py download --engine nasdaq --market AMZN --date 2019-03-29
python main.py download --engine nasdaq --market YNDX --date 2019-03-29
Запросы к API идут в ручку, только в формате csv, который отдаёт больше данных в прошлое: https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=YNDX&apikey=NNNN
При скачивании тикера с имеющимися данными в папке quotes/NASDAQ/, данные за указанную дату (диапазон дат) будут дописываться в конец csv файла
Платформа предоставляет удобный формат для отрисовки графиков любых ценных бумаг, а также их модифицировать.
Исходные данные котировок и графики хранятся на гитхабе, а точнее хостятся на github pages и доступны по ссылке на сайте https://nerevar.github.io/stock_prices/
Новые графики можно добавлять по образцу имеющихся графиков в папке graph_data/, которые включают в себя:
graph.py
Файл graph.py
должен содержать класс GraphBuilder
, который описывает, по каким данным строить график.
Есть возможность указать как одну линию, так и массив из нескольких линий, например на графике облигаций Грузовичкоф рисуются сразу 2 линии.
Также можно загружать разнородные данные из других графиков (папок) — как в примере yndx_rub
market_filter
возвращает объект с фильтром, из какого рынка брать данныеДля Мосбиржи:
quote_filter
возвращает объект с фильтром для Pandas DataFrame, который из таблицы со всеми котировками оставится только нужнуюget_value
возвращает скалярное значение float или массив float'ов с котировками ценных бумаг. На вход принимается filtered DataFrame за один день.Для Nasdaq:
get_values
возвращает данные для отрисовки графика целиком: массив из пар [timestamp, value]
, на вход принимает данные о ценной бумаге за всё время в Pandas DataFrameindex.html
Каждый график требует отдельного файла index.html, который бы загружался в браузере и отрисовывал нужный график.
Задаётся заголовок страницы в <title>
. Для простых графиков можно дальше ничего не менять:
values.csv
из той же папкиplotGraph
Пример более сложного графика, который использует данные трёх источников, а затем умножает значение акции YNDX на курс доллара: yndx_rub
values.csv
После скачивания исходных данных котировок за определённый день, их нужно сконвертировать в csv для отрисовки графиков в HighCharts.
Для этого нужно запустить main.py в режиме graphs
с указанием даты (YYYY-MM-DD) и графика (списка графиков):
# подготовить данные для графиков индекса Мосбиржи и акций Яндекса за 5 марта
python main.py graphs --date 2019-03-05 --graphs moex yndx_moex
# подготовить данные для графика S&P 500 ЗА ВСЁ ВРЕМЯ (!), очистив предыдущие данные
python main.py graphs --date 2018-01-01 --graphs snp_inx --clear
Графики с Мосбиржи ежедневно строятся по одной точке: данные нового дня дописываются в конец файла values.csv
(!) Данные с nasdaq формируются целиком за всё время, поэтому их нужно запускать с параметром --clear
чтобы очистить предыдущие данные в values.csv
Настроена автосборка в Travis CI https://travis-ci.org/nerevar/stock_prices
Каждый день по крону запускается цель cron
в Makefile, которая за предыдущий полный день скачивает данные и строит графики для бумаг с MOEX и NASDAQ
Артефакты (сырые данные и подготовленные для графиков) коммитятся под пользователем "Travis CI" и отправляются в гитхаб репозиторий в ветку master
благодаря github personal access tokens.
Ветка master
единственная в проекте и Github Pages в проекте строятся по этой ветке.
Скрипты запускаются в окружении MiniConda с python 3.6, которое настраивается в .travis.yml
Также в Makefile можно передать параметр DAY
, чтобы, например, скачать данные и построить графики за определённый день, например:
# скачать данные и построить графики за 10 мая:
make cron DAY=2019-05-10
# только скачать данные MOEX за 10 мая:
make download_moex DAY=2019-05-10
graph.py
и index.html
graph.py
:
market_filter
и quote_filter
задать рынок и код ценной бумаги (название или ISIN)market_filter
задать тикер ценной бумагиindex.html
придумать название графика и указать в <title>
main.py download
для скачивания сырых данных с параметрами, описанными выше
main.py graph
для извлечения данных для графика с параметрами, описанными выше
TODO