Архив и таймлапс Индекса МосБиржи
Версия экспортера: 1. Формат: portfolio-lab-index-history, версия 1. Данные: архив PortfolioLab MOEX Monthly 1.0.0 от 18 октября 2026 года.
Назначение и фактическое покрытие
Раздел показывает наблюдаемый состав индекса в прошлом, а не переносит современный список акций на прежние даты. Каждая точка — первое календарное число месяца. Доступны 309 срезов с 01.02.2001 по 01.10.2026: 10 946 наблюдений участников, 137 идентификаторов выпусков и 154 исторических кода. Состав до февраля 2001 года в сохранённом архиве отсутствует. Общая месячная база начинается в апреле 1997 года; её первые 46 месяцев не являются доказанной историей состава индекса и в таймлапс не добавляются.
Основание — оригинальные ответы официального MOEX ISS: https://iss.moex.com/iss/statistics/engines/stock/markets/index/analytics/IMOEX.json. Каждый использованный ответ сохраняет URL, дату загрузки и SHA-256. История выгружается из готового выпуска, без сетевых запросов и пересмотра источника. Веб-сайт загружает небольшой статический JSON по запросу пользователя; исходная SQLite в публикацию не входит.
Даты, веса и идентичность
date— дата месячного среза.membership_date— последняя доступная официальная сессия состава не позднее этой даты.weight_date— последняя доступная официальная сессия строго раньше даты среза. Вес соединяется с составом поissue_id, а не по похожему названию. Это вес предыдущего закрытия, а не утверждение о весе на конец текущего дня.weight_pctвыражен в процентах. Его сумма не нормализуется: исходные округления сохранены. Веса двух участников неизвестны на предыдущем закрытии:RU0009046700в срезе 01.10.2003 иURKA(RU0007661302) в срезе 01.11.2011. Они остаютсяnullв JSON и пустыми ячейками CSV; доля не распределяется между другими акциями и не принимается равной нулю. Круговая диаграмма или показатель концентрации с полными весами не должны строиться для этих двух срезов.symbol— исторический код, сохранённый базой после применения официального технического журнала смен кодов.source_symbol— буквально код, который вернул архивный ответ ISS при загрузке. Они различаются в 582 наблюдениях; оба сохранены.issue_id— ключ выпуска (ISIN, а при его отсутствии отдельныйSECID:ключ). Четыре ранних выпуска (BKBK,INUR,NKEL,UMAS) имеют только подтверждённый архивный код, без ISIN и полного названия: это самостоятельныеSECID:ключи, а не догадки о современном правопреемнике. Обыкновенные и привилегированные акции, разные выпуски и юридические лица не объединяются по сходству имён. Преемственность при корпоративной реорганизации без достаточного подтверждения не создаётся.- Название, ISIN и тип бумаги получены из справочника, наблюдавшегося 18.10.2026. Это подписи и идентификационные сведения справочника, а не доказанные названия компаний на каждую историческую дату. Полный исторический журнал изменений ISIN без смены кода и первоначальная дата публикации справочника не подтверждены.
Метаданные источника прямо устанавливают статус RETROSPECTIVE_ASOF: исторические наблюдения восстановлены ретроспективно; доступность каждого числа в первоначальный момент публикации и отсутствие позднейших исправлений не сертифицированы. Архив подходит для исследования исторического состава с этой оговоркой; он не является сертифицированной базой без ошибок заглядывания вперёд.
Входы, выходы и уровни индексов
entered и exited — разность наборов issue_id между соседними месячными срезами. Всего 292 наблюдаемых события. Они означают изменение между двумя срезами, а не установленную точную дату ребалансировки или юридического делистинга. Первый срез — начальное наблюдение; его акции не считаются вновь включёнными. Техническая смена кода при сохранении выпуска не создаёт ложного входа или выхода.
index_level — официальный ценовой IMOEX; total_return_level — отдельный официальный MCFTR полной доходности из замороженного финансового выпуска 0.5.0. Берётся только точная отметка на market_cutoff_date исходной месячной базы, строго до первого числа месяца. У каждого уровня сохранена собственная дата. IMOEX доступен во всех 309 срезах, MCFTR — в 262; до начала его истории значение остаётся null. Значения не интерполируются, не экстраполируются и не заменяются друг другом. Разные базы индексов не следует сравнивать как доходность по абсолютной высоте: для сравнения графиков нужна общая начальная дата и нормирование к ней.
Архив состава расширяет информационный раздел сайта. Он не изменяет финансовый календарь, цены, ставки, синтетические ряды или расчётный движок портфелей.
Файлы и контракт
| Файл | Содержание |
|---|---|
public/index-history/timelapse.json | Все 309 срезов, участники, даты, уровни, месячные изменения и источники |
public/index-history/composition.csv | Полная таблица состава, включая ключи и ссылки на источники идентичности и весов |
public/index-history/changes.csv | Месячные входы/выходы с предыдущей датой сравнения |
public/index-history/provenance.json | Покрытие, хеши исходного архива, базы, финансовых рядов, URL источников |
public/index-history/methodology.html | Автономная читаемая методика с пояснениями ограничений |
public/index-history/validation.json | Результаты проверок и конкретные пропуски весов |
JSON содержит format, version, data_version, provenance, coverage, sources и snapshots. В каждом срезе сохранены date, membership_date, weight_date, два *_source_id, members, entered, exited, member_count, known_weights, weight_sum_pct и значения/даты двух индексов. Участник содержит symbol, source_symbol, issue_id, name, isin, weight_pct, instrument_type, identity_basis. Показатели known_weights и weight_sum_pct относятся только к известным весам. data_version — SHA-256 канонического JSON до добавления самого поля хеша.
Воспроизведение и контроль
Исходный файл: PortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip. SHA-256: cb4503d0854c9357c8123d8380ba36d6e960ab5551cc67eb6c16f79127d41f05. Архив является внешним версионируемым исследовательским входом, а не частью деплоя. Python 3, стандартная библиотека, сеть не требуется:
python3 scripts/export_index_history.py --archive /absolute/path/PortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip
python3 tests/index-history.py --archive /absolute/path/PortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip
Экспортер извлекает SQLite только в игнорируемый work/index-history-input. Перед использованием проверяются закреплённый SHA-256 архива, размер и CRC SQLite, quick_check, внешние ключи, SHA-256 распакованных оригинальных ответов ISS, полнота страниц и точное совпадение кодов/весов с исходными ответами. 492 файла состава (17 385 строк) и 27 справочных файлов проверены по хешам. Все 10 946 месячных участников сверяются с официальным архивным составом и существующим представлением monthly_index_members.
Независимый тест повторно выбирает даты из полного дневного архива и сверяет каждый опубликованный состав, ключ, вес и уровень с входной SQLite и финансовыми рядами. Он проверяет месячные события, пропуски, ненормализованные веса, сохранение исторических кодов, полную согласованность CSV/JSON и побайтово одинаковое повторное построение всех шести файлов в отдельном каталоге.
Для нового выпуска необходимы новый сохранённый вход, отдельная проверка изменений и обновление закреплённого хеша. Изменение даты в интерфейсе не продлевает источник. Контроль должен сохранять неизвестные значения и запрещать незаметную подмену исторического состава сегодняшними участниками.