По мотивам поста https://smart-lab.ru/blog/616708.php
Вот и мой велосипед на питоне для получения котировок с Мосбиржи
from urllib import request, error from json import loads import pprint class GetRawDataException(Exception): pass class GetPricesException(Exception): pass def get_prices(start_date: str, end_date: str, ticker: str) -> dict: """ Возвращает словарь: {дата:цена закрытия} """ req = 'https://iss.moex.com/iss/history/engines/stock/markets/shares/boards/TQBR/securities/{}.json?from={}&till={}'.format(ticker, start_date, end_date) contents = get_raw_data(req) try: data = loads(contents) prices = {x[1] : x[11] for x in data['history']['data']} return(prices) except Exception as err: raise GetPricesException(err) def get_raw_data(req: str) -> str: """ Возвращает результат запроса к серверу Мосбиржи """ try: contents = request.urlopen(req).read() return(contents) except URLError as err: raise GetRawDataException(err) try: prices = get_prices('2019-05-23', '2019-05-30', 'GAZP') pprint.pprint(prices) except GetRawDataException as err: print('Error getting raw data: ', str(err)) except GetPricesException as err: print('Error parsing json: ', str(err))
Вывод данных происходит с помощью функции get_prices(). Механизм простой: формируется url для GET-запроса. Мосбиржа в ответ присылает json, из которого забираются нужные данные и выводятся на экран.
Есть и другие способы получения данных: yfinance, pandas-datareader и универсальный BeautifulSoup, ещё более универсальный Selenium. Но это уже совсем другая история...
Скажите, а зачем???
Тики ИСС не даст, а бары можно (и нужно) выкачивать с сервера своего брокера.
Чем шире твой диапазон возможностей, чем больше всего разного приходилось пилить, тем больше зевоты вызывают такие штуки. А раньше подобные вещи приводили в восторг)), в смысле когда сам что-то такое смастеришь и оно ещё и работает)).
А так полезный код, бери и запускай, кому-то пригодится, наверно.
github.com/pecec/moex_iss
а вот то же самое, Михаил реализовал, с более подробными комментариями (мне правда, не нравится такой вариант потому что его устанавливать в питон свой нужно, примера использования я что-то не нашел сразу), вероятно, он больше времени потратил на доведение до ума деталей каких-то:
github.com/WLM1ke/apimoex
пара замечаний, не могу пройти мимо)
1. Зачем urllib, если есть requests?
2. from json import loads — это плохой стиль. когда где-нибудь вызывается loads, то приходится искать откуда он пришел. json.loads(...) — легче воспринимать, нет вопросов что это за функция. в данном маленьком примере в принципе пофиг, но в более массивных кусках кода так лучше не делать.
day0markets,
1. Я знаю, что есть
2. А мне так больше нравится. Вызовы короче получаются, особенно в более массивных кусках кода. По мне так хороший стиль.