Емельянов Иван
Емельянов Иван личный блог
24 апреля 2020, 20:29

Качаем исторические данные с 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. Да, я знаю что я наглый)
41 Комментарий
  • bocha
    24 апреля 2020, 20:33
    Рынок любит слезу.
    Деньги — наглых.
    Форум — никого.
  • Gordon Shumway
    24 апреля 2020, 21:01
    Подскажите, а по другим секциям кроме фондовой можно тоже?
    • iddqd3n
      24 апреля 2020, 21:49
      Gordon, по всем можно.
  • Михаил Titov
    24 апреля 2020, 21:04

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

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

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

      • Сергей Симонов
        25 апреля 2020, 17:12
        олег гуськов, программирование ради программирования — удел программистов, а не трейдеров))
  • Дмитрий Овчинников
    24 апреля 2020, 21:50
    Раздел «Алго» постепенно превращается в бесконечный кружок авиамоделизма :(
    • Андрей К
      24 апреля 2020, 21:56
      Дмитрий Овчинников, потом все подрастут и будет интересней =)
  • Samtakoy Samtokoich
    24 апреля 2020, 22:01
    Код обрезан вроде, или баг разметки.
  • Samtakoy Samtokoich
    24 апреля 2020, 22:07
    Получается сайт выдает всегда по 140 дней? А где Вы нашли описание запроса?
      • Samtakoy Samtokoich
        24 апреля 2020, 22:24
        Емельянов Иван, вот, руководство разработчика, нашел через ссылку Михаила:
        fs.moex.com/files/6523
          • Samtakoy Samtokoich
            24 апреля 2020, 22:36
            Емельянов Иван, я раньше выкачивал с финама, но пару недель назад они стали отлавливать и запрещать автоматическое скачивание.
  • Samtakoy Samtokoich
    24 апреля 2020, 22:09
    И это получается только дневки, а часовики не знаете где можно в автоматизированном режиме скачивать?
    • tranquility
      27 апреля 2020, 22:28
      Михаил, люди поиском пользоваться не умеют(( MOEX ISS набрал и нашел на раз-два, даже самому писать ничего не надо. Хотя, иногда полезно и самому разобраться, с питоном не очень много времени на это требуется.
  • Михаил Titov
    24 апреля 2020, 22:20

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

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

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

      • Михаил Titov
        24 апреля 2020, 22:36

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

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

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

                • Дедал
                  25 апреля 2020, 01:10
                  Иван Совяк, quik+dde вполне себе готовое. Не надо там кодить
          • Михаил Titov
            25 апреля 2020, 10:55

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

            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))
    • tranquility
      27 апреля 2020, 23:11
      Михаил Titov, посмотрите либо Михаила, или мой код smart-lab.ru/blog/535735.php#comment11111685
      только качайте данные частями (если вся история минуток нужна, например), долгие соединения сервер обрывает.
  • broker25
    24 апреля 2020, 23:40
    Зачем так сложно? 

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

    • Михаил Titov
      25 апреля 2020, 00:35
      broker25, а за 10 лет?
      • broker25
        25 апреля 2020, 01:03
        Михаил Titov, да я думаю, работает формула.
        Причем, вместо 'SBER' можно подставить ['SBER', «LKOH»....]
  • dnmsk ☮
    25 апреля 2020, 09:12
    Только вам и по большому секрету: эти данные бесполезны.
  • chizhan
    25 апреля 2020, 09:42
    Качество данных? Есть ли мусор в них или фейки.
    • tranquility
      27 апреля 2020, 23:14
      chizhan, качество должно быть приемлемым, я проверял на наличие ошибок, нашел, но очень мало — не критично. smart-lab.ru/blog/535735.php
  • sergeygaz
    25 апреля 2020, 15:40
    Эти только дневки же?

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

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

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

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