Проблема
В пакете уже есть функция get_index_tickers(), но этот метод обращается к:
/iss/statistics/engines/{engine}/markets/{market}/analytics/{index}/tickers.json
и возвращает только историю членства бумаги в индексе (ticker, from, till, tradingsession). Вес бумаги в индексе получить через него нельзя.
Для сравнения индексных фондов с MCFTR понадобился фактический состав индекса на конкретную дату: список бумаг вместе с их весами. Сейчас такой запрос приходится выполнять напрямую к ISS, минуя методы пакета.
Как состав был получен через ISS MOEX
MCFTR — индекс полной доходности, использующий ту же базу расчёта, что ценовой индекс IMOEX:
Прямой запрос analytics/MCFTR.json на проверенную дату возвращает пустую таблицу. Поэтому состав MCFTR был получен через его базовый индекс IMOEX:
GET https://iss.moex.com/iss/statistics/engines/stock/markets/index/analytics/IMOEX.json
?iss.meta=off
&date=2026-08-21
&limit=100
В таблице analytics ISS возвращает поля:
indexid
tradedate
ticker
shortnames
secids
weight
tradingsession
trade_session_date
Например, на 21.08.2026 запрос вернул 46 бумаг; weight уже выражен в процентах:
LKOH 15.57
SBER 12.86
GAZP 8.50
YDEX 6.73
Ответ также содержит analytics.cursor, поэтому реализация не должна предполагать, что любой индекс всегда помещается в первые 100 строк.
Запрос членства, который сейчас использует get_index_tickers(), на ту же дату возвращает те же тикеры, но не веса:
GET https://iss.moex.com/iss/statistics/engines/stock/markets/index/analytics/IMOEX/tickers.json
?date=2026-08-21
Предлагаемое изменение
Добавить отдельный публичный метод, например:
get_index_composition(
session,
index="IMOEX",
date="2026-08-21",
columns=(
"indexid",
"tradedate",
"ticker",
"shortnames",
"secids",
"weight",
"tradingsession",
"trade_session_date",
),
)
Метод должен использовать таблицу analytics, возвращать список словарей, пригодный для прямого преобразования в pandas.DataFrame, и получать все страницы ответа.
Существующий get_index_tickers() следует сохранить: он отвечает на другой вопрос — входила ли бумага в индекс в определённый период.
Для индексов полной доходности необходимо явно определить поведение. Как минимум MCFTR и MCF2TR должны разрешаться в базовый состав IMOEX, поскольку прямой ISS-запрос по этим кодам возвращает пустую таблицу.
Definition of Done (DoD)
Проблема
В пакете уже есть функция get_index_tickers(), но этот метод обращается к:
и возвращает только историю членства бумаги в индексе (ticker, from, till, tradingsession). Вес бумаги в индексе получить через него нельзя.
Для сравнения индексных фондов с MCFTR понадобился фактический состав индекса на конкретную дату: список бумаг вместе с их весами. Сейчас такой запрос приходится выполнять напрямую к ISS, минуя методы пакета.
Как состав был получен через ISS MOEX
MCFTR — индекс полной доходности, использующий ту же базу расчёта, что ценовой индекс IMOEX:
Прямой запрос analytics/MCFTR.json на проверенную дату возвращает пустую таблицу. Поэтому состав MCFTR был получен через его базовый индекс IMOEX:
В таблице analytics ISS возвращает поля:
Например, на 21.08.2026 запрос вернул 46 бумаг; weight уже выражен в процентах:
Ответ также содержит analytics.cursor, поэтому реализация не должна предполагать, что любой индекс всегда помещается в первые 100 строк.
Запрос членства, который сейчас использует get_index_tickers(), на ту же дату возвращает те же тикеры, но не веса:
Предлагаемое изменение
Добавить отдельный публичный метод, например:
Метод должен использовать таблицу analytics, возвращать список словарей, пригодный для прямого преобразования в pandas.DataFrame, и получать все страницы ответа.
Существующий get_index_tickers() следует сохранить: он отвечает на другой вопрос — входила ли бумага в индекс в определённый период.
Для индексов полной доходности необходимо явно определить поведение. Как минимум MCFTR и MCF2TR должны разрешаться в базовый состав IMOEX, поскольку прямой ISS-запрос по этим кодам возвращает пустую таблицу.
Definition of Done (DoD)