Ромирес
Ромирес личный блог
10 января 2019, 12:18

Google Colab: Российский рынок - по многочисленным просьбам

В одном из предыдущих постов писал про Google Colab — бесплатный доступ к интерактивной среде Jupyter Notebook на языке Python с кучей библиотек для анализа данных (и самой популярной — Pandasобучалки-введение).
   Низкий порог входа в мир серьёзного анализа данных -тем и привлекателен этот зоопарк. Несколько строк кода и уже можно анализировать-смотреть данные (акции, облигации, фьючи, макро).

   Если вы пробовали писать скрипты в Excel, кастомные индикаторы в Мультичартсах или Метастоках, то освоить язык Python в интерактивной среде Jupyter Notebook (Google Colab — даёт бесплатный доступ) — посильное занятие.
   Для американского рынка есть библиотека (-ки), которые позволяют подкачать биржевые и экономические данные — я писал об этом. Кстати к  Google Colab можно подключить IQFeed (если интересно — тут).

   Для российского рынка — всё сложнее (или наоборот проще — как посмотреть). Рынок меньше, провайдеров мало. Но по многочисленным просьбам… Повозившись с сайтом МБ (iss.micex.ru), удалось написать небольшой кусок кода, который скачивает данные, парсит и помещает их в таблицу Pandas -с ней можно работать (рисовать графики, анализировать и тп).

Этот кусок кода я и выкладываю с комментариями:

import json, urllib,sys, pandas as pd #импортируем модули парсинга json, скачивание с инета, пандас
from datetime import datetime as dt # импортируем модуль работы с датами
Ndays=2000
#('stock','shares',57,'LKOH')   # ('stock','bonds',58,'SU26220RMFS2')
#('futures','forts',45, 'SiH9')
#('currency','selt',13,'EUR_RUB__TOM')  ('currency','selt',13,'USD000UTSTOM')
# ('stock','shares',57,'GMKN')
engine,market,boardgroup,ticker=('stock','shares',57,'GMKN')
url='https://iss.moex.com/cs/'
url=url+'engines/%s/markets/%s/boardgroups/%s/securities/%s.hs?s1.type=candles&interval=24&candles=%s' % (engine,market,boardgroup,ticker,Ndays)
try: s = urllib.request.urlopen(url).read()
except urllib.error.HTTPError as e: print('Ошибка скачивания:',e); sys.exit()
    
dictslists=json.loads(s) #парсим текстовый документ из формата json в формат "dict&lists"
listOHLC=dictslists['candles'][0]['data'] # выбираем только OHLC
listV=dictslists['volumes'][0]['data']# выбираем только V
dfOHLC=pd.DataFrame(listOHLC,columns=['Date','Open','High','Low','Close']) # парсим OHLC в таблицу(dataframe) пандаса
dfV=pd.DataFrame(listV,columns=['Date','Volume']) # парсим V в таблицу(dataframe) пандаса
if len(dfOHLC)==0: print('Нет данных'); sys.exit()
dfOHLC.index=pd.to_datetime(dfOHLC['Date'],unit='ms') # кол-ку в ф-те UNIX(ms) конв-ем во внутр формат даты И ставим индексом
dfV.index=pd.to_datetime(dfV['Date'],unit='ms') # кол-ку в ф-те UNIX(ms) конв-ем во внутр формат даты И ставим индексом
dfOHLC=dfOHLC.drop('Date',axis=1)
dfV=dfV.drop('Date',axis=1)
dfOHLCV=pd.concat([dfOHLC,dfV],axis=1) # сваливаем OHLC и V в единую таблицу(dataframe) пандаса
#dfOHLCV=dfOHLCV[dt(2010,1,1):dt(2018,1,1)] #раскомментировать, если нужно работать с диапазоном
display(dfOHLCV[:3]) #посмотреть первые 3 значения
display(dfOHLCV[-3:]) #посмотреть последние 3 значения
dfOHLCV['Close'].plot(figsize =(14,6),title=ticker) # figsize=(,) это размеры по ширине и высоте
dfOHLCV['Volume'].plot(secondary_y=True,kind='area'); # secondary_y=True рисовать на правой шкале

Обратите внимание — знать только тикер инструмента недостаточно. Нужно знать «engine»,«market»,«boardgroup»,«ticker». Для одной секции — первые 3 параметра одинаковые, поэтому те кто торгует ликвидными акциями могут в скрипте менять только название тикера и оставить всё «as is». Для других секций (валюта, фортс, офз) — приведены примеры.

На выходе работы скрипта (I. открыть Google Colab (достаточно экаунта gmail) II. создать File -> New Python 3 III. вставить код и выполнить нажав на треугольник), должно получится:

   Google Colab: Российский рынок - по многочисленным просьбам
Важно: API который предоставляет МБ для рисования своих графиков (скрипт использует именно его) может быть изменён без уведомления самой биржей.

Успехов (в комментариях — без оффтопа).
4 Комментария
  • OnlyHuman
    10 января 2019, 12:48
    Спасибо за интересный материал! От меня + (пока только такой :) )
  • K.
    10 января 2019, 16:07
    я даже залогинился чтобы плюсануть :)
  • sam
    10 января 2019, 17:09
    запустил, описка: dictslists=json.loads(str(s, «utf-8»))

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн