Asyncio MOEX ISS API


Keywords
asyncio, iss, moex
License
Unlicense
Install
pip install aiomoex==2.1.2

Documentation

Asyncio MOEX ISS API

РСализация Π½Π° основС asyncio части запросов ΠΊ MOEX Informational & Statistical Server.

ДокумСнтация

https://wlm1ke.github.io/aiomoex/

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-запросов ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΡ€Π³ΡƒΠ΅ΠΌΡ‹Ρ… акциях ΠΈ ΠΈΡ… историчСских ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ…, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² pandas.DataFrame.

Π Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ базируСтся Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΌ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ запросы ΠΊ MOEX ISS, поэтому ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ доступных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-запросов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½. ΠŸΡ€ΠΈ нСобходимости добавлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Issues Π½Π° GitHub с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ссылки Π½Π° описаниС запроса:

ΠŸΠΎΡ‡Π΅ΠΌΡƒ asyncio?

На ΠΌΠ½ΠΎΠ³ΠΈΠ΅ запросы MOEX ISS Π²Ρ‹Π΄Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ порциями ΠΏΠΎ 100 элСмСнтов, ΠΈ для получСния всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ обращСния ΠΊ сСрвСру для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ с Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. НапримСр, для скачивания ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ всСх Π°ΠΊΡ†ΠΈΠΉ Π²ΠΎ всСх Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколько дСсятков тысяч ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ сСрвСру.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ малСнького тСстирования Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ историчСских ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ TQBR для 35 ΠΈ 277 (всСх Ρ‚ΠΎΡ€Π³ΡƒΠ΅ΠΌΡ‹Ρ…) Π°ΠΊΡ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синхронных запросов:

Π’ΠΈΠ΄ запросов 35 Π°ΠΊΡ†ΠΈΠΉ 277 Π°ΠΊΡ†ΠΈΠΉ
asyncio 12.6 сСк 40.6 сСк
Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹Π΅ 210.4 сСк 1436.9 сСк
УскорСниС 16.7 Ρ€Π°Π· 35.4 Ρ€Π°Π·Π°

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Установка

$ pip install aiomoex

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… запросов

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ SNGSP Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ TQBR:

import asyncio

import aiohttp

import aiomoex
import pandas as pd


async def main():
    async with aiohttp.ClientSession() as session:
        data = await aiomoex.get_board_history(session, 'SNGSP')
        df = pd.DataFrame(data)
        df.set_index('TRADEDATE', inplace=True)
        print(df.head(), '\n')
        print(df.tail(), '\n')
        df.info()


asyncio.run(main())
           BOARDID  CLOSE    VOLUME         VALUE
TRADEDATE
2014-06-09    TQBR  27.48  12674200  3.484352e+08
2014-06-10    TQBR  27.55  14035900  3.856417e+08
2014-06-11    TQBR  28.15  27208800  7.602146e+08
2014-06-16    TQBR  28.27  68059900  1.913160e+09
2014-06-17    TQBR  28.20  22101600  6.292844e+08

           BOARDID   CLOSE    VOLUME         VALUE
TRADEDATE
2020-09-01    TQBR  37.245  15671200  5.824013e+08
2020-09-02    TQBR  37.535  34659700  1.296441e+09
2020-09-03    TQBR  36.955  28177000  1.049745e+09
2020-09-04    TQBR  36.915  21908000  8.076767e+08
2020-09-07    TQBR  37.200  13334400  4.955280e+08

<class 'pandas.core.frame.DataFrame'>
Index: 1573 entries, 2014-06-09 to 2020-09-07
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype
---  ------   --------------  -----
 0   BOARDID  1573 non-null   object
 1   CLOSE    1573 non-null   float64
 2   VOLUME   1573 non-null   int64
 3   VALUE    1573 non-null   float64
dtypes: float64(2), int64(1), object(1)
memory usage: 61.4+ KB

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ запроса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

ΠŸΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Π°ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎΡ€Π³ΡƒΡŽΡ‰ΠΈΡ…ΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ TQBR (описаниС запроса):

import asyncio

import aiohttp

import aiomoex
import pandas as pd


async def main():
    request_url = "https://iss.moex.com/iss/engines/stock/" "markets/shares/boards/TQBR/securities.json"
    arguments = {"securities.columns": ("SECID," "REGNUMBER," "LOTSIZE," "SHORTNAME")}

    async with aiohttp.ClientSession() as session:
        iss = aiomoex.ISSClient(session, request_url, arguments)
        data = await iss.get()
        df = pd.DataFrame(data["securities"])
        df.set_index("SECID", inplace=True)
        print(df.head(), "\n")
        print(df.tail(), "\n")
        df.info()


asyncio.run(main())
          REGNUMBER  LOTSIZE   SHORTNAME
SECID
ABRD   1-02-12500-A       10  ΠΠ±Ρ€Π°ΡƒΠ”ΡŽΡ€ΡΠΎ
AFKS   1-05-01669-A      100  БистСма Π°ΠΎ
AFLT   1-01-00010-A       10    Аэрофлот
AGRO           None        1    AGRO-Π³Π΄Ρ€
AKRN   1-03-00207-A        1       Акрон

          REGNUMBER  LOTSIZE   SHORTNAME
SECID
YNDX           None        1  Yandex clA
YRSB   1-01-50099-A       10     ВНБэнЯр
YRSBP  2-01-50099-A       10   ВНБэнЯр-ΠΏ
ZILL   1-02-00036-A        1      Π—Π˜Π› Π°ΠΎ
ZVEZ   1-01-00169-D     1000   ЗВЕЗДА Π°ΠΎ

<class 'pandas.core.frame.DataFrame'>
Index: 260 entries, ABRD to ZVEZ
Data columns (total 3 columns):
 #   Column     Non-Null Count  Dtype
---  ------     --------------  -----
 0   REGNUMBER  248 non-null    object
 1   LOTSIZE    260 non-null    int64
 2   SHORTNAME  260 non-null    object
dtypes: int64(1), object(2)
memory usage: 8.1+ KB