Skip to content

Добавить метод получения состава и весов индексов MOEX #3

Description

@chilango74

Проблема

В пакете уже есть функция 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)

  • Добавлен и экспортирован публичный метод получения взвешенного состава индекса на заданную дату.
  • Метод возвращает как минимум тикер, дату и вес бумаги и поддерживает параметр columns.
  • Реализовано получение всех строк по analytics.cursor, без фиксированного ограничения в 100 бумаг.
  • Вызовы для MCFTR и MCF2TR возвращают состав их базового индекса IMOEX, а это поведение описано в документации.
  • Поведение существующего get_index_tickers() не изменено.
  • Добавлены тесты на URL/параметры запроса, поля ответа, пагинацию и разрешение MCFTR/MCF2TR.
  • В README или документации добавлен пример получения состава IMOEX/MCFTR с весами.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions