Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#issue-12. Добавлен метод для получения состава индекса #27

Merged
merged 1 commit into from
Apr 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions apimoex/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"get_board_securities",
"get_market_history",
"get_board_history",
"get_index_tickers",
]


Expand All @@ -35,6 +36,7 @@ def _make_query(
interval: Optional[int] = None,
start: Optional[str] = None,
end: Optional[str] = None,
date: Optional[str] = None,
table: Optional[str] = None,
columns: Optional[Tuple[str, ...]] = None,
) -> Dict[str, Union[str, int]]:
Expand All @@ -50,6 +52,8 @@ def _make_query(
Начальная дата котировок.
:param end:
Конечная дата котировок.
:param date:
Точная дата (используется при получении тикеров в индексе).
:param table:
Таблица, которую нужно загрузить (для запросов, предполагающих наличие нескольких таблиц).
:param columns:
Expand All @@ -67,6 +71,8 @@ def _make_query(
query["from"] = start
if end:
query["till"] = end
if date:
query["date"] = date
if table:
query["iss.only"] = f"{table},history.cursor"
if columns:
Expand Down Expand Up @@ -533,3 +539,46 @@ def get_board_history(
table = "history"
query = _make_query(start=start, end=end, table=table, columns=columns)
return _get_long_data(session, url, table, query)


def get_index_tickers(
session: requests.Session,
index: str,
date: Optional[str] = None,
columns: Optional[Tuple[str, ...]] = (
"ticker",
"from",
"till",
"tradingsession",
),
market: str = "index",
engine: str = "stock",
):
"""Получить информацию по составу указанного индекса за указанную дату.

Описание запроса - https://iss.moex.com/iss/reference/148

:param session:
Сессия интернет соединения.
:param index:
Название индекса. Например, IMOEX. Список: https://iss.moex.com/iss/statistics/engines/stock/markets/index/analytics
:param date:
Дата вида ГГГГ-ММ-ДД. Если указано, то будут показаны только активные инструменты, по которым тогда рассчитывалось значение индекса. Если в указанный день не было торгов, то вернёт пустой список! При отсутствии данные будут загружены с начала истории.
:param columns:
Кортеж столбцов, которые нужно загрузить - по умолчанию режим торгов, дата торгов, цена закрытия и объем в
штуках и стоимости. Если пустой или None, то загружаются все столбцы.
:param market:
Рынок - по умолчанию индексы.
:param engine:
Движок - по умолчанию акции.

:return:
Список словарей, которые напрямую конвертируется в pandas.DataFrame.
"""
url = (
f"https://iss.moex.com/iss/statistics/engines/{engine}/markets/{market}/"
f"analytics/{index}/tickers.json"
)
table = "tickers"
query = _make_query(date=date, table=table, columns=columns)
return _get_short_data(session, url, table, query)
7 changes: 7 additions & 0 deletions tests/test_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,3 +287,10 @@ def test_get_board_history_to_end(session):
assert df.at["2018-08-10", "VALUE"] == pytest.approx(8_626_464.5)
assert df.at["2018-09-06", "CLOSE"] == pytest.approx(660)
assert df.at["2018-08-28", "VOLUME"] == 47428

def test_get_index_tickers(session):
data = requests.get_index_tickers(session, index='IMOEX', date='2023-03-03')
assert len(data) == 40
assert data[15]['ticker'] == 'MAGN'
assert data[25]['till'] == '2023-03-03'
assert data[35]['tradingsession'] == 3