Market breadth: ширина рынка и таймлапс Индекса МосБиржи

Редакция представления индикатора: 3 от 21.10.2026 (индикатор 1.3.1). Источник расчёта: принятая исследовательская версия 1.3.0 от 18.10.2026. Срез рынка: 16.10.2026. Индикатор показывает ширину рынка независимо от выбора активов и правила распределения капитала. Индикатор 1.3.1 учитывает исправления финансовой базы 0.5.1 только для участников с изменённым рядом; принятая стратегия 1.3.0 на новой базе не пересчитывается.

С 19.10.2026 фиксированный сдвиг 20 п.п. не является действующим правилом интерфейса. На таймлапсе показывается сам индикатор. Параметр порога, выбор основного и защитного активов, целевые веса и новый бэктест вынесены на отдельную страницу «Динамическая аллокация по ширине рынка»; её правила закреплены в docs/BREADTH_ALLOCATION_RU.md. Начальные настройки новой страницы: MCFTR / синтетическая MM_CBR, порог 0 п.п. Ранее принятый результат с 20 п.п. сохранён без изменения как архивный исследовательский сценарий. Предыдущая редакция этого описания: docs/archive/MARKET_BREADTH_UI_0_9_RU.md.

Индикатор 1.3.1 после финансового выпуска 0.5.1

Принятое исследование 1.3.0 не пересчитывается целиком и не переименовывается. Выпуск 0.5.1 изменил ряды полной доходности девяти бумаг: GAZP, GMKN, MAGN, MSNG, MSTT, NLMK, PHOR, RTKM, RTKMP. Для них scripts/correct_market_breadth.py пересчитывает отношение TRI к SMA200 тем же правилом: 200 последовательных поддерживаемых уровней, те же сигнальные даты. Пересчитываются только месяцы, где у бумаги был известный статус. Перед изменением строки инструмент проверяет, что TRI исследования равен финансовому TRI с постоянным множителем и что исходное отношение совпадает до 1e-9. Неизвестные статусы, идентичности, даты и все остальные участники остаются побайтно прежними.

Пересчитано 608 строк, статус изменился у 13, число участников выше SMA200 — в 12 месяцах. Перечень с прежними и новыми значениями — /market-breadth/corrections-1.3.1.json. Выгрузки 1.3.0 сохранены в /market-breadth/archive-1.3.0/. Блок strategy и strategy-daily.csv остаются принятым результатом 1.3.0: это архивный сценарий 20 п.п., посчитанный на сигналах до исправления, и он не пересчитывается.

Что измеряет индикатор

Для каждого исторического состава считаются акции с индексом полной доходности TRI выше, на уровне и ниже его SMA200. Обыкновенная и привилегированная акция — отдельные голоса. Вес в индексе, капитализация и число эмитентов не используются для взвешивания ширины рынка.

Сглаживание использует 200 подряд подтверждённых уровней TRI; TRI учитывает дробления и реинвестирование валовых дивидендов. Неподдерживаемый интервал прерывает историю. Среднее по ценам без дивидендов не заменяет среднее по полной доходности.

N = above + equal + below + unknown
breadth = (above + equal) / N
non_positive_or_unknown_share = (below + unknown) / N = 1 - breadth

Ширина рынка сама по себе не задаёт денежную позицию. Дополнение до 100% включает бумаги ниже SMA200 и бумаги без подтверждённого сигнала; эти категории показываются раздельно. Если индикатор целиком отсутствует, его значение остаётся null, а не превращается в ноль или сигнал полного выхода.

В unknown попадают отсутствие поддержанной полной доходности, менее 200 непрерывных уровней или отсутствие фактической котировки на дату сигнала. Эти бумаги остаются в общем знаменателе. Их нельзя удалять из знаменателя или записывать как находящиеся ниже SMA. Принятое правило обработки неизвестных — соглашение проекта; оно не доказывает отрицательный тренд этих бумаг.

В отдельном модуле аллокации используется переменный сдвиг tau: defensive_weight = max(0, 1 - breadth - tau), primary_weight = 1 - defensive_weight. В интерфейсе tau вводится в процентных пунктах от 0 до 100; значение по умолчанию — 0 п.п. Защитный актив может быть денежной моделью, золотом, валютной экспозицией или допустимым фондом, поэтому его вес нельзя всегда называть кэшем. Сам индикатор от tau и выбранных активов не меняется.

Даты и синхронизация с таймлапсом

Диагностика содержит 226 месячных наблюдений за январь 2008 — октябрь 2026 и 9 413 строк участников. Это месячный индикатор, а не непрерывный ежедневный мониторинг. Архив таймлапса содержит 309 кадров с февраля 2001 года: для 83 ранних кадров ширина рынка отсутствует. Значения до 2008 года не восстанавливаются и не переносятся из будущего.

Поле date/frame_date — первый календарный день месяца для точного соединения с кадром таймлапса. execution_date — плановая первая рыночная сессия этого месяца; signal_date — предыдущая рыночная сессия. В праздники дата сигнала может быть позже календарного начала месяца. Следовательно, значение является месячной диагностикой, известной к плановой сессии, а не гарантированно известной в 00:00 первого календарного дня. actual_execution_date отдельно отражает задержку исполнения.

Состав индикатора берётся на плановую рыночную дату; состав кадра таймлапса — по последнему архивному наблюдению на первый календарный день или ранее. Эти правила не подменяются друг другом. Сверка всех 226 месяцев подтвердила одинаковое число участников; 223 набора сопоставились по архивным кодам и/или точному ISIN. В июне, июле и августе 2011 года MTSS из исследовательской базы не принудительно отождествляется с временным выпуском MTSI-002D из архива. Для таких строк issue_id=null, расхождение явно хранится в index_alignment.

В 37 месяцах справочный ISIN исследовательской базы отличается от ISIN исторического выпуска, сопоставленного по точному архивному коду. Оба значения сохранены отдельно как breadth_input_isin и issue_id; это различие поколений справочников, а не доказанное изменение сигнала. Полная история юридической идентичности и исходные моменты публикации не сертифицированы. Название из архива — справочная подпись; исходный расчётный и исторический коды не заменяются.

Архивный принятый сценарий MCFTR и MM_CBR с 20 п.п.

Этот раздел описывает сохранённое исследование 1.3.0, а не текущую настройку отдельного модуля. Его формулы: raw_cash = 1 - breadth, target_cash = max(0, raw_cash - 0.20), target_MCFTR = 1 - target_cash. Вычитались 20 процентных пунктов, а не 20% денежной доли; целевой вес MCFTR был не ниже 20%. Смена текущего интерфейса не меняет архивные CSV, JSON, SQLite и их эталонные SHA-256.

Акционная часть целиком следует MCFTR — индексу полной доходности. Индивидуальные акции используются только для индикатора; ранжирования low volatility и отбора отдельных акций в инвестиционный портфель нет. Повторно начислять дивиденды поверх MCFTR нельзя.

Стратегия: 05.01.2015–16.10.2026, 142 месячных сигнала и 2 965 рыночных сессий; стартовый капитал 1 000 000 рублей. Расходы составляют 10 б.п. абсолютного оборота MCFTR, включая первоначальный вход. Денежная часть — синтетическая MM_CBR, капитализация ключевой ставки по календарным дням ACT/ACT, без реальных расходов фонда. Налоги, плечо и финальная ликвидация не моделируются. Индексы сравнения MCFTR и MM_CBR показаны без торговых расходов; это не тот же режим, что у пяти статических портфелей сайта.

Исполнение разрешено только по наблюдённому закрытию MCFTR. При отсутствии котировки приказ откладывается с сохранением исходного сигнала. Плановое исполнение 24.03.2022 перенесено на 25.03.2022 по сигналу 25.02.2022. Перенесённые уровни 07.01.2022 и 24.03.2022 используются только для оценки стоимости, а не для сделок.

Подтверждённые интервалы отсутствия распределений ограничены таблицей inputs/reviewed_zero_distributions.csv и её доказательствами. Неизвестные дивиденды не заменяются нулями на всей истории. Данные ретроспективны: первоначальная доступность публикаций и все последующие исправления не сертифицированы как strict point-in-time. Индекс и денежная модель — расчётные экспозиции; реальный фонд имеет комиссии и отклонения слежения.

Контрольный текущий срез

На сигнал 30.09.2026 для плановой и фактической даты 01.10.2026 в составе 44 выпуска: 12 выше SMA200, 0 равны, 31 ниже и 1 без подтверждённого сигнала. Ширина рынка — 27,27%; дополнение до 100% — 72,73%. При начальном tau = 0 в новом модуле это даёт 72,73% защитного и 27,27% основного актива. В архивном сценарии с 20 п.п. веса были 52,73% MM_CBR и 47,27% MCFTR. Это месячный срез, а не сигнал на 16 октября; веса являются целевыми, фактические веса меняются после исполнения и движения цен.

Данные, версии и файлы

Полный неизменённый источник — PortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip, SHA-256 e3ee5e471b1bd26ac3941e47bc80c0d3490d848fa2c760f34837d45574841624. Он содержит код, конфигурацию, 28 замороженных файлов входа, принятые CSV/JSON, аналитическую SQLite, XLSX и контрольные версии. Источник акций в этом исследовании — 0.4.3; текущая финансовая база сайта — отдельная версия 0.5.0. Сайт не выдаёт исследовательский вход за новую общую базу.

Публикуемые файлы:

ФайлСодержание
/market-breadth/report.jsonНеизменённый исследовательский паспорт: 226 наблюдений, 9 413 диагностик участников, сверка состава и метрики архивного сценария с 20 п.п.
/market-breadth/monthly.csvНеизменённый CSV месячных сигналов принятой версии
/market-breadth/constituents.csvНеизменённый CSV TRI/SMA200 и причин неизвестных сигналов
/market-breadth/strategy-daily.csvНеизменённое дневное сравнение архивного сценария с 20 п.п. и его контрольных вариантов
/market-breadth/provenance.jsonВерсии и SHA-256 зависимостей, ограничения покрытия
/market-breadth/methodology.htmlЭта методика для чтения и печати
/breadth-strategy/methodology.htmlОтдельная методика переменной аллокации, терминология и правила нового расчёта

Сайт загружает небольшие готовые выгрузки; полные базы и исходники сохраняются отдельно в реестре проекта. Изменение метода, источника или покрытия требует новой версии и сравнения с принятой. Нельзя менять эталонный хеш для сокрытия ошибки.

Воспроизведение

Сначала проверить внешний архив по указанному SHA-256 и материализовать его в рабочую папку, затем выполнить:

python3 scripts/export_market_breadth.py --archive /absolute/path/PortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip
python3 tests/market-breadth.py --archive /absolute/path/PortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip

Экспорт проверяет все 15 расчётных/контрольных файлов, 28 входов и 21 принятый результат по эталонным SHA-256. JSON формируется детерминированно без текущего времени; исходные финансовые CSV копируются побайтно. Тест сверяет каждую строку SQLite и CSV, все счётчики и формулы на 226 датах, независимым окном полных доходностей пересчитывает SMA200, проверяет причины неизвестных значений, составы архива и побайтную повторяемость экспорта.

Полное исходное воспроизведение выполнять в отдельной копии пакета с зависимостями из requirements.txt (numpy 2.3.5, pandas 2.2.3, matplotlib 3.10.8):

python3 reproduce.py --mode preflight
python3 reproduce.py --mode rebuild

Программа создаёт временную финансовую сборку, сравнивает 21 CSV/JSON по точным SHA-256, проверяет независимый денежный регистр, котировки фактического исполнения и SQLite. XLSX этим запуском не пересобирается. Принятые исходники и результаты остаются неизменными; журналы нового запуска хранятся отдельно.