Блог им. JohnMitrich

Качаем исторические данные с MOEX!

Итак, передо мной, уверен, как и перед многими, встал вопрос поиска исторической информации с Мосбиржи. Немного зная python, я написал вот такой парсер:
import requests
import datetime
import pathlib

SECIDs = ["GAZP", "BANEP", "LKOH"]
DISK = "E"
for SECID in SECIDs:
    from_date = "2020-05-04"
    to_date = "2005-01-03"
    while str(to_date) != from_date:
        to_date = str(to_date)
        to_date = to_date.split('-')
        a = datetime.date(int(to_date[0]), int(to_date[1]), int(to_date[2]))
        b = datetime.timedelta(days=140)
        to_date = a + b
        pathlib.Path("{}:/{}/{}".format(DISK, "Database_MOEX", SECID)).mkdir(parents=True, exist_ok=True)
        filename = SECID + "_" + str(to_date) + ".csv"
        with requests.get("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities/{}.csv?date={}".format(SECID, to_date)) as response:
            with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f:
                for chunk in response.iter_content():
                    f.write(chunk)
Для начала пройдемся по его плюсам и минусам. Самый главный минус, что этот парсер качает только определенный период, который уникален для каждой акции, судя по всему для увеличения этого периода надо кинуть бирже на лапу:), и то что информация предоставляется за день, теперь перейдем к плюсам: можно выкачивать историю за определенный период для нескольких инструментов сразу (их количество ограничивается лишь количеством инструментов на мосбиржи), есть возможность назначать диск для сохранения информации, быстрота выгрузки данных.
Итак, перейдем к использованию:
1) Добавьте тикеры интересующих вас акций в список (SECIDs) как показано в примере
2) Выбирите диск (DISK) для сохранения выкаченной информации
3) Запишите даты («ГГГГ-ММ-ДД») в from_date (До какой даты качать) и to_date (С какой даты качать). Обе даты должны быть понедельниками, иначе код заработает не правильно
4) Запустить парсер
P.s. Буду рад вашим отзывам и поправкам:)
P.s.s. Еще больше буду рад если вы поделитесь способами выгрузки исторической информации и/или поделитесь ею со мной, можно в лс:)
P.s.s.s. Да, я знаю что я наглый)
★61
41 комментарий
Рынок любит слезу.
Деньги — наглых.
Форум — никого.
avatar
bocha, что верно то верно)
Подскажите, а по другим секциям кроме фондовой можно тоже?
avatar
Gordon, по всем можно.
avatar

Что если понедельник выходной?

А так + и звездочка 

avatar
заходи сюда - https://www.finam.ru/profile/moex-akcii/sberbank/export/  — и качай любые котиры до усрачки))
Сергей Симонов, или с mfd)
avatar
Сергей Симонов, человек делает программу, что бы не усираться как ты. Респект ему, а ты дальше усирайся.

avatar
олег гуськов, программирование ради программирования — удел программистов, а не трейдеров))
Раздел «Алго» постепенно превращается в бесконечный кружок авиамоделизма :(
Дмитрий Овчинников, потом все подрастут и будет интересней =)
avatar
Код обрезан вроде, или баг разметки.
avatar
Получается сайт выдает всегда по 140 дней? А где Вы нашли описание запроса?
avatar
Samtakoy Samtokoich, мосбиржа, я так понял выдоет порциями по 100 рабочих дней, то есть 140 обычных) Вот справочник запросов: iss.moex.com/iss/reference/
Емельянов Иван, вот, руководство разработчика, нашел через ссылку Михаила:
fs.moex.com/files/6523
avatar
Samtakoy Samtokoich, Спасибо) к сожалению не знаю где часовики взять, но вроде свечки можно, правда не знаю какой у них таймфрейм
Емельянов Иван, я раньше выкачивал с финама, но пару недель назад они стали отлавливать и запрещать автоматическое скачивание.
avatar
И это получается только дневки, а часовики не знаете где можно в автоматизированном режиме скачивать?
avatar
Михаил, люди поиском пользоваться не умеют(( MOEX ISS набрал и нашел на раз-два, даже самому писать ничего не надо. Хотя, иногда полезно и самому разобраться, с питоном не очень много времени на это требуется.
avatar

Вообщем, получается скачивать кучу файлов с одинаковыми датами.

В ручном режиме вроде работает

https://iss.moex.com/iss/history/engines/stock/markets/shares/boards/EQNE/securities/gazp?from=2010-01-01&till=2010-01-20

avatar
Михаил Titov, к сожалению да(

Емельянов Иван, в коде нужно в строчке с адресом to_date заменить на str(to_date)

Посмотрел, что он не строчку вставлял в адрес, а численное значение даты

avatar
Михаил Titov, Спасибо за замечания!)
Емельянов Иван, Иван, подскажите (если знаете) как в Excel можно подгружать данныe инструментов срочного рынка Мосбиржи. 
Можно с задержкой или End of Date.
avatar
Иван Совяк, lua+dde
avatar
broker25, а что-нибудь готовое уже есть? типа штатной надстройки Акции (Stock Quotes) в Excel365?
В ней акции подгружать можно, но срочные рынки, увы, никак.

avatar
Иван Совяк, quik+dde вполне себе готовое. Не надо там кодить
avatar

Емельянов Иван, вот получше 

import requests<br />import datetime<br />import pathlib<br />import apimoex<br />import pandas as pd<br /><br />TICK = "SNGSP5"<br /><br />with requests.Session() as session:<br />         data = apimoex.get_board_history(session, 'SNGSP',)<br />         df = pd.DataFrame(data)<br />         df.to_csv("D:/Database_MOEX/{}.txt".format(TICK))
avatar
Михаил Titov, посмотрите либо Михаила, или мой код smart-lab.ru/blog/535735.php#comment11111685
только качайте данные частями (если вся история минуток нужна, например), долгие соединения сервер обрывает.
avatar
Зачем так сложно? 

import pandas_datareader.data as web
f = web.DataReader('SBER', 'moex', start='2020-01-01', end='2020-01-31')

avatar
broker25, а за 10 лет?
avatar
Михаил Titov, да я думаю, работает формула.
Причем, вместо 'SBER' можно подставить ['SBER', «LKOH»....]
avatar
Только вам и по большому секрету: эти данные бесполезны.
avatar
Качество данных? Есть ли мусор в них или фейки.
avatar
chizhan, качество должно быть приемлемым, я проверял на наличие ошибок, нашел, но очень мало — не критично. smart-lab.ru/blog/535735.php
avatar
Эти только дневки же?

Где скачать минутки?
avatar
sergeygaz, по платной подписке как я понял 
avatar
sergeygaz, минутки я качал таким же образом, просто надо несколько запросов под ряд запрограммировать. А потом разбить промежуток на меньшие (не больше 2-3 лет) чтобы 1 сессия не длилась слишком долго — сервер тогда оборвет соединения. В общем, на здоровье: smart-lab.ru/blog/535735.php#comment11111685
То же самое только чуть технологичее вроде как делает либа от Михаила
avatar
filename = SECID + "_" + str(to_date) + ".csv"
with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f:

есть же f строки. мало того, что они читабельнее, так еще и чуточку быстрее

avatar

теги блога Емельянов Иван

....все тэги



UPDONW
Новый дизайн