Stock Prices Save

Графики котировок ценных бумаг с Мосбиржи и NASDAQ

Project README

stock_prices

Build Status

Графики котировок ценных бумаг с Мосбиржи и NASDAQ. Включает в себя кравлер суточных данных и платформу для отрисовки графиков.

https://nerevar.github.io/stock_prices/

Цель проекта — скачивать данные о котировках и рисовать по ним разные графики. Кравлер работает с суточными данными Московской биржи по акциям, облигациям, валюте и ETF через MOEX API Для котировок иностранных ценных бумаг (акций, индексов, биткоинов) используется API Alpha Vantage — оно позволяет скачивать суточные данные по любому тикеру с бирж NASDAQ или NYSE

Данные с Московской биржи (MOEX)

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

Данные иностранных ценных бумаг с NASDAQ

Данные скачиваются по заданному тикеру через параметр 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 DataFrame
Страничка с графиком index.html

Каждый график требует отдельного файла index.html, который бы загружался в браузере и отрисовывал нужный график. Задаётся заголовок страницы в <title>. Для простых графиков можно дальше ничего не менять:

  • при загрузки страницы аяксом загрузятся данные values.csv из той же папки
  • и отрисуется HighStock график с помощью метода 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

Добавить новый график

  1. Скопипастить папку любого графика из graph_data/, оставив graph.py и index.html
  2. Настроить в graph.py:
    • Для московской биржи: в функциях market_filter и quote_filter задать рынок и код ценной бумаги (название или ISIN)
    • Для NASDAQ: в функции market_filter задать тикер ценной бумаги
  3. В index.html придумать название графика и указать в <title>
  4. Запустить main.py download для скачивания сырых данных с параметрами, описанными выше
    • если нужно, то задать диапазон дат для скачивания в прошлое
  5. Запустить main.py graph для извлечения данных для графика с параметрами, описанными выше
    • задать диапазон дат для обработки данных за большой период
  6. Закоммитить и запушить на гитхаб → график будет доступен по адресу https://nerevar.github.io/stock_prices/graph_data/<папка>/
  7. Если нужно автообновление по крону — то добавить команды из #4 и #5 в Makefile в соответствующие цели

Тесты

TODO

Roadmap:

  • формат (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 корпораты, сравнению дюрации
    • рисовать сразу данные об обороте
Open Source Agenda is not affiliated with "Stock Prices" Project. README Source: nerevar/stock_prices
Stars
92
Open Issues
0
Last Commit
2 years ago

Open Source Agenda Badge

Open Source Agenda Rating