Графики котировок ценных бумаг с Мосбиржи и 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
должен содержать класс GraphBuilder
, который описывает, по каким данным строить график.
Есть возможность указать как одну линию, так и массив из нескольких линий, например на графике облигаций Грузовичкоф рисуются сразу 2 линии.
Также можно загружать разнородные данные из других графиков (папок) — как в примере yndx_rub
- функция
market_filter
возвращает объект с фильтром, из какого рынка брать данные
Для Мосбиржи:
- функция
quote_filter
возвращает объект с фильтром для Pandas DataFrame, который из таблицы со всеми котировками оставится только нужную - функция
get_value
возвращает скалярное значение float или массив float'ов с котировками ценных бумаг. На вход принимается filtered DataFrame за один день.
Для Nasdaq:
- функция
get_values
возвращает данные для отрисовки графика целиком: массив из пар[timestamp, value]
, на вход принимает данные о ценной бумаге за всё время в Pandas DataFrame
Каждый график требует отдельного файла index.html, который бы загружался в браузере и отрисовывал нужный график.
Задаётся заголовок страницы в <title>
. Для простых графиков можно дальше ничего не менять:
- при загрузки страницы аяксом загрузятся данные
values.csv
из той же папки - и отрисуется HighStock график с помощью метода
plotGraph
Пример более сложного графика, который использует данные трёх источников, а затем умножает значение акции YNDX на курс доллара: yndx_rub
После скачивания исходных данных котировок за определённый день, их нужно сконвертировать в 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_data/, оставив
graph.py
иindex.html
- Настроить в
graph.py
:- Для московской биржи: в функциях
market_filter
иquote_filter
задать рынок и код ценной бумаги (название или ISIN) - Для NASDAQ: в функции
market_filter
задать тикер ценной бумаги
- Для московской биржи: в функциях
- В
index.html
придумать название графика и указать в<title>
- Запустить
main.py download
для скачивания сырых данных с параметрами, описанными выше- если нужно, то задать диапазон дат для скачивания в прошлое
- Запустить
main.py graph
для извлечения данных для графика с параметрами, описанными выше- задать диапазон дат для обработки данных за большой период
- Закоммитить и запушить на гитхаб → график будет доступен по адресу https://nerevar.github.io/stock_prices/graph_data/<папка>/
- Если нужно автообновление по крону — то добавить команды из #4 и #5 в Makefile в соответствующие цели
TODO
- формат (csv) и структура папок для хранения данных
- crawler + paginator
- запись логов
- аргументы cli для запуска за любой день
- исторические данные с биржи
- графики, визуализация
- расчёт индексов
- gh-pages
- другие источники данных:
- nasdaq
- btc
- индекс ВДО http://angrybonds.ru/
- автообновление графиков по крону
- Makefile со списком тикеров, которые будут скачиваться и пушится на гитхаб
- travis ci: download data, commit, push to github
- в кроне за день N для nasdaq, сохранять реально только день N, а не всё, что позже => поддержать --date, --dateend
- datetime в tz Moscow в graph_data
- python тесты
- js тесты
- дополнительная информация про каждого эмитента:
- по облигациям: даты погашения/оферты, купоны для расчёта доходности
- приклеить рейтинг (s&p?), срез по эшелонам
- сделать доходности облигаций
- поддерка нескольких линий на одном графике,
- например ОФЗ vs корпораты, сравнению дюрации
- рисовать сразу данные об обороте