Giter VIP home page Giter VIP logo

stock_prices's Introduction

stock_prices

Build Status

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

Цель проекта — скачивать данные о котировках и рисовать по ним разные графики. Кравлер работает с суточными данными Московской биржи по акциям, облигациям, валюте и 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 корпораты, сравнению дюрации
    • рисовать сразу данные об обороте

stock_prices's People

Contributors

nerevar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

stock_prices's Issues

UnicodeEncodeError: 'charmap' codec can't encode character '\u2264'

Hello!
Then I try:
make cron DAY=2019-05-10
get this error:
Traceback (most recent call last):
File "main.py", line 81, in
args.fn(args)
File "C:\DS\stock_prices\lib\downloader.py", line 27, in downloader
get_moex_data(args.engine, args.market, day_str, save_raw_xml=args.save_raw_xml)
File "C:\DS\stock_prices\lib\moex_downloader.py", line 152, in get_moex_data
get_moex_data(engine, market, date_str, start + pagination['page_size'], save_raw_xml)
File "C:\DS\stock_prices\lib\moex_downloader.py", line 140, in get_moex_data
save_to_csv(valid_quotes, engine, market, date_str, quote_attrs if start == 0 else None)
File "C:\DS\stock_prices\lib\moex_downloader.py", line 60, in save_to_csv
writer.writerow(row.values())
File "C:\Program Files\Python38\lib\encodings\cp1251.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2264' in position 69: character maps to
make: *** [Makefile:35: download_moex] Error 1

How it to fix?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.