Методика и контрольПолная методика

Методика базы данных Портфельной лаборатории

Редакция методики 0.5.0-rc.2 от 21.10.2026 по времени Тбилиси. Финансовый выпуск 0.5.1, рыночный срез 16.10.2026, расчётный движок 0.5.0-rc.2. Статус проекта — закрытый исследовательский пилот.

Методика определяет происхождение и устройство базы, допустимое использование рядов, расчёт портфелей, порядок контроля и выпуск следующих версий. Зафиксированные входные SQLite и автономные команды позволяют восстановить текущие 42 рабочие таблицы и повторить расчёты без обращения к размещённому сайту. Успешный контроль подтверждает сохранность и воспроизведение проверяемого среза; полнота неизвестных первичных выплат остаётся отдельной задачей.

Изменения этой редакции

Выпуск 0.5.1 от 21.10.2026 исправляет подтверждённые ошибки реестра выплат 0.5.0. Из реестра удалены 11 несостоявшихся или задублированных выплат: GAZP 2022, MAGN 2022, NLMK 2023, GMKN 2014, три PHOR, MSTT 2019, MSNG 2026, RTKM и RTKMP 2016. Исправлены 4 суммы, добавлены три выплаты MSTT 2014–2016 и дробление PHOR 1:10 от 26.03.2012. Каждое изменение задано в db/corrections-0.5.1.json с закреплёнными SHA-256 доказательствами и проверено независимой сверкой. Полное описание, влияние и ограничения — docs/RELEASE_0_5_1_RU.md.

Выпуск 0.5.0

Добавлены девять расчётных рядов, включая SPY и QQQ в рублях. Новая база является расширением финансового слоя 0.4.3; все его прежние предметные строки сохранены. Данные и определения моделей размещены в отдельном неизменяемом SQL пространстве, а прежний готовый срез сохранён.

Справочник содержит 290 записей; текущие 42 финансовые таблицы содержат 1 946 772 строк. В series 777 473 оценок, из них 41 265 относятся к девяти новым рядам. Четыре новые таблицы разделяют первичные входы, происхождение, определения и полную модельную историю. Движок и паспорт дополнены исследовательским допуском synthetic.

Источники сохранены полностью, включая 111 новых артефактов. База воспроизведена офлайн побайтово. Для SPY и QQQ выполнен независимый денежный реестр дивидендов, для валютной корзины — независимый портфельный расчёт. P10 по календарю месячных потоков остаётся закрытым.

Версии и идентичность среза

Версия финансового выпуска, редакция методики, версия расчётного кода и физический хеш файла имеют разный смысл. Их нельзя подменять одним номером.

ПараметрЗначение и смысл
Финансовый выпуск0.5.1 и data_release 0.5.1-corrections-2026-10-21
Срез рынка16.10.2026
Действующий движок0.5.0-rc.2 для JS и независимого Python расчёта
Политика потоковconfirmed-month-end-v1
Политика допускаresearch-pilot-v2
Общая data_versionf04fde3fb10a9fa455a92548be25ec0f3580898db7e6c76180a16913cf132b1f
Префикс физических таблицrf04fde3f_
SQL manifest_sha256e3b149a186765e2e9f6e8863be129ee1626f8e968728af27febcecd562f73551
Исходная portfolio.sqlite SHA-256d4a69da49bf4905735407087b78e337b3235fef6fe1a705302664ca60fcee96f
Исходная policy_rates.sqlite SHA-2568503520e609df312e89f8ff614fa14575ea8e71b745bf26be3812d983b0d7795
SQL мастер текущих 42 таблиц SHA-256fc60eab7a94e14b8954eac5ae93b3ba2ed70c2ce5e9bce1729ef8618f86acaf4

Поле metadata.engine_version нового финансового входа равно 0.5.0-rc.2. Неизменяемая базовая portfolio.sqlite выпуска 0.4.3 сохранена отдельно; её прежнее поле engine_version равно 0.4.3. Версии не переписываются в старом снимке ради согласования названий. model_version денежной подбазы остаётся 0.3.0, поскольку формула прежней MM_CBR не меняется.

Внутренняя data_version денежной подбазы ab91056ad0e576b94b90a3de72111b7565e0c0ab383b47cc09dbc76f8abc13b4 является её смысловым идентификатором. Параметр money_version пути API равен физическому SHA-256 всей policy_rates.sqlite, указанному выше. Эти два значения различаются намеренно.

Источники и слои хранения

Первичные ответы и документы сохраняются с исходной ссылкой, временем получения, единицей и контрольной суммой. Нормализация не уничтожает свидетельство. Источник, подтверждённый только структурированным извлечением фактов, не объявляется оригинальным документом.

Текущая portfolio.sqlite содержит 33 основные таблицы, включая четыре таблицы расчётных моделей. Базовая portfolio.sqlite 0.4.3 содержит 29 прежних таблиц. Отдельная policy_rates.sqlite содержит девять таблиц ставок, модели и LQDT. Полный сохранённый мастер PortfolioLab_All_Data_0_4_3.sqlite.gz дополнительно включает архивные слои акций, ЦБ, прежнего выпуска и исходные артефакты. Рабочая проекция сайта не является полной копией всех архивных слоёв этого мастера.

Сайт использует 42 таблицы текущего среза с общим объёмом 1 946 772 строк, пять SQL-представлений и три служебные таблицы. Число 1 946 772 относится только к 42 текущим финансовым таблицам. Прежние 38 таблиц namespace r06b98526_ сохранены отдельно и в этот объём не включены. Строки представлений, журнал загрузки и кеш каталога к нему не прибавляются.

В mm_source_artifact проекция сохраняет все 28 записей метаданных без поля payload_gzip. Оригинальные gzip-байты остаются в денежной SQLite и полном мастере; это единственное исключение полей при переносе текущих таблиц. Оригиналы не удаляются и не заменяются ссылкой без сохранённого файла.

Каталог и ряды строятся из одной data_version. runtime_catalog_cache является производным кешем каталога с привязкой к версии и манифесту. Он не является первичным источником цен и не редактируется вручную. Финансовые запросы пользователей не дописывают таблицу runs; серверное хранение личных портфелей не реализовано.

Покрытие и единицы

В справочнике 290 записей, включая 127 кодов акций и 127 производных ценовых справочников. Число записей справочника не является числом независимых компаний. Доступны исследовательские TRI 83 кодов акций и 123 ценовых справочника. Всего в series 777 473 оценок. Начало общего календаря 22.09.1997, конец 16.10.2026, 7 277 дат; наличие раннего календаря не означает одинаковую глубину всех инструментов.

Статус допуска APIЗаписейДопустимый смысл
research98Исследовательские TRI акций и накопительные ряды БПИФ
price_only123Изменение цены с известными поправками без дивидендов
reference10Условные позиции по справочным оценкам или индексам
theoretical1Теоретическая модель MM_CBR
synthetic9Новые расчётные исследовательские ряды
cash_model1Денежный остаток CASH_RUB без процентов
blocked48Нет допущенного ряда или действует блокировка качества

Полное покрытие каждого кода сохраняется в instrument_coverage.csv: первые и последние исходные цены отдельно от расчётного ряда, количество оценок, неторговые отметки, класс, качество, ISIN и underlying_symbol. Даты и числа выгружаются из SQL, а не вводятся в паспорт вручную.

Даты имеют формат YYYY-MM-DD. Веса JSON задаются долями единицы; в форме и index_members.weight_pct — процентами. Доходность, волатильность и просадка в машинном ответе задаются долями; 0.10 означает 10%. NAV и внешние потоки выражены в RUB, золото ЦБ — RUB за грамм, валютный курс — RUB за одну единицу после деления Value на Nominal. level является безразмерным индексом, а не рыночной ценой. Комиссия задаётся в базисных пунктах, 1 bps равен 0.01%.

NULL означает неизвестное или неприменимое значение. Неизвестная выплата, остановка источника или отсутствие истории не превращаются в ноль. Статус и окно допуска важнее наличия строки в архиве. Отсутствие строк выплат само по себе не доказывает накопительную политику фонда.

SQL таблицы текущего среза

Следующая инвентаризация формируется автоматически из входных SQLite и замороженного runtime-manifest.json. Указаны логические имена без общего префикса. Полные поля, типы, NULL, ключи, связи, индексы и DDL сохраняются в data_dictionary.json и приложении к HTML методике.

ТаблицаСтрокПервичный ключНазначение
instruments290symbolИдентичность инструментов и производных рядов
metadata33keyПараметры замороженного финансового выпуска
primary_annual_coverage14secid, yearПервичные годовые сверки выплат
quality_issues72idЗамечания по качеству данных
runs0run_idЖурнал исходного Python API который текущий сайт не заполняет
sources14 522source_idПроисхождение наблюдений и контрольные суммы источников
trading_calendar7 277dateОбщий календарь оценок на основе IMOEX
mm_fund_model1model_idОпределение теоретической модели MM_CBR
mm_lqdt_action1effective_dateЮридическая дата дробления и дата применения к цене LQDT
mm_metadata14keyПараметры и границы денежной подбазы
mm_source_artifact28source_idМетаданные первичных артефактов денежной подбазы
candle_archive240 191symbol, dateОтдельно сохранённые ранние дневные свечи
corporate_actions11symbol, effective_date, action_typeДробления и другие корпоративные действия
distribution_evidence2 112evidence_idИсходные свидетельства выплат
distributions1 312event_idКанонические экономические события выплат
dividend_annual_control1 592symbol, yearГодовая сверка канонических дивидендов
event_exclusions12decision_idКандидаты исключённые из денежных событий
fund_policy15symbolИсследовательские правила распределения дохода БПИФ
index_members228 786index_code, date, symbolИсторические составы и исходные веса IMOEX
instrument_aliases32symbol, source_symbol, boardИсходные коды фондов и интервалы справочника
model_parameters1symbolПараметры импорта модели денежного рынка
prices487 931symbol, dateИсходные цены OHLC и торговая активность
reference_observations45 804symbol, dateИсходные величины ЦБ с номиналами и датами
return_coverage127symbolДопустимые исследовательские окна TRI акций
security_code_changes2change_idДоказанные переходы между историческими кодами
series777 473symbol, dateУровни расчётных рядов и признаки доступности сделки
source_revision_reviews43review_idРешения по изменениям закрытых источников
synthetic_artifacts111source_idПроисхождение и хеши сохранённых первичных входов расчётных рядов
synthetic_inputs54 866dataset, date, fieldНормализованные исходные индексы цены выплаты и дробления
synthetic_models9symbolВерсионированные определения девяти расчётных рядов
mm_lqdt_quote1 687dateФактические положительные котировки LQDT и VTBM
mm_model_daily12 709model_id, dateПолный календарный индекс MM_CBR включая начальную точку
mm_rate_daily17 487rate_type, dateРаздельные календарные значения ключевой ставки и рефинансирования
mm_rate_event205rate_type, effective_fromДатированные события изменений ставок
mm_rate_observation3 281rate_type, dateИсходные опубликованные наблюдения ключевой ставки
dividend_currency_facts19fact_idПервичная валюта единица выплаты и RUB эквиваленты
event_aliases1 345original_event_idСвязь исходных событий с каноническими
event_evidence2 100event_id, evidence_idСвязь экономического события со свидетельствами
event_reviews56decision_idСохранённые решения проверки событий
event_timing1 312event_idДаты события и подтверждённая историческая доступность
primary_dividend_facts18fact_idПервичные факты по отдельным выплатам
synthetic_points43 871symbol, dateПолная история моделей с датами входов и действующим курсом

Представления: canonical_index_members, canonical_price_history, coverage, daily_returns, effective_price_history. Их строки не являются дополнительными первичными наблюдениями.

Служебные таблицы: runtime_releases — состояние выпуска и число ожидаемых строк; runtime_seed_chunks — подтверждённые пакеты загрузки; runtime_catalog_cache — производный каталог. Их данные не входят в финансовый объём.

Девять новых расчётных рядов

К базовому слою 0.4.3 добавлены девять рядов с классом synthetic_model и исследовательским допуском synthetic. Их коды отличаются от биржевых тикеров реальных фондов. MM_CBR сохраняется отдельной прежней моделью; CASH_RUB остаётся денежным остатком.

КодИстория в конструктореПолная модельОценок в конструкторе
CORP_FUND_PROXY2018-12-29 — 2026-10-162018-12-29 — 2026-10-161958
FX_BASKET_RUB2006-05-11 — 2026-10-162006-05-11 — 2026-10-165128
IMOEX_FUND_PROXY2004-12-30 — 2026-10-162004-12-30 — 2026-10-165456
MM_RUONIA2010-01-11 — 2026-10-162010-01-11 — 2026-10-164216
MM_RUSFAR2018-01-09 — 2026-10-162018-01-09 — 2026-10-162208
OFZ_FUND_PROXY2002-12-30 — 2026-10-162002-12-30 — 2026-10-165960
QQQ_TR_RUB1999-03-11 — 2026-10-161999-03-11 — 2026-10-166912
SPY_TR_RUB1997-09-22 — 2026-10-161993-02-01 — 2026-10-167277
USD_MM_RUB2018-04-03 — 2026-10-162018-04-03 — 2026-10-162150

MM_RUONIA использует опубликованный Банком России накопленный индекс RUONIA. MM_RUSFAR использует опубликованный Московской биржей RUSFARIND. IMOEX_FUND_PROXY использует имеющийся MCFTR. OFZ_FUND_PROXY использует RGBITR, CORP_FUND_PROXY — RUCBTRNS. Это индексы совокупного дохода; дивиденды и купоны внутри них повторно не прибавляются. Для IMOEX_FUND_PROXY сохранены точные даты поддержки исходного MCFTR, включая четыре внутренних пропуска; отсутствующие наблюдения не заполняются.

Базовые дополнительные расходы всех девяти моделей равны нулю, налог равен нулю. Параметры закреплены в db/synthetic-models.json. Расходы модели не калибруются к историческому результату реального БПИФ. Изменение параметров создаёт новую версию данных. Комиссии портфельных операций задаются отдельно в конструкторе.

Валютная корзина

FX_BASKET_RUB распределяет капитал по одной трети в USD_RUB, EUR_RUB и CNY_RUB. При первоначальном входе приобретаются дробные условные позиции. В начале нового месяца сначала переоцениваются прежние позиции, затем восстанавливаются равные веса. Процентный доход на валюты отсутствует. Комиссии внутренней ребалансировки корзины равны нулю; отдельная комиссия портфеля применяется к покупке или продаже самой модели.

История начинается только на пересечении допущенных валютных рядов с 11.05.2006. Старые архивные CNY с неоднозначными номиналами не расширяют это окно. Простое усреднение исходных рублёвых цен разных валют не используется.

Американские ETF и рублёвая оценка

Для QQQ и SPY сохранены полные ответы Yahoo Finance с дневными ценами, выплатами и событиями дроблений. CLOSE и историческая выплата источника относятся к единице, уже скорректированной на дробления. Событие дробления QQQ 2 к 1 сохраняется как свидетельство и повторно к этим CLOSE не применяется.

USD доходность строится через независимую цепочку реинвестирования на ex-date:

wealth_usd(t) = wealth_usd(t−1) × (close(t) + dividend(t)) / close(t−1)

Выплата реинвестируется по закрытию ex-date, с дробными долями, без налогов. Дата поступления на конкретный брокерский счёт не моделируется. Внутренние расходы ETF уже отражены в цене. Vendor Adjusted Close сохранён только для диагностики: его соглашение о дивидендной корректировке отличается от явного денежного реестра и не подменяет формулу.

Для российской даты d выбирается последняя американская дата t строго меньше d. Затем применяется официальный USD/RUB с действующей датой не позднее d и в пределах сохранённого valid_until. Рублёвый уровень пропорционален wealth_usd(t) × USD_RUB(d) и нормируется к 100 на первой полной модельной оценке. Поэтому закрытие США 16.10.2026 не используется в российской оценке 16.10.2026.

Источники SPY сохранены с 29.01.1993; первая полная рублёвая модельная оценка — 01.02.1993. В конструкторе используется общий календарь с 22.09.1997. Ранние даты full history относятся к модельному календарю рабочих дней и не объявляются торговыми сессиями Мосбиржи. Для QQQ первая рублёвая модельная оценка — 11.03.1999.

Первичная идентичность ETF сверена по страницам эмитентов. Исторические дневные цены и выплаты являются данными поставщика Yahoo Finance; все выплаты за весь период не объявляются независимо сертифицированными по документам эмитентов. Эти ограничения входят в допуск и паспорт результата.

Долларовый денежный рынок

USD_MM_RUB использует накопленный индекс SOFR и ту же консервативную схему предыдущей американской даты и действующего USD/RUB. С 02.04.2018 по 28.02.2020 сохранены официальные indicative значения из Excel архива ФРБ Нью-Йорка; с 02.03.2020 используются регулярные данные API. Ранний участок имеет явный статус official_indicative_prelaunch. Первая рублёвая модельная оценка — 03.04.2018.

Доступность SOFR как официального ориентира не означает возможность разместить деньги инвестора непосредственно по этой ставке. Налоги, доступ к счёту, расходы конвертации и брокерская исполнимость этой теоретической моделью не задаются.

Слои и происхождение

synthetic_artifacts хранит ссылки, время получения, SHA-256 исходных байтов и gzip, тип свидетельства и путь к сохранённому артефакту. synthetic_inputs хранит нормализованные индексы, цены, выплаты и дробления с источником каждой записи. synthetic_models хранит определения, расходы, даты и версию. synthetic_points хранит полный модельный календарь, уровень, дату американского или индексного входа, дату и значение FX и пояснение расчёта.

В prices добавлено 41 265 условных модельных оценок с basis SYNTHETIC_RESEARCH_INDEX. Их CLOSE равен уровню модели; это не рыночная цена пая или ETF в рублях. OPEN, HIGH, LOW, volume и turnover для них не создаются. Исходные фактические цены остаются неизменными. Поле raw_first_date старого общего представления coverage для synthetic_model относится к этим отдельно помеченным оценкам; фактическая глубина первичного источника раскрывается в synthetic_inputs и протоколе ETF.

У model points поле conditional_rebalance и соответствующий series.tradable сохраняют признак обновления исходного наблюдения. Действующий движок для is_reference=1 допускает условную аналитическую ребалансировку и на перенесённой оценке в разрешённом возрасте. Этот режим не подтверждает возможность реальной биржевой сделки. Для американских входов перенос ограничен семью днями; для официальных индексных оценок — 35 днями внутри наблюдаемого периода; FX дополнительно ограничен valid_until и возрастом 14 дней.

Все 111 первичных артефактов сохранены. Выдача GET /api/synthetic-models читает определения из SQL; GET /api/synthetic-history/<data_version>/<symbol>.json читает полную модельную историю. Основной расчёт получает те же уровни из series на общем российском календаре. При ошибке SQL перехода на статический файл нет.

Независимая проверка

Для SPY и QQQ отдельный денежный реестр получает дивиденды в деньги и увеличивает число дробных паёв по цене закрытия, затем пересчитывает результат в рубли. Проверены все 16 080 полных модельных оценок этих двух рядов. Максимальная разница с основной цепочкой — менее 0.000000005 индексного пункта.

Валютная корзина независимо выполнена исходным портфельным Python движком на базовой базе 0.4.3; проверены 5 128 дат. База с девятью добавлениями повторно построена офлайн и совпала побайтово. Все прежние строки предметных таблиц базового выпуска сохранены; новые данные не объявляются исправлением первичных выплат российских акций.

Первичные ссылки: https://www.cbr.ru/hd_base/ruonia/sv_ruonia/ ; https://www.moex.com/a8906 ; https://www.moex.com/a5865 ; https://www.moex.com/a7477 ; https://www.newyorkfed.org/markets/reference-rates/sofr-averages-and-index ; https://www.newyorkfed.org/markets/opolicy/operating_policy_200306 ; https://finance.yahoo.com/quote/QQQ/history/ ; https://finance.yahoo.com/quote/SPY/history/ . Точные запросы, пагинация и хеши сохранены в synthetic-source-manifest.json.

Серверный API и порядок расчёта

ЗапросНазначение
POST /api/backtestРасчёт и сравнение до трёх портфелей по выбранным SQL рядам
GET /api/catalogСправочник календарь и метаданные одного среза
GET /api/data/<data_version>/<symbol>.jsonКонтрольное чтение расчётного ряда
GET /api/money-market-configПараметры отдельного денежного калькулятора
GET /api/money-data/<money_version>/history.jsonПолный календарный ряд ставок MM_CBR и LQDT
GET /api/database/statusВерсия состояние и проверенный объём SQL
GET /api/readinessСтадия пилота лимиты и открытые вопросы
GET /api/synthetic-modelsОпределения и интервалы девяти моделей из SQL
GET /api/synthetic-history/<data_version>/<symbol>.jsonПолная история модели с датами входов и FX

Браузер отправляет workspace, ожидаемые data_version и engine_version. Сервер проверяет формат, версии, состав и объём запроса, читает выбранные ряды и MCFTR из SQL, затем вызывает канонические JS-модули lib/calculation. Браузер проверяет версии ответа и строит таблицы и графики. Отдельная исследовательская страница денежного рынка сохраняет браузерный калькулятор; это не место исполнения основного портфельного бэктеста.

Независимый Python-движок используется для контроля. Размещённого Python/FastAPI сервера и PostgreSQL в текущем проекте нет. Действующий сервер — Worker с D1; вариант VPS и REG.RU остаётся следующим возможным развёртыванием.

Несовпадение версий запроса даёт 409, неверные параметры — 422, неизвестный ряд или версия при чтении — 404, незавершённый SQL срез — 503. При ошибке SQL переход к статическим JSON не выполняется. Лимиты пилота: три портфеля, 20 разных инструментов суммарно, 32 768 байт запроса, 180 000 входных строк с учётом бенчмарка. Один активный расчёт допускается в одном isolate; занятому процессу соответствует 429 с Retry-After 2. Это не глобальная очередь и не оценка пропускной способности всего сервиса.

Расчёт капитала денежных потоков и риска

Портфель выражен в RUB, только длинные позиции, без заёмного плеча, с дробными долями. На каждой дате сначала меняется стоимость прежних позиций, затем выполняется месячный внешний поток, затем доступная плановая ребалансировка. Ребалансировка выполняется на первом доступном закрытии нового месячного, квартального или годового периода; отсутствие возможности сделки откладывает её.

Правило confirmed-month-end-v1 определяет последнюю дату месяца по полному календарю выпуска. Дата подтверждена как конец месяца, если следующая дата полного календаря относится к новому месяцу или сама дата является последним календарным днём. Последний день выбранного пользователем окна не создаёт месячный поток. На дате первоначального входа дополнительный поток отсутствует; в неполном последнем месяце он не начисляется. Сокращение до общей истории инструментов не изменяет правило.

При недоступности торговли пополнение остаётся денежным остатком до доступной плановой ребалансировки. Изъятие с необходимой продажей недоступного инструмента отклоняется. Недостаток капитала для изъятия с расходами также приводит к отказу. Внешние взносы и изъятия меняют число условных паёв и не входят в TWR доходность.

Комиссия применяется к абсолютному обороту, включая первоначальную покупку. Перевод CASH_RUB не облагается комиссией сделки. Комиссии портфельных сделок уменьшают стоимость; встроенное реинвестирование дивидендов внутри TRI отдельной брокерской комиссией не облагается. Налоги не моделируются, расходы уже включённые в цену БПИФ повторно не вычитаются.

TWR определяется по стоимости условного пая после расходов. CAGR использует календарную длительность в днях делённую на 365.2425. Волатильность — выборочное стандартное отклонение дневной TWR доходности с множителем sqrt(252). Sharpe использует среднюю дневную доходность и ту же волатильность; безрисковая ставка принята равной нулю. Sortino использует отрицательные дневные отклонения от нулевого порога; при нулевом знаменателе соответствующий коэффициент равен NULL. Максимальная просадка считается по очищенному от потоков индексу капитала. Неполный год в annual_returns помечается эвристикой даты первой и последней оценки, а не сертификацией календарного покрытия.

График MCFTR показывает вложение первоначальной суммы без внешних потоков. Сравнивать его конечную денежную сумму с портфелем со взносами как чистую доходность нельзя. Редкость торгов и перенесённые оценки способны занижать измеренную волатильность; фиксированное число 252 является допущением.

Паспорт результата

JSON паспорт сохраняет полные параметры workspace, фактический общий период и effective_settings, data_version, engine_version, политики потоков и допуска, результаты, предупреждения и run_id. CSV содержит идентификаторы для сопоставления с паспортом. Для повторения результата нужны также код и зафиксированные входные данные.

run_id состоит из первых 24 шестнадцатеричных символов SHA-256 канонически упорядоченного паспорта параметров с версиями. Он служит идентификатором воспроизводимого набора условий, не является электронной подписью и не подтверждает внешние первичные факты. Хеши фактических файлов кода дополнительно фиксируются в verification.json и манифесте контрольного комплекта.

Правила формирования финансовых рядов

Следующие правила финансового выпуска 0.4.3 сохраняются. Упоминания прежних выпусков описывают происхождение принятых решений; их протоколы не подменяют текущий контроль. Команды tools относятся к исходному финансовому архиву, а не каталогу Site.

Область и идентификация

Базовый финансовый слой 0.4.3 содержит 281 запись, включая 127 кодов акций и отдельные производные ценовые ряды с суффиксом _PRICE. Производные ряды не являются новыми биржевыми выпусками или дополнительными компаниями. Историческая вселенная расширена по официальным составам IMOEX с 03.01.2001. Публичные российские акции за пределами этой исторической вселенной не объявляются полностью охваченными. Облигационная экспозиция представлена БПИФ; индивидуальные облигации не подключены.

У бумаги сохраняются исходный код, ISIN, идентификатор эмитента, режим и источник наблюдения. Префы и обыкновенные акции разделены. Связь старого и нового кода фонда допускается только при доказанном совпадении ISIN и валюты. Редомициляция, новая расписка или обмен акций не склеиваются автоматически.

Слои данных

  1. Неизменяемые первичные HTTP-ответы с URL, временем получения и SHA-256.
  2. Нормализованные исходные OHLC, обороты, корпоративные события, справочные цены и интервалы качества.
  3. Исследовательские полные доходности и отдельные ценовые ряды.
  4. Серверная SQL-проекция и API сайта. Каталог и ряды одного расчёта имеют единую data_version; арифметика портфеля выполняется на сервере; браузер отображает ответ.

Ранние значения могут существовать в архиве, но не допускаться к расчёту. Даты начала исходных наблюдений, расчётной серии и допущенного исследовательского окна хранятся раздельно. Справочные цены ЦБ и индексы не объявляются ценами исполнения сделок.

Акции: история, режимы и свечи

Загружается доступная история основных режимов групп 6 и 57 в RUB/SUR/RUR. До 30.08.2013 предпочтителен основной T0, с 02.09.2013 — T+. При нескольких наблюдениях сначала выделяются строки с положительным объёмом; если такие строки есть, выбор идёт среди них. Затем внутри полученного набора предпочтительна расчётная группа соответствующей даты, после неё действует документированный порядок режимов. При отсутствии строк с положительным объёмом доступны оценки с запретом биржевой сделки; альтернативы сохраняются. По одному режиму и дате используется последнее сохранённое свидетельство. Котировки разных режимов не усредняются. Высокорисковый режим TQPI сохраняет собственную идентичность в источнике.

Основная база теперь содержит OPEN, HIGH, LOW, CLOSE и обороты. Ранние дневные свечи сохраняются отдельно в candle_archive, поскольку ретроспективное изменение единиц и история режима не следуют из URL свечи. Раннее дополнение допускается только для RU-бумаги при минимум 100 перекрывающихся наблюдениях и совпадении не менее 99.5% CLOSE с исходной неадаптированной историей в относительном допуске 1e-7, при отсутствии отношений соседних цен вне интервала [0.5; 2.0] в добавляемом участке. Такие строки имеют basis=ISS_CANDLE_UNITS_CROSSCHECKED_RESEARCH. Это исследовательская проверка единиц, а не сертификация всех корпоративных действий. Не прошедшие условия свечи не используются в расчётном ряду.

Полная доходность: r(t)=(k(t)*P(t)+D_old(t))/P(t-1)-1; TRI(t)=TRI(t-1)*(1+r(t)). k — новых акций на старую, D_old — выплата на предыдущую бумагу. Дробление не создаёт прибыль. Дивиденды учитываются один раз на ex-date, с дробным реинвестированием без налогов. Зачисление на брокерский счёт не моделируется.

Ранний участок полной доходности не открывается из-за наличия одной более поздней выплаты. return_coverage сохраняет прежнее поддержанное окно; расширение влево требует непрерывной последовательности лет, для которых явно опубликованная годовая сумма согласуется с каноническим реестром выплат. Для частичного первого года отдельно сверяются выплаты внутри доступного ценового интервала. Это контроль внутренней согласованности источников, не независимая сертификация полноты эмитента. Неподтверждённое отсутствие выплат не считается нулём.

TICKER_PRICE — отдельный исследовательский индекс изменения цены с известными поправками на дробления, без дивидендов. Он связан с исходным кодом через underlying_symbol и имеет is_reference=1. Отсутствие полной доходности акции не мешает сохранить её исходные цены, однако ценовой ряд явно подписывается и не выдаётся за полную доходность.

События и доступность информации

Выпуск данных 0.4.0 содержит 15 прежних проверенных решений и 13 дополнительных решений по ранним MTSS, RTKM/RTKMP и MOEX. У MOEX за 2023 год одна выплата 17.35 RUB на реестр 14.06.2024; прежняя дата предложения не создаёт вторую выплату. Две выплаты AKRN по 40 в 2008 году относятся к разным периодам и не объединяются по сходству дат и сумм.

Старые первичные свидетельства сохраняются. Закрытый срез вторичных дивидендных источников повторно разобран на всю доступную глубину; свежие строки добавляются после прежнего среза. Изменения источника внутри закрытого периода формируют отдельную очередь, а не незаметную замену факта. Канонический ID проверенного события зависит от инструмента и периода; aliases/evidence сохраняют происхождение.

До перехода на T+2 ex-date оценивается по следующей фактической основной торговой дате после реестра для T0. Позднее используется соответствующий T+2/T+1 календарный прокси или подтверждённая дата источника. Рабочие субботы раннего T0 не отбрасываются только по номеру дня недели. Прокси не объявляется подтверждённой биржевой ex-date.

Даты реестра, утверждения, объявления и доступности инвестору различаются. event_timing сохраняет известную дату утверждения; available_at остаётся NULL, если момент публикации не подтверждён. Особенно до 2014 года реестр мог предшествовать окончательному утверждению суммы. Ретроспективная TRI и факторные показатели из неё не объявляются сертифицированной point-in-time информацией для торгового решения.

Валюты

Первичные Value, Nominal, исходная дата и единицы сохранены в reference_observations и отдельной reference_archives.sqlite вместе с gzip-байтами источников. Цена одной единицы валюты = Value/Nominal. Значения исходных рублей до 01.01.1998 делятся на 1000; деноминация не является инвестиционным убытком.

USD, GBP, CHF: архив с 01.07.1992; EUR: с 01.01.1999. CNY: ранний архив с 1992 года сохраняется для проверки, расчётный дневной участок начинается 11.05.2006 из-за неоднозначных ранних номиналов и аномалий. HKD: отдельные блоки 01.04.1998–11.01.2010 и с 01.04.2017; промежуток не заполняется. Месячная публикация не превращается в ежедневное рыночное наблюдение.

Даты валютного XML являются действующими датами и не сдвигаются ещё на сутки. Перенос допускается вперёд только в разрешённом интервале действия; известные прекращения публикации обрывают интервал. Для дневных рядов предел возраста 14 дней, для раннего месячного HKD учитывается его собственная частота. Данные до 1997 года остаются в самостоятельном архиве и не называютcя биржевым календарём. Сохранённые архивы административных курсов до 1992 года не присоединяются к инвестиционной FX-истории.

Золото

GOLD_RUB — учётная цена ЦБ с действующей даты 08.07.2003, с отдельной отметкой режима дисконта до июля 2008. GOLD_RUB_LEGACY — самостоятельная историческая цена покупки ЦБ с исходных наблюдений 25.03.1997, действующая дата 26.03.1997; она не склеивается молча с учётной ценой. Исходные Buy/Sell сохранены в XML, в модели используется Buy.

До 01.07.2008 XML-дата установления сдвигается на один календарный день вперёд; далее дата уже действующая. Деноминация определяется по исходной денежной единице и исходной дате, даже если дата действия перешла в 1998 год. Противоречащая подпись старой HTML-таблицы сохранена как замечание; приоритет у XML-контракта и нормативного правила.

Индексы, фонды, денежная модель и календарь

IMOEX: официальный календарь с 22.09.1997. MCFTR: основная серия с публичной базовой даты 30.12.2004; доставленные провайдером более ранние значения с 2003 года сохранены в архиве и не присоединены к основному бенчмарку без согласования методики.

У 15 БПИФ сохраняется фактическое начало положительных котировок и исследовательская накопительная политика. Купоны внутри стоимости пая и уже отражённые расходы фонда повторно не добавляются и не вычитаются. История LQDT включает VTBM с 20.01.2020, GOLD включает VTBG с 15.07.2020; до появления фонда котировки не создаются. Правила распределения дохода на всём периоде ещё требуют проверки.

MM_CBR остаётся отдельной теоретической моделью с полной календарной историей с 01.01.1992: рефинансирование до 15.09.2013, ключевая с 16.09.2013, ежедневная капитализация ACT/ACT, налоги 0, базовые расходы 0. Ставки хранятся раздельно. Их доступность не означает возможность инвестировать по ставке ЦБ. Основной импорт модели согласован с календарём IMOEX, полный календарный ряд доступен отдельно. Методика денежной подбазы 0.3 сохраняется.

До первого и после последнего биржевого наблюдения цены не дописываются. Перенос между наблюдениями служит оценке позиции, а не разрешению сделки. Возраст оценки акций вычисляется календарными днями от последней доступной торговли. Торговля требует фактической цены и положительного объёма. Неизвестная доходность внутри окна вызывает ошибку; HKD не заполняется через многолетний разрыв.

Портфель и риск

Расчёт в RUB, long-only, без плеча, с дробными долями. Ребалансировка на первом доступном закрытии нового периода после изменения стоимости старых позиций. Расходы применяются к обороту, включая первоначальную покупку; CASH_RUB не облагается комиссией перевода. Внешние потоки отделены от TWR. CAGR использует календарную длительность; дневная волатильность — выборочное стандартное отклонение с множителем sqrt(252). RF/MAR по умолчанию 0 — допущение, а не реальная безрисковая ставка.

Пропуски, редкая торговля и официальные справочные оценки могут снижать измеренный риск. Ранняя редкая FX-история не подаётся на дневной расчёт риска по фиктивным торговым сессиям. Историческая симуляция и оптимизация не доказывают исполнимость и будущую доходность.

Реализованные решения 0.4.2

Отмена рекомендации не является выплатой. Кандидат PLZL 436,79 ₽ на 16.06.2023 исключён из экономического реестра; свидетельства сохранены, решение записано в event_exclusions. Пересчитаны TRI и факторы, использовавшие это событие.

Все 43 изменения закрытых вторичных источников получили отдельное решение в source_revision_reviews. Дробления PLZL/T 1:10 и TRNFP 1:100 учитываются один раз; точные исторические суммы не заменяются округлёнными значениями на новую акцию. Декабрьский PLZL 2024 сохраняет первичные 1301,75 ₽; свежие 127,80 ₽ не соответствуют делению на 10 и отклонены.

TRNFP: точные суммы на историческую акцию уточнены до 724,21; 757,87; 823,31 и 4296,48 ₽ для реестров 2014–2017. Выплата 3875,49 ₽ за первое полугодие 2017 остаётся отдельной.

По TCSG исправлены две даты реестра: 28→29 мая 2020 и 25→27 ноября 2020. Для 11 выплат T/TCSG сохранены даты выплаты из истории эмитента. Это сведения о выплате эмитентом, не подтверждение даты зачисления каждому инвестору. Четыре ранних RUB-эквивалента сохраняют rub_currency_conversion_proxy; первичная валюта USD указана отдельно в решении.

MTSI→MTSS и NOTK→NVTK с 21.11.2011 подтверждены официальным реестром ISS changeover. Совпали ISIN, регномер, номинал, тип и эмитент, а также 268 и 525 закрытий в перекрытии. Коэффициент 1 — исследовательский вывод по совокупности доказательств. security_code_changes хранит обратимую карту; canonical_price_history выбирает исходный старый код до перехода и новый после, без усреднения и подгонки стыка. Ценовая история MTSS начинается 11.02.2004, NVTK — 18.08.2006; исходные SECID/режим/источник сохраняются. canonical_index_members показывает связь, не переписывая исходные веса. Эти представления не расширяют допустимый TRI автоматически.

AGRO и RAGR остаются разными выпусками. Старые 13 строк 2015–2021 не относятся к ценовому окну новой российской акции RAGR. Их сравнение сохраняется в архиве; самостоятельные суммы AGRO требуют валютной сверки. Распределение 7,0135 новой акции на ГДР не является обычной сменой тикера.

Формирование и контроль исходного финансового выпуска

Основная команда: python tools/control.py --full. Она включает сохранность пакета, экономические проверки, новый tools/control_primary_review_batch.py, экспорт каждого ряда, сценарии JavaScript/Python, восстановление SQL и офлайн-пересборку обеих баз с сопоставлением таблиц. Детальные результаты — control/full_control_report.json; текущая первичная проверка — reports/primary_review_control.json. PASS подтверждает выполненные проверки, но не закрывает перечисленные ограничения полноты, валют, фондов или времени доступности.

Финансовый выпуск 0.4.3 фиксирует исправления существующего среза, а не новые рыночные наблюдения после 16.10.2026. Исторические отчёты 0.4.0/0.4.1 сохранены в docs/archive и не являются результатами повторного контроля этой редакции.

Требования к качеству и дальнейшему развитию

Единица учёта и устойчивые идентификаторы

Основная экономическая единица — конкретный выпуск с классом прав и интервалом существования. Тикер является датированным обозначением. Обыкновенная акция, преф, расписка, новая акция после обмена и производный _PRICE разделяются. Числовой evidence_id в SQLite служит внутренней ссылкой сборки; внешняя прослеживаемость опирается на снимок, хеш источника и исходную строку. Для следующего этапа предусмотрены issue_id и устойчивый ключ свидетельства.

Статус задаётся для интервала

Архивное наблюдение, исследовательская цена, исследовательская TRI, документально проверенный интервал и блокировка имеют разный смысл. Текущие quality и return_coverage описывают исследовательский допуск. Новая классификация является требованием к следующим изменениям схемы; текущие ряды не переименованы в сертифицированные.

Граница доказательства полноты

Два совпавших агрегатора могут использовать общий источник. Совпадение с годовой суммой не доказывает отсутствие иных событий, корректность единицы или времени публикации. Для документально проверенного окна нужен реестр всех выплат, решений о невыплате и корпоративных действий по выбранному выпуску и периоду. Каждый открытый год и неполный первый/последний год проверяется отдельно.

События и пересчёт единиц

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

Преемственность кодов

Совпадающий ISIN является основанием для проверки связи, а не достаточным основанием для автоматической склейки всей истории. Нужны интервалы действия кодов, документ перехода, проверка количества прав, денежных единиц и стыка цен. Состав IMOEX сохраняет исходный исторический код; непрерывная история выпуска должна иметь обратимую карту соответствий.

Время знания и время действия

Для будущего строгого режима используются effective_date, подтверждённый available_at и время фактического получения seen_at. Историческая дата реестра не заменяет публикацию; полученный в 2026 году документ не доказывает доступность его содержания инвестору в 2005 году. В текущих данных 0.4.3 available_at не подтверждён у всех 1320 событий; текущая ретроспективная TRI остаётся исследовательской.

Календари и исполнимость

Календарь оценок, фактическая торговая сессия бумаги, действующая дата ЦБ и календарное начисление MM_CBR описываются раздельно. Перенесённая оценка допускается только в установленном интервале и возрасте. Биржевая операция требует фактической доступности инструмента и цены. Расчёты со справочными _PRICE, индексами, курсами ЦБ и моделью являются условными аналитическими позициями; наличие ряда не доказывает исполнимость.

БПИФ и денежная модель

По каждому фонду нужен паспорт версий правил и режимов распределения дохода. Купоны и расходы, отражённые в цене пая, не добавляются и не вычитаются повторно. Дробления, смены кода и завершение обращения проверяются отдельно. Параметры MM_CBR сохраняются: ACT/ACT, налоги 0, расходы 0, рефинансирование до перехода на ключевую; реальные свойства биржевого фонда этой моделью не воспроизводятся.

Покрытие исследования

Для каждой даты состава C_TRI(d)=сумма известных весов кодов с доступным TRI / сумма всех известных весов наблюдаемого состава. Годовая метрика — среднее арифметическое дневных долей, а не доля компаний и не доходность. Аналогично публикуются фактические цены и ценовые оценки. Перенесённые оценки включаются только в метрику оценок. Неизвестные веса и пропущенные даты состава указываются отдельно; при нулевом знаменателе результат NULL.

Состав выборки и риск

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

Версии и приёмка

Каждая последующая редакция содержит ссылку на исходный снимок, data_version, хеш SQLite, методику, код, параметры, журнал принятых и отклонённых изменений. Численные эталоны меняются только с объяснением экономической причины. Перед выпуском повторяются структурные проверки, независимые денежные сценарии, сопоставление экспорта и офлайн-воспроизведение; открытые ограничения остаются в паспорте.

Регулярный контроль покрытия P08

Команда python tools/report_coverage.py включена в tools/control.py --full. coverage_kpi.json содержит ежедневные и годовые метрики: доли известных весов и кодов с фактической котировкой, котировкой с положительным объёмом, ценовой оценкой и TRI; минимальное и среднее покрытие, количество неизвестных весов, нулевые знаменатели, число и возраст перенесённых оценок. Среднее строится из дневных долей; четыре отсутствующих состава не дописываются. Независимый Python-реестр сверяет веса и возраст с SQL. Метрика измеряет доступность данных, а не независимую полноту корпоративных событий.

Дополнение 0.4.3 — ранние реестры и исходные валюты

MTSS и NVTK: расчётная ценовая траектория выбирает MTSI/NOTK до 21.11.2011 и MTSS/NVTK начиная с этой даты. Исходная price_daily и index_member_daily не переписываются. Коэффициент 1 используется только для двух подтверждённых одинаковых выпусков; цепочки смен кодов и реорганизации не обобщаются.

primary_dividend_facts содержит 18 первичных событий, primary_annual_coverage —14 ограниченных годовых проверок. Годы группируются по record_date, финансовый период сохраняется отдельно. Восьмилетний реестр МТС включает точные 3,20217480 рубля за 2003FY с реестром 10.05.2004. Граница NVTK18.08.2006 не даёт прав на реестр 31.07.2006: ограниченная сумма в хвосте 2006 равна 0, без утверждения нулевых дивидендов за весь год. Расширение TRI требует непрерывного ряда подтверждённых годовых проверок до прежней опорной границы.

В историческом режиме record_date может предшествовать утверждению. При неизвестной фактической дате выплаты условный cash-mode использует max(record_date+30 календарных дней, approved_at), если утверждение подтверждено. Это допущение не является реальным сроком зачисления. Ex-date остаётся календарной исследовательской оценкой. До даты утверждения ретроспективный TRI не означает доступности окончательного решения; available_at=NULL.

dividend_currency_facts разделяет nativeUSD/историческуюГДР, объявленныйRUB, фактический округлённыйRUB-эквивалент эмитента, бухгалтерскийRUB, FXдату/курс и дату зачисления инвестору.13 событийAGRO относятся к US7496552057(5 ГДР=1 кипрская акция),6TCSG —US87238U2033(1 ГДР=1 акция). AGROнепереноситсянаRAGR. Для 11AGRO основная исследовательская RUBмодель использует прямо сообщённые эмитентом платёжные эквиваленты, округлённые до 0,01; валюта выплатыUSD и индивидуальное зачислениеNULL сохраняются. Два раннихAGRO и все 6TCSG не получают фактическогоRUB/FX из бухгалтерского эквивалента или курсаЦБ.

49 прежних решений сохранены байт-в-байт по содержимому. Дополнения и применённые model_overrides имеют собственный фактID, источники, SHA и исходный исследовательский JSON. Повторная сборка не обращается к сети.

Для 11 уточнённыхAGRO дата списания Компанией сохранена в payment_date_actual и используется cash-mode. Как и ранее для 11T/TCSG, это дата эмитента, не дата поступления конкретному инвестору; всего 22 таких даты.

Исторический контроль формирования финансового выпуска 0.4.3

Полный контроль: python tools/control.py --full. Новый независимый tools/control_continuation.py проверяет все 49 прежних решений и 2101 свидетельство, исходные котировки и веса,14 первичных календарных сумм,18 событий,19 валютных фактов, границу NVTK, отсутствие искусственного скачка на смене кода и независимое владение акциями. Отчёт: control/full_control_report.json. Исходные факты сSHA: /data/continuation-facts.json. Браузерное взаимодействие в этом выпуске не проверялось.

Состав контрольного комплекта и границы воспроизведения

Контрольный комплект данных содержит 111 новых первичных артефактов в исходном gzip представлении и их метаданные, а также три неизменяемых входных SQLite — текущий финансовый срез, денежную подбазу и базовый финансовый срез 0.4.3, финансовый манифест, протоколы, актуальную методику и машинный словарь. Код, SQL миграции, программы проверки и статические эталоны сохраняются в Git. Адрес репозитория и точный commit записываются в SOURCE_VERSION.json комплекта. Для полного повторения нужны этот зафиксированный код и комплект данных. Файл BUNDLE_MANIFEST.json задаёт SHA-256 и размер каждого включённого файла; сам манифест исключён из собственного списка. Внешний SHA-256 ZIP сохраняется отдельно от ZIP, поскольку архив не может надёжно содержать собственный окончательный хеш.

Этот комплект восстанавливает текущую рабочую проекцию и повторяет вычисления из зафиксированных входов. Он включает новые первичные источники девяти моделей, но не дублирует весь архив прежнего слоя 0.4.3 и не выполняет повторное получение данных из сети. Полный цикл формирования базового слоя 0.4.3, включая его raw и офлайн пересборку исходного проекта акций, сохранён отдельно в PortfolioLab_0_4_3_2026-10-18.zip. Полный SQL мастер хранится как PortfolioLab_All_Data_0_4_3.sqlite.gz. Их исходные имена и идентичность не меняются.

Получить исходный проект по зафиксированному SOURCE_VERSION.json и открыть каталог кода с scripts, engine, db и tests. Нужны Python 3.12 и Node.js 24 для проверенного окружения; минимальное требование проекта Node.js указано в package.json. Основные Python зависимости закреплены в requirements-reproduction.txt по фактически проверенным версиям. JS контроль использует стандартные модули Node.js и не требует установки браузера или сборки сайта. Установку Python зависимостей и получение Git версии выполняют заранее; сам контроль работает офлайн.

Восстановить три входа из контрольного ZIP в каталог кода. Имя аргумента ниже заменить фактическим путём к сохранённому архиву. При наличии BUNDLE_MANIFEST.json восстановитель сначала проверяет байты всего комплекта, затем отдельно проверяет физические хеши всех трёх SQLite:

python3 scripts/restore_control_inputs.py /path/PortfolioLab_Synthetic9_Control_0_5_0_2026-10-18.zip

Полный повтор вычислительного контроля:

python3 scripts/reproduce.py

Проверка только целостности входов схемы и 42 финансовых таблиц:

python3 scripts/reproduce.py --structure-only

Команды отдельных этапов:

python3 scripts/verify_database.py
python3 tests/synthetic-models.py --rebuild
node scripts/sync-calculation.mjs
python3 tests/reconcile-engines.py
python3 tests/prepare-launch-database.py
node tests/launch-api.mjs
node tests/parity.mjs
node tests/comparison.mjs
node tests/history.mjs
node tests/money-market.mjs
node tests/primary-review.mjs
node tests/workspace-tools.mjs
python3 tests/interface-contract.py

verify_database.py открывает входы только для чтения, проверяет физические SHA-256, SQLite integrity_check и foreign_key_check, затем сравнивает все выбранные поля и строки 42 таблиц с замороженными логическими хешами. Порядок колонок берётся из runtime-manifest.json, строки сортируются по первичному ключу. Числа кодируются в big-endian IEEE-754 binary64 и помещаются в объект number64; текст и NULL сохраняются отдельно. Каждая каноническая JSON строка завершается переводом строки. Итоговый SHA-256 не зависит от текстовой записи 1 против 1.0 и не подменяется одним количеством строк.

Программа сохраняет control/database/verification.json, data_dictionary.json, schema.sql и instrument_coverage.csv. Проверка API пересоздаёт только временную work/launch-api.sqlite из текущей финансовой базы и денежной подбазы, применяет миграции, сверяет все 541 диапазон первичных ключей и тестирует чтение, расчёт, ошибки и запреты записи. Исходные SQLite не перезаписываются. Предыдущие 13 эталонов tests/python_expected.json сохраняются; новые Python ожидания создаются в work/reconciliation-expected.json.

Все ошибки приводят к ненулевому коду завершения. После изменения данных или кода нельзя автоматически заменять ожидаемые хеши и эталоны ради PASS. Нужно установить причину, оформить экономический эффект, решение и новую версию. Контрольный ZIP остаётся исходным неизменяемым пакетом; производные результаты повторного запуска создаются в рабочем каталоге кода.

Обязательные контроли и результаты текущей редакции

ОбластьКритерий приёмки и сохранённое свидетельство
Входные базыСовпадение физических SHA-256 размеров integrity_check и внешних ключей
SQL проекцияВсе поля 42 таблицы 1 946 745 строк 541 пакет и пять представлений соответствуют манифесту
Справочник и ряды290 записей 777 473 оценки согласованные data_version и календарь
Денежная модельОтдельные KEY и REFI правильные даты действия ACT/ACT и отсутствие налога
Корпоративные событияУтверждённые прежние решения сохранены исходные свидетельства не удалены
Python и JS51 сценарий и сравнение трёх портфелей включая независимые денежные реестры
APIЧтение и расчёт из SQL отказ при неверной версии отсутствие записи в готовый срез
ДокументыМетодика схема словарь и паспорт используют одну версию данных

Протокол текущего повторного прогона сохраняется в control/reproduction.json и tests/*validation.json. Детальный контроль баз — control/database/verification.json. Протокол загрузки нового среза — tests/synthetic9-live-import.json, сверка всех 290 историй перед переключением — tests/synthetic9-staged-api-validation.json. HTTP проверки после переключения сохраняются в контрольном комплекте отдельно от кода. Прежние HTTP протоколы 0.4.3 остаются историческими свидетельствами.

Численный PASS не сертифицирует полноту рынка, первичных выплат, время доступности информации, браузерное взаимодействие и публичную пропускную способность. Эта редакция не меняет аудиторию сайта и не открывает публичный коммерческий доступ.

Порядок изменения и выпуска базы

  1. Зафиксировать прежние входы, data_version, код, методику, хеши и открытые вопросы. Новый срез создавать отдельно, не перезаписывать готовый.
  2. Сохранить новые первичные ответы с полным обходом пагинации, исходной единицей, URL и временем получения. Сбой запроса не считать нулевым наблюдением. При неизвестном времени публикации оставить available_at равным NULL.
  3. Нормализовать данные и оформить решения. Изменения источников внутри закрытого периода направлять в source_revision_reviews. Суммы разных периодов не объединять только по сходству даты и размера.
  4. Пересобрать исходную финансовую базу и денежную подбазу, проверить единицы, корпоративные действия, календари и окна допуска. Расширение ценовой истории не расширяет TRI автоматически. По фондам нужны версии правил; по валютам и золоту сохраняются режимы и разрывы.
  5. Выполнить полный контроль исходного финансового архива tools/control.py --full в его собственном каталоге. Эту команду нельзя запускать из каталога Site: это разные уровни воспроизведения.
  6. Сформировать новый SQL мастер, новую data_version, префикс таблиц, runtime-manifest.json и миграции. Оригинальные BLOB сохранить в мастере. До передачи пакетов проверить новый физический хеш и логические хеши всех таблиц.
  7. Разместить схему и API при прежнем интерфейсе, загрузить пакеты в порядке внешних ключей. Каждая запись проверяется повторным чтением диапазона ключей; повтор пакета разрешён только при loading и совпадении хешей.
  8. Разрешить ready после сверки всех пакетов, строк, ключей и метаданных. Сопоставить HTTP ответы всех рядов, денежной модели и LQDT с эталонами, затем переключить интерфейс на новую версию.
  9. Отозвать временный ключ и проверить независимый запрет импорта готового среза. state ready блокирует start, chunk и finish даже с действующим ключом. Финансовый срез остаётся неизменяемым.
  10. Повторить вычислительный контроль, обновить методику, словарь, покрытие, журнал и манифест пакета. Сохранить исходные снимки и рабочую версию кода. Публиковать проверенный согласованный комплект с прежней аудиторией.

Откат означает переключение приложения на ранее сохранённые код, версию API и данные. Перезапись финансовых строк готового среза или незаметное переключение на JSON откатом не являются. Автоматический откат инфраструктуры не реализован; его выполнение и совместимость версий проверяются отдельно.

Журнал изменений и хранение контроля

Каждое изменение фиксируется в docs/CHANGELOG_RU.md: дата, причина, изменённые инструменты и периоды, прежнее и новое правило, влияние на результат, протокол контроля и ответственный за решение. Неизвестные сведения остаются открытыми до появления доказательства. Успешные тесты кода не закрывают вопросы источников.

Код, методика и миграции сохраняются в Git. Входные SQLite и контрольный комплект сохраняются отдельными версиями файлов; они не должны зависеть от временной рабочей папки. В новом выпуске сохраняются прежние архивы, первичные документы, принятые и отклонённые решения. Манифест позволяет проверить содержимое после переноса на другой компьютер или сервер.

Открытые вопросы базы и публичного запуска

Фьючерсы, короткие позиции, плечо, целое число контрактов, вариационная маржа, историческое ГО и опубликованные торговые стратегии не входят в текущий вычислительный выпуск. Их ввод требует отдельной подбазы, формализованных правил и контрольных реестров. Индивидуальные облигации не включаются; облигационная экспозиция остаётся в БПИФ.

Для самостоятельной повторной сборки девяти моделей после восстановления входов: python3 scripts/build_synthetic_database.py --output work/rebuilt-financial.sqlite --report work/rebuilt-financial-report.json. Для формирования SQL мастера текущего слоя: python3 scripts/prepare_synthetic_runtime.py. Дополнительные архивные слои полного мастера 0.4.3 остаются самостоятельным сохранённым выпуском.

При почти нулевой downside коэффициент Sortino чувствителен к округлению. Если обычный строгий допуск отношения превышен, контроль выводит верхнюю границу ошибки из максимального фактического расхождения дневных доходностей и минимальной downside. Денежная точность NAV и прочие показатели не ослабляются; вычисленные границы сохранены в bounded_ratio_roundoff протокола сверки.

Market breadth, таймлапс и память проекта — интерфейс 0.9.0

Полный реестр входов, принятых архивов, производных проекций и прежних баз: db/project-data-registry.json и docs/PROJECT_DATA_REGISTRY_RU.md. Правила продолжения: AGENTS.md и docs/PROJECT_CONTINUITY_RU.md. Постоянные паспорта PROJECT_MEMORY_RU.txt и PROJECT_MEMORY.json содержат точные ссылки на сохранённые версии файлов. Не подменять их временным work/.

Исследование SMA200 1.3.0 использует собственные неизменяемые входы. Его добавление в интерфейс не обновляет финансовый срез 0.5.0 или движок 0.5.0-rc.2. Восстановление, экспорт и независимая сверка выполняются без повторного сбора:

python3 scripts/export_market_breadth.py --archive /path/PortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip
python3 tests/market-breadth.py --archive /path/PortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip
node tests/index-history-view.mjs
python3 tests/interface-contract.py

Для общего прогона с обеими отдельными историческими базами:

python3 scripts/reproduce.py --index-archive /path/PortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip --breadth-archive /path/PortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip

Без этих аргументов общий контроль явно отмечает независимую сверку соответствующего источника как not_run; тест интерфейса её не заменяет. Полный исходный пересчёт исследования описан в docs/MARKET_BREADTH_RU.md. Контроль всех 226 месяцев и 9 413 участников сохранён отдельно от 142 сигналов стратегии. Не расширять её бэктест до 2008 года по наличию диагностики.

В таймлапсе 309 кадров, из них первые 83 без breadth. Склейка строго по дате, без обратного заполнения. В июне–августе 2011 различия MTSS / MTSI-002D сохранены как нерешённые; 37 месяцев различий исторических и текущих идентификаторов не означают замену состава. Участники без сигнала остаются в общем знаменателе и видны отдельно. Порог кэша фиксирован: вычесть 20 п.п., ограничить снизу нулём. Детальные правила и ограничения находятся в методике.

Перед выпуском обновить производную публичную копию реестра и собрать методику python3 scripts/build_methodology.py. После публикации выполнить python3 tests/live-launch.py <адрес-закрытого-сайта> --quick; учётные данные подавать только в скрытый stdin. HTTP-контроль сравнивает байты выгрузок и сохранённую SQL версию. Браузерное взаимодействие требует отдельной поддерживаемой проверки и не считается проверенным по HTTP.

Отдельный модуль динамической аллокации — 0.10.0

Текущее правило не фиксирует 20 п.п. Порог tau и пара активов входят в паспорт сценария; нейтральный индикатор в таймлапсе не вычисляет веса. Новый расчёт аллокации 1.0.0 отделён от исходного исследования 1.3.0 и основного движка. Подготовить прежние финансовые входы и закреплённый breadth, затем выполнить:

python3 scripts/export_breadth_allocation.py
node tests/breadth-allocation.mjs
python3 tests/breadth-allocation.py
node tests/breadth-strategy-view.mjs
node tests/index-history-view.mjs
python3 tests/interface-contract.py

Выгрузка не обращается к сети и не меняет готовый D1. Проверяются источник, хеши, общая доступная история выбранной пары, известность сигнала до сделки, отложенное исполнение, дрейф долей, расходы, бенчмарки и детерминизм. Методика и точные команды независимого контроля находятся в docs/BREADTH_ALLOCATION_RU.md. Архивные результаты 20 п.п. не заменяются.

Контроль хронологии и представления 0.11.0

Для нового журнала 1.0.1 выполнить node tests/backtest-execution.mjs и node tests/backtest-causality.mjs. Второй тест проверяет неизменность прошлого при усечении входов и изменении будущих цен/сигналов, запрет исполнения на сигнальном закрытии, переход доходности между прежними и новыми позициями, пропуски и замену ожидающего приказа. Область и ограничения — docs/BACKTEST_CAUSALITY_RU.md.

Шрифты и выбранные контрастные пары проверяет python3 tests/typography.py. Для восстановления локальных шрифтов используются опубликованные WOFF и SIL OFL; повторная сборка из исходных TTF описана в docs/TYPOGRAPHY_RU.md. После сборки проверить опубликованные байты, данные и чистый расчёт через python3 tests/live-launch.py SITE_URL --quick с секретом только через скрытый stdin. Проверка статических файлов и HTTP не заменяет браузерную проверку визуального взаимодействия.

Мобильное представление 0.12.0

В дополнение к действующему контракту интерфейса выполнить node tests/mobile-shell.mjs, node tests/mobile-workspace.mjs и python3 tests/mobile-contract.py, затем проверки страницы аллокации, моделей и таймлапса. Финансовые входы и движки должны совпасть по SHA-256 с принятым выпуском. В протоколе отделять DOM/статические тесты от проверки реального layout и экранной клавиатуры; матрица ручной проверки — docs/MOBILE_UX_RU.md.

Выпуск 0.5.1 — сборка и контроль

Финансовая база 0.5.1 собирается из принятой 0.5.0 и перечня исправлений. Сборка не обращается к сети, а исходник открывается только для чтения:

python3 -I scripts/build_financial_0_5_1.py work/financial-input-0.5.0.sqlite db/corrections-0.5.1.json control/evidence_0_5_1 work/financial-input-0.5.1.sqlite control/financial_0_5_1_build_report.json
python3 -I scripts/verify_financial_0_5_1.py work/financial-input-0.5.0.sqlite work/financial-input-0.5.1.sqlite db/corrections-0.5.1.json control/evidence_0_5_1 control/financial_0_5_1_verification.json
python3 scripts/prepare_synthetic_runtime.py            # мастер, манифест, пакеты, schema.ts (0.4.3 и 0.5.0 сохраняются); см. примечание о версии SQLite
python3 scripts/export_data.py work/financial-input-0.5.1.sqlite
python3 scripts/export_primary_review.py work/financial-input-0.5.1.sqlite
python3 scripts/refresh_index_history_provenance.py
python3 -I scripts/correct_market_breadth.py --before work/financial-input-0.5.0.sqlite --after work/financial-input-0.5.1.sqlite --corrections db/corrections-0.5.1.json
python3 scripts/export_breadth_allocation.py
node scripts/build_model_portfolios.mjs
python3 scripts/update_registry_0_5_1.py
python3 scripts/verify_database.py --available-inputs-only   # PASS_PARTIAL без базовой 0.4.3 и сырых входов моделей
python3 tests/prepare-staging-rehearsal.py && node tests/staging-rehearsal.mjs

Физический SHA-256 мастера зависит от версии библиотеки SQLite; логические хеши таблиц и пакетов от неё не зависят. Принятый мастер 0.5.1 собран SQLite 3.53.1, как и в выпуске 0.5.0: независимой реализацией master42.py из пакета SQL-склада (apsw 3.53.1.0), затем prepare_runtime_sql.generate() по этому мастеру. При сборке другой версией SQLite совпадут все таблицы и пакеты, но source_warehouse_sha256 и manifest_sha256 будут другими.

Ожидаемые хеши: 0.5.1 — d4a69da4…e96f, data_version f04fde3f…2b1f, манифест e3b149a1…3551. Полный порядок загрузки на сайт — docs/LAUNCH_RUNBOOK_0_5_1_RU.md.

Интерфейс PortfolioLab 0.6.0

Дата: 18.10.2026. Финансовый выпуск остаётся 0.5.0, движок — 0.5.0-rc.2, data_version — e43569f364946b14372157f5faff0dafafdb2a265929d6d278bc139e60ad83f1. Изменения этой редакции относятся к представлению и работе с портфелями. Зафиксированные SQLite, SQL namespace, входные наблюдения и формулы серверного расчёта не изменяются.

Разделы

Правила поведения

Расчёт выполняется на сервере только по запросу пользователя. Загрузка страницы, просмотр каталога, выбор примера и импорт настроек сами по себе не запускают бэктест. Лимиты остаются прежними: три портфеля, 20 разных инструментов с положительным весом, ограничения размера запроса и загружаемых рядов из серверного контракта.

Предварительное общее окно учитывает положительные веса всех портфелей и только границы first_date/last_date. Оно не сертифицирует дневную непрерывность и фактическую дату входа. Полная отдельная история SPY с 1993 года и MM_CBR с 1992 года не подменяет начало календаря основного конструктора 22.09.1997. Полные даты новых моделей получаются из SQL API и сверяются с data_version каталога.

Диаграмма состава рассчитывается из введённых долей; при неполном распределении свободная часть серая, а при сумме выше 100% визуальные сектора нормируются, при этом отображаемая сумма остаётся фактической и расчёт не допускается. Доля синтетических рядов считается по введённым весам, без подмены рыночных или справочных рядов моделями.

График просадки строится по серверному wealth_index с начальным максимумом 1, как в метрике движка. Внешние пополнения и изъятия не превращаются в искусственные провалы NAV. Доходность и показатели портфеля продолжают поступать от серверного расчёта.

Черновик v2 хранит введённые значения в localStorage, включая незавершённые веса. При восстановлении проверяются структура, пределы числа портфелей/строк и длины полей. Прежние настройки workspace v1 поддерживаются. Доступ к данным браузера может быть запрещён пользователем; в этом случае показывается возможность скачать настройки. Импорт ограничен 100 КБ, проходит проверку текущим движком и не исполняет содержимое файла. Замена примером, загрузка настроек, подготовка сравнений и удаление портфеля допускают отмену последней такой операции. Любое изменение параметров помечает предыдущий расчёт устаревшим и отключает его выгрузку.

Версия интерфейса отделена от версии движка: public/ui-version.json, UI_VERSION, query-параметры app.js/lab.css/workspace-tools.js согласованы. Кэширование новых файлов не привязано к неизменившейся версии финансового движка.

Контроль

node tests/workspace-tools.mjs проверяет классификацию, охват фильтров, поиск, ограничения истории, пересечение дат, долю моделей, просадки, CSV, повреждённые черновики и допуск учебных составов. python3 tests/interface-contract.py проверяет DOM идентификаторы, ссылки на поля, серверный расчёт и согласованность версий. node tests/launch-api.mjs проверяет финансовое API по зафиксированным данным. tests/live-launch.py сверяет опубликованные файлы и результаты серверных расчётов, включая два сравнения из новой страницы моделей.

Браузерная визуальная и интерактивная проверка не выполнялась: доступный набор инструментов не предоставляет control-browser. Статические проверки и проверки функций не заменяют браузерную приёмку. Публичная нагрузочная способность новой редакцией не сертифицируется. Доступ сайта остаётся прежним.

Пять рублёвых модельных портфелей: интерфейс 0.8.0, составы 1.1.0

Дата редакции: 19.10.2026. Финансовый выпуск 0.5.0, движок 0.5.0-rc.2, срез по 16.10.2026 сохранены. Конфигурация: db/model-portfolios.json. Паспорт: public/model-portfolios/report.json. Предыдущая редакция десяти моделей сохранена в docs/archive/MODEL_PORTFOLIOS_1_0_0_RU.md; она не является текущей витриной.

Пять задач и пять составов

ЗадачаМодельЦелевые весаПредлагаемый ориентир
РезервДенежный рынок ЦБMM_CBR 100%MM_RUONIA
Консервативный профиль20/80SBMX 20%, SBGB 80%SBGB
Сбалансированный профиль60/40SBMX 60%, SBGB 40%SBMX/SBGB 60/40
Рост80/20SBMX 80%, SBGB 20%SBMX
ДиверсификацияПостоянный RUSBMX, SBGB, GOLD_RUB, MM_CBR по 25%SBMX/SBGB 60/40

По прямому указанию пользователя из модельной подборки исключены NASDAQ/QQQ и S&P 500/SPY, включая модели с частичной американской позицией и соответствующие бенчмарки. Подборка сокращена до пяти составов; модель 40/60 и авторская всепогодная схема также сняты с текущей витрины. Исходные ряды остаются самостоятельными инструментами каталога. Учебные сравнения американских рядов не выводятся среди готовых портфельных примеров.

Пять бенчмарков: SBMX, SBMX/SBGB 60/40, SBGB, MM_CBR, MM_RUONIA. Они рассчитываются как условные портфели с теми же комиссиями и ребалансировкой. Это не опубликованные индексы без расходов. Классический 60/40 совпадает со своим составным ориентиром по определению.

Доли 20/80, 60/40 и 80/20 используют распространённую схему фиксированного распределения акций и облигаций, представленную в линейке Vanguard. Постоянный RU — локальная адаптация четырёх равных блоков: широкий фонд ОФЗ заменяет длинные государственные облигации, золото оценивается по ЦБ без спреда и хранения, денежный рынок теоретический. Первичные ссылки и границы применимости сохранены в sources JSON-паспорта. Количественный рейтинг популярности и подгонка весов по доходности не проводились.

Расчёт и показатели

Полное общее окно: 25.01.2019–16.10.2026, 1 942 оценки. Раннее окно: 25.01.2019–30.12.2021, 742 оценки. Позднее: 03.01.2022–16.10.2026, 1 200 оценок. Все десять составов (пять моделей плюс пять ориентиров) внутри окна используют одинаковые даты.

Начальный капитал 1 000 000 ₽, внешние потоки 0, ежемесячная ребалансировка, расходы 10 б.п. (0,10%) с фактического оборота, включая начальное размещение. Неторгуемые оценки биржевого фонда не позволяют совершить сделку; ребалансировка переносится. Максимальный возраст оценки 35 дней, пропуски не заполняются. Налоги и плечо отсутствуют; внутренние расходы фонда уже включены в пай.

CAGR — геометрическая годовая доходность по TWR и календарным годам. Волатильность — выборочное стандартное отклонение дневных доходностей × √252. Просадка измеряется по TWR относительно предшествующего дневного максимума с начальной базой 1. Начальная комиссия даёт денежной модели небольшую отрицательную просадку.

В основной таблице Sharpe и Sortino используют дневную разность доходности портфеля и MM_CBR с теми же параметрами исполнения. Sharpe = среднее разностей / выборочное стандартное отклонение разностей × √252. Sortino = среднее разностей ×252 / √(252 × среднее квадратов отрицательных разностей). При знаменателе не более 1e-12 коэффициент не определён. Модель ЦБ — альтернативный ориентир, не гарантированная безрисковая ставка. Коэффициенты движка со ставкой/целью 0 показаны отдельно в карточке.

Δ CAGR — разница годовой доходности с выбранным бенчмарком в процентных пунктах, не регрессионная альфа. Смена бенчмарка не изменяет денежную базу Sharpe/Sortino.

Исторические лидеры определяются только среди четырёх смешанных моделей; денежный резерв показан отдельно. Повторяющиеся лидеры объединены в одну карточку с перечислением критериев. Метка «Эффективный в наборе» исключает смешанные модели, для которых есть другая с не меньшим CAGR и не большей волатильностью, где хотя бы один критерий строго лучше. Это сравнение фиксированных кандидатов, не глобальная оптимизация. Окна периодов показывают чувствительность к истории и не являются независимым тестом вне выборки.

Контроль и интерфейс

Витрина проверяет data_version/engine_version против каталога. Отображение не запускает бэктест. До двух моделей плюс бенчмарк переносятся в конструктор вместе с точными датами и параметрами; замена допускает отмену. Серверный расчёт запускается отдельным действием пользователя. Месячные точки графика не заменяют дневной расчёт риска.

Паспорт содержит настройки, все 30 сценариев трёх окон, годовые показатели, ограничения, кривые и SHA-256 входов и расчётного кода. Метрики воспроизводятся scripts/build_model_portfolios.mjs действующим JS-движком, а tests/model-portfolios.py независимо пересчитывает 30 дневных сценариев через Python/SQLite. Двойная сборка проверяет детерминированность. tests/model-portfolios-view.mjs проверяет импорт, лимиты, отсутствие американских рядов в моделях и порядок риска. tests/live-launch.py сравнивает опубликованные файлы и модельные серверные результаты на полной и поздней истории.

Исторические правила выплат фондов проверены не полностью, GOLD_RUB — справочная цена, MM_CBR — синтетическая теоретическая модель. Эти статусы видны в составе и паспорте. Визуальная браузерная приёмка не выполнялась: доступного control-browser нет.

Структура сайта PortfolioLab 0.8.0

Дата редакции: 19.10.2026. Финансовый срез, данные портфельного движка и серверный протокол остаются прежними: выпуск 0.5.0, движок 0.5.0-rc.2. Новая структура объединяет восемь рабочих экранов в пять основных разделов.

Основной разделЧто внутриПользовательская задача
ОбзорТри входа: рынок, готовые модели, собственный портфельВыбрать действие без изучения устройства базы
Индекс МосбиржиМесячный таймлапс, IMOEX/MCFTR, веса и участники, входы/выходы, архив и CSVИсследовать историю индекса на дату
ПортфелиПять моделей, конструктор, результаты — связаны внутренними вкладкамиСравнить готовое распределение и воспроизвести собственное
ИнструментыОбщий каталог, синтетические модели, история денежного рынкаНайти ряд и понять его статус до использования
МетодикаБаза, индексный архив, паспорта моделей, покрытие и контрольПроверить источник, ограничение и воспроизводимость

Главная страница становится обзором; старые прямые ссылки #constructor, #catalog, #synthetic, #portfolios и #results поддерживаются. Новые адреса: #overview, #index и #methods. Основная навигация показывает текущую группу; внутренние вкладки показывают конкретный экран. Переход с клавиатуры переносит фокус в основное содержание. Сайдбар содержит отдельную короткую ссылку «Собрать портфель».

Текущая модельная подборка: денежный резерв, 20/80, 60/40, 80/20 и постоянный RU. Всего пять моделей и пять рублёвых бенчмарков. NASDAQ/QQQ и S&P 500/SPY исключены из моделей, их бенчмарков и готовых примеров. Каталог исходных инструментов сохраняет собственную классификацию. Дублирующиеся исторические лидеры объединены в карточку с перечислением критериев; денежная модель показана отдельно.

Таймлапс использует отдельную версионированную статическую выгрузку реального ретроспективного архива. Составы доступны с февраля 2001 по октябрь 2026, 309 кадров. Даты состава, весов и уровней индекса показываются раздельно. Недостающие веса не превращаются в нули, имена и ISIN обозначены как справочник на 18.10.2026. Исходная доступность публикаций в соответствующую историческую дату не сертифицирована. Этот архив не используется автоматически для бэктеста.

Воспроизведение запускается пользователем, доступна пауза, скорость, ручной слайдер и выбор месяца. При уходе из раздела и скрытии вкладки воспроизведение останавливается. Полный состав и месячный архив поддерживают поиск; выгрузки содержат отдельные исходные даты и идентификаторы. IMOEX — ценовой индекс, MCFTR — индекс полной доходности; график не заполняет отсутствующие ранние значения.

UI_VERSION, ui-version.json и query-параметры основных модулей и стилей согласованы на 0.8.0. Версия финансового движка не меняется. Визуальная браузерная приёмка не выполнялась: control-browser не предоставлен. Проверены структура интерфейса, независимые расчёты портфелей, полный экспорт архива, источники и чистые функции управления представлением.

Архив и таймлапс Индекса МосБиржи

Версия экспортера: 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 в публикацию не входит.

Даты, веса и идентичность

официальная сессия состава не позднее этой даты.

среза. Вес соединяется с составом по issue_id, а не по похожему названию. Это вес предыдущего закрытия, а не утверждение о весе на конец текущего дня.

округления сохранены. Веса двух участников неизвестны на предыдущем закрытии: RU0009046700 в срезе 01.10.2003 и URKA (RU0007661302) в срезе 01.11.2011. Они остаются null в JSON и пустыми ячейками CSV; доля не распределяется между другими акциями и не принимается равной нулю. Круговая диаграмма или показатель концентрации с полными весами не должны строиться для этих двух срезов.

технического журнала смен кодов. source_symbol — буквально код, который вернул архивный ответ ISS при загрузке. Они различаются в 582 наблюдениях; оба сохранены. issue_id — ключ выпуска (ISIN, а при его отсутствии отдельный SECID: ключ). Четыре ранних выпуска (BKBK, INUR, NKEL, UMAS) имеют только подтверждённый архивный код, без ISIN и полного названия: это самостоятельные SECID: ключи, а не догадки о современном правопреемнике. Обыкновенные и привилегированные акции, разные выпуски и юридические лица не объединяются по сходству имён. Преемственность при корпоративной реорганизации без достаточного подтверждения не создаётся.

Это подписи и идентификационные сведения справочника, а не доказанные названия компаний на каждую историческую дату. Полный исторический журнал изменений 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 и побайтово одинаковое повторное построение всех шести файлов в отдельном каталоге.

Для нового выпуска необходимы новый сохранённый вход, отдельная проверка изменений и обновление закреплённого хеша. Изменение даты в интерфейсе не продлевает источник. Контроль должен сохранять неизвестные значения и запрещать незаметную подмену исторического состава сегодняшними участниками.

Удобство PortfolioLab на телефоне

Правила интерфейса 0.12.0, редакция от 20.10.2026. Задача — дать пользователю телефона пройти основные сценарии без мелких элементов и поиска действий: выбрать раздел, задать портфель или правило, запустить расчёт и прочитать результат. Рыночные входы, финансовые формулы и правила исполнения этим изменением не обновляются.

Навигация и последовательность действий

На узком экране основные задачи доступны из нижней панели с текстовыми названиями. Остальные разделы открываются отдельной кнопкой меню. Полная навигация остаётся доступной, в том числе без успешной инициализации мобильного скрипта. Главное действие каждого экрана должно быть понятно по его названию; иконка не заменяет подпись.

Конструктор сохраняет порядок «период и капитал → инструменты и веса → расчёт → результат». Стратегия — «основной и защитный активы → порог → расчёт → сравнение → журнал». Дополнительные параметры разрешено сворачивать, сохраняя доступ к ним и их текущим значениям. Изменение настройки не должно запускать бэктест само по себе; прежний результат помечается устаревшим. Возврат к настройкам не должен стирать введённые данные.

Размеры, текст и формы

44 CSS px — единица веб-разметки; её не следует выдавать за 44 физических пикселя или автоматически приравнивать к Apple pt.

Узкий экран, графики и таблицы

Цель раскладки — обычный текст и формы в одной колонке при ширине 320 CSS px, без потери информации и функций. Таблица, которой для смысла нужны две координаты, может прокручиваться внутри своего контейнера. Это исключение не распространяется на окружающий текст или всю страницу.

В первую очередь пользователь видит краткие показатели с названиями и единицами. Подробные таблицы и полный журнал остаются доступны. Карточное представление строки должно сохранять связь каждого числа с названием столбца; нельзя скрывать важный показатель только ради компактности.

График должен давать прочитать выбранную дату и значения пальцем или клавиатурой: через нативный ползунок и кнопки соседних дат либо равноценное управление. Существенные данные нельзя показывать только при наведении. Уменьшать шрифт SVG до нечитаемого размера ради помещения полного исторического диапазона нельзя. Если графику нужна горизонтальная прокрутка, контейнер имеет понятную подпись и доступен с клавиатуры.

Фокус, движение и края экрана

Используются нативные ссылки, кнопки, поля, раскрываемые блоки и диалог меню. Фокус заметен, порядок клавиатурного перехода осмысленный. При отмене или закрытии меню фокус возвращается к вызвавшей его кнопке; при выборе локального раздела — к его содержимому; Escape и явная кнопка закрытия выполняют ожидаемое действие.

Фиксированная навигация не должна перекрывать поле, сообщение об ошибке или последнее действие страницы. Для устройств с вырезами и домашним индикатором используются env(safe-area-inset-*) вместе с обычными отступами. При открытии экранной клавиатуры интерфейс должен сохранять доступ к редактируемому полю; конкретное поведение проверяется в браузере.

Таймлапс запускается пользователем и имеет остановку. prefers-reduced-motion отключает необязательные анимации и плавные перемещения. Размер и оформление не должны меняться скачком при появлении статуса расчёта.

Контроль и воспроизведение

Из корня точного исходного commit выполнить:

node tests/mobile-shell.mjs
node tests/mobile-workspace.mjs
python3 tests/mobile-contract.py
python3 tests/typography.py
python3 tests/interface-contract.py
node tests/breadth-strategy-view.mjs
node tests/index-history-view.mjs
node tests/model-portfolios-view.mjs
node tests/workspace-tools.mjs

tests/mobile-contract.py формирует work/mobile/mobile-contract-validation.json: проверяет интеграцию мобильных ресурсов, разрешённое масштабирование, статические подписи нативных полей, доступность управления датой без наведения, объявления мобильных правил CSS и неизменность закреплённых финансовых файлов/шрифтов. Это дополнительный контракт интеграции; он не заменяет отдельные проверки расчётного кода или независимую проверку базы.

Протоколы выполнения остальных контролей сохраняются по их штатным путям. Для опубликованной версии используется ограниченная HTTP-приёмка python3 tests/live-launch.py SITE_URL --quick; она сверяет опубликованные ресурсы и результаты с локальными контролями. Успех HTTP не означает проверку раскладки.

Результаты публикуются по фактически выполненным протоколам. Пока управление браузером недоступно, не проверены реальный перенос при 320/360/390/430 CSS px, отсутствие перекрытий при повороте и экранной клавиатуре, фактические размеры зон нажатия, увеличение текста, VoiceOver/TalkBack и удобство прокрутки на устройстве. Нельзя заменять эти ограничения утверждением о полном соответствии WCAG или гарантированной работе на всех телефонах.

При доступном браузере ручная приёмка включает портретную и альбомную ориентации, увеличение текста до 200%, открытие/закрытие меню, ввод параметров с экранной клавиатуры, ошибку и повторный расчёт, управление датой графика, просмотр последней строки/записи журнала и скачивание. Проверять, что фокус и целевой элемент не закрываются панелями, а важные данные не обрезаются.

Первичные ориентиры

Ниже — источники требований и объяснений, проверенные 20.10.2026. Они не одобряют финансовую модель проекта. Структура навигации, порядок этапов и размер текста 16 px — решения проекта.

Причинность бэктеста и порядок модельного исполнения

Редакция от 20.10.2026 для интерфейса 0.11.0 и отдельного движка breadth-allocation-1.0.1. Рыночный срез заморожен на 16.10.2026. Документ дополняет docs/BREADTH_ALLOCATION_RU.md и описывает проверенную последовательность расчёта, единицы журнала и пределы проверки.

Результат и точный объём проверки

node tests/backtest-causality.mjs формирует протокол work/review/causality-audit.json. На проверенной редакции все 16 проверок имеют результат PASS; общий статус — PASS_WITH_DATA_LIMITATIONS, поле temporal_code_checks — PASS.

Это означает: в проверенных сценариях будущие допустимые наблюдения не меняют прошлые оценки, веса и исполнения; новые веса начинают получать доходность после модельного закрытия исполнения. Проверка не подтверждает строгую point-in-time доступность исходных данных и не доказывает возможность реального исполнения по расчётным уровням.

Проверяемая проекция — public/breadth-strategy/data.json:

ХарактеристикаЗафиксированное значение
Версия данных99f1e4afa8abbf45111499c8ae1da6fc935581ae242710f7d5f08aa3fd1b84b0
Физический SHA-256 входного JSONfcdfd39433cc5b0e440f4abec505294905fce8e3b9cb667ecfdb614cc3e4b3a4
Оценочный календарь2 965 сессий, 05.01.2015–16.10.2026
Доступные активы18
История месячного индикатора226 срезов; ранняя диагностика не означает портфельный бэктест с 2008 года
Начальный сценарий проверкиMCFTR / MM_CBR, порог 0 п.п., капитал 1 000 000 рублей, издержки 10 б.п. оборота
Исполнения начального сценария142 события модельной ребалансировки, включая первоначальное инвестирование

Финансовый выпуск 0.5.0, движок статического конструктора 0.5.0-rc.2, месячный архив 1.0.0 и принятое исследование breadth 1.3.0 сохраняют свои версии. Исходные данные и числовые результаты архивного сценария 1.3.0 с порогом 20 п.п. не переписываются. Проверка новой страницы не заменяет воспроизведение этого архива и не переносит его условия в новый движок.

Какой сигнал используется

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

Состав сигнала — исторические участники IMOEX независимо от выбранной пары инвестиционных активов. Положительная категория включает TRI выше либо равный SMA200; неизвестные сигналы остаются в общем знаменателе:

B = (above + equal) / total
tau = threshold_pp / 100
w_defensive = max(0, 1 - B - tau)
w_primary = 1 - w_defensive

Порог по умолчанию равен 0 п.п. Целевые веса — результат формулы для следующей ребалансировки. Между исполнениями фактические модельные веса изменяются вслед за уровнями активов и могут отличаться от целевых. Отсутствующий индикатор не заменяется нулевой шириной рынка.

Сохранённый вход содержит исторический состав на плановую дату исполнения, а TRI/SMA — на предыдущее закрытие. Доказательства того, что именно этот будущий вступающий в силу состав был опубликован к сигнальному закрытию, в полном объёме отсутствуют. Это отдельное ограничение знания состава на дату сигнала; неравенство дат его не устраняет.

После сигнала: когда и по какому уровню происходит операция

Правило движка — next_eligible_common_close, то есть первая допустимая общая дата закрытия после сигнала и не раньше плановой даты. На каждой дате порядок следующий:

  1. Переоценить прежние количества условных единиц текущими уровнями. Вся

доходность интервала до этого закрытия принадлежит прежним позициям.

  1. Выбрать последнее уже наступившее месячное решение с signal_date строго

раньше текущей даты.

  1. Проверить can_rebalance обоих выбранных активов, включая актив с

нулевым целевым весом. При отсутствии допуска любой стороны отложить всю ребалансировку.

  1. На допустимом закрытии рассчитать оборот обеих сторон, вычесть издержки и

установить новые количества условных единиц по точным уровням этой даты.

  1. Новые количества получают доходность следующего интервала.

Уровень сигнального закрытия не используется как уровень исполнения. Цена открытия следующей сессии и внутридневной момент сделки не моделируются. Входы и журнал содержат даты без времени суток; термин «закрытие» обозначает выбранную дневную расчётную отметку. Для индекса, синтетической модели и справочного ряда это условная экспозиция по разрешённому уровню.

Если общее исполнение отложено, прежние позиции продолжают действовать. Если до исполнения наступило новое месячное решение, оно заменяет ожидающее старое; отдельная задним числом исполненная операция по старому решению не создаётся. При старте пользовательского окна после плановой даты допускается последнее доступное месячное решение с сигнальной датой раньше фактического старта. Поэтому расстояние от плановой даты до начального исполнения не обязательно означает задержку уже открытого портфеля.

При пропуске оценки после первого наблюдения разрешено оценить открытую позицию последним прошлым уровнем. Такой перенос помечается valuation_carried и не разрешает исполнение. Первое будущее наблюдение не переносится назад для заполнения начальных пропусков. На всех допустимых исполнениях оба признака перенесённой оценки равны false.

input_age_days хранит переданный возраст исходного входа либо null. Он не является исходным временем публикации и сам по себе не доказывает ликвидность или исполнимость уровня. У синтетических и справочных рядов разрешённый уровень может опираться на ранее вступившее в силу значение.

Учёт капитала и издержек

Пусть L_P, L_D — уровни на закрытии исполнения, q_P, q_D — прежние условные количества, cash — ещё не инвестированный начальный капитал.

V_before = q_P * L_P + q_D * L_D + cash
T = abs(w_P * V_after - q_P * L_P)
  + abs(w_D * V_after - q_D * L_D)
cost = costBps / 10000 * T
V_after = V_before - cost
q_P_after = w_P * V_after / L_P
q_D_after = w_D * V_after / L_D

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

Единицы уровней: почему журнал не показывает цену пая в рублях

Журнал фиксирует точные значения series.levels из принятой проекции на дату исполнения. Масштаб ряда влияет на условное количество, но сам по себе не меняет доходность отношения уровней. Наименование исходного актива не меняет единицы опубликованного расчётного ряда.

АктивЕдиница *_level_unitЭкономический смысл
MCFTRindex_pointsПункты индекса полной доходности; индекс нельзя купить как пай. Дивиденды уже входят в ряд
Реальные БПИФ: SBMX, SBGB, LQDT, GOLD, TGLDnormalized_total_wealth_unitsНормированный уровень полной стоимости, созданный из истории фонда; это не исходная котировка в рублях за пай
MM_CBR и другие синтетические моделиnormalized_total_wealth_unitsРасчётные единицы модели. MM_CBR воспроизводит условное начисление по исторической ставке, а не реальную цену фонда
USD_RUB, EUR_RUB, CNY_RUB, GOLD_RUBnormalized_total_wealth_unitsНормированное представление официальных справочных значений Банка России, применённых по датам вступления в силу; это не исполнимая рыночная котировка

Поле *_execution_basis сохраняет политику исходного паспорта актива: hypothetical_at_observed_index_close, hypothetical_at_admitted_model_level, observed_tradable_fund_close либо hypothetical_at_effective_official_reference. Даже значение observed_tradable_fund_close описывает происхождение допуска фонда; в журнале используется нормированный уровень, а исходная котировка CLOSE в рублях за пай в этой проекции отсутствует. *_units_before и *_units_after — расчётные количества, а не число фактически купленных ценных бумаг.

Из нормированного уровня нельзя восстановить подтверждённую цену заявки, число лотов либо официальный аукционный fill. MOEX отдельно определяет официальную цену закрытия через LEGALCLOSEPRICE; последняя сделка может отличаться от неё. Поэтому дневной ряд нельзя автоматически описывать как гарантированное исполнение на аукционе закрытия. Спрос, предложение, очередь заявок, лотность, ликвидность, спред и внутридневное проскальзывание в этом движке не рассчитываются.

Контракт журнала и манифеста

Каждый элемент result.events — событие расчёта и исполнения месячной ребалансировки, включая первоначальное инвестирование; это не отдельный биржевой fill. Событие может иметь нулевой торговый оборот.

Поля событияСодержание
signal_date, planned_date, execution_dateСигнальное закрытие, плановая и фактическая модельная даты
execution_model, weights_effectivenext_eligible_common_close, after_execution_close
primary_symbol, defensive_symbolТочные коды выбранной пары
primary_level, defensive_levelТочные допущенные уровни на закрытии исполнения
primary_level_unit, defensive_level_unitЕдиницы уровней из таблицы выше
primary_execution_basis, defensive_execution_basisПолитики допуска активов из входных метаданных
primary_input_age_days, defensive_input_age_daysВозраст входа из проекции либо null; дата публикации не выводится из возраста
primary_valuation_carried, defensive_valuation_carriedПризнаки переноса оценки; на допустимом исполнении false
primary_units_before, defensive_units_before, primary_units_after, defensive_units_afterКоличества условных единиц до и после операции
primary_value_before, defensive_value_before, primary_value_after, defensive_value_afterСтоимость каждой позиции в рублях до и после операции
cash_before, cash_afterТехнический остаток начального капитала; после инвестирования равен нулю
breadth, primary_weight, defensive_weightСигнал и целевые веса на капитал после издержек
value_before, value_after, costОбщая стоимость до/после операции и удержанные издержки, рублей
traded_notional, turnoverСуммарный оборот обеих сторон в рублях и его доля в value_before
delay_daysКалендарная разница фактической и плановой дат, без предположения о числе торговых сессий

result.execution и manifest.execution также сохраняют:

execution_model = next_eligible_common_close
signal_timing = prior_closed_session
weights_effective = after_execution_close
return_interval_rule = pre_trade_holdings_earn_return_through_execution_close
source_timestamp_certification = false

Манифест сохраняет версию движка, версию данных, параметры и фактическое окно. run_sha256 идентифицирует канонические параметры и версии запуска; он не заменяет физические хеши данных, исходного кода и протокола контроля.

Что проверяют 16 тестов причинности

№Проверка
1Усечение всех будущих входов на шести датах сохраняет доступный прошлый префикс: дневные оценки, целевые и фактические веса, отметки, бенчмарки и события
2Допустимые изменения будущих уровней в 32 и 1/32 раза не меняют прошлые оценки и исполнения
3Независимость от будущих цен проверяется для всех 18 выбираемых активов в их общем окне
4Удаление будущих уровней и разрешений не меняет завершённый более ранний расчёт
5Изменение будущих breadth с согласованными счётчиками не меняет прошлые цели и доходность
6Удаление будущих сигналов сохраняет прошлый результат
7Ручной пример 100 → 200 → 400 подтверждает: сигнальная отметка не является исполнением; прежняя позиция получает доходность до закрытия исполнения, новая — следующий интервал
8Сигнальная дата в день планового исполнения или позже отклоняется
9Каждая сторона отдельно блокирует исполнение, в том числе при нулевом целевом весе
10Чередующиеся пропуски обеих сторон откладывают операцию до общей допустимой даты; будущая отметка не заполняет пропуск назад
11Начальный пропуск не заполняется первым будущим наблюдением
12Новый наступивший сигнал заменяет ожидающее старое решение без дополнительного прошлого исполнения
13Все 142 исполнения начального сценария проходят строго после сигнала на первой общей допустимой дате
14В статическом конструкторе календарная ребалансировка происходит после доходности прежних позиций; сигнал breadth в нём не применяется
15Будущие котировки не меняют прошлый результат статического конструктора
16Происхождение данных явно сохраняет отсутствие строгой point-in-time сертификации

Даты усечения первого теста: 30.06.2016, 30.12.2019, 24.03.2022, 25.03.2022, 30.09.2024 и 30.09.2026. Сравнивается весь доступный общий префикс; если на конечной дате отсутствует исходная отметка одной стороны, фактическое окно корректно заканчивается раньше.

Проверки статического конструктора выполнены без внешних денежных потоков. Его расписание подтверждённых концов месяцев строится по полному известному календарю; исторические версии публикации торгового календаря не проверены. Валидация всего входа включает будущие записи: некорректная будущая запись может отклонить запуск. Независимость числового прошлого проверена для допустимых изменений будущих данных.

Ограничения исходных данных и допустимый вывод

Строгий point-in-time означает использование именно тех сведений и версий, которые были доступны участнику в соответствующий исторический момент. Порядок вычислений и проверка этой доступности — отдельные задачи.

В текущем срезе остаются открытыми:

пересмотров, включая ретроспективные корпоративные корректировки;

сигнальное закрытие;

винтажа исторической идентичности в 37 месяцах. Точные наборы выпусков согласованы для 223 из 226 месячных срезов; принятый индикатор не менялся;

и вся история корпоративных действий отдельно не сертифицированы;

отсутствие симуляции реальных заявок, открытия, ликвидности и проскальзывания.

Протокол не является полным повторным построением исходных архивов, визуальным или браузерным аудитом либо подтверждением фактической торговли. Результат бэктеста остаётся гипотетическим. Перебор порогов является анализом чувствительности на истории, а не доказательством будущей оптимальности.

Корректная краткая формулировка результата:

> В проверенной последовательности расчёта использование будущих наблюдений > для прошлых оценок и исполнения не обнаружено. Строгая историческая > доступность всех исходных данных не подтверждена. Операции моделируются по > допущенным дневным расчётным уровням, а не по подтверждённым ценам реальных > биржевых сделок.

Воспроизведение и сохранение результата

Выполнить из корня репозитория с закреплёнными входами и соответствующей редакцией кода:

node tests/backtest-causality.mjs

Сохранить протокол work/review/causality-audit.json вместе с точным commit, параметрами запуска, версией данных и хешами. Протокол фиксирует физический хеш входного JSON и хеши динамического движка, статического движка и теста. Каталог work/ является рабочим: его файл следует включить в постоянный контрольный комплект, а не считать сам каталог резервной копией.

Для восстановления исходников руководствоваться docs/PROJECT_CONTINUITY_RU.md и docs/PROJECT_DATA_REGISTRY_RU.md. Не загружать источники заново под видом того же винтажа и не заменять принятые хеши для устранения сбоя теста. Для воспроизведения конкретного пользовательского расчёта нужны тот же JSON, код, манифест параметров и фактическое окно. Новый рыночный срез или изменение правил требуют отдельной версии и нового протокола.

Первичные отраслевые источники

Эти материалы поддерживают определения и принципы проверки; они не сертифицируют формулу PortfolioLab и не означают соответствие GIPS.

  1. Московская биржа — индекс MCFTR и полная доходность.

Полная доходность включает изменение стоимости составляющих и реинвестирование дивидендов. Повторное добавление дивидендов к MCFTR недопустимо в принятом расчёте.

  1. Московская биржа — ценовые показатели фондового рынка.

Официальная цена закрытия публикуется как LEGALCLOSEPRICE; её следует отличать от иных дневных показателей.

  1. Московская биржа — технология аукциона закрытия, PDF.

На страницах 5 и 8 документа разобраны возможное различие последней сделки и официальной цены закрытия и исполнение заявки MOC на аукционе. Эти описания не подтверждают участие модельного портфеля в аукционе; текущее расписание не переносится автоматически на всю историю.

  1. CFA Institute — Backtesting & Simulation.

Бэктест приближает реальный инвестиционный процесс: правила, построение портфеля, ребалансировка, последующий результат. Отдельно учитываются look-ahead bias и survivorship bias.

  1. CFA Institute Research Foundation — Investment Model Validation: A Guide for Practitioners, Joseph Simonian, 2024, PDF.

Страницы PDF 18–19 описывают исторический состав инвестиционной вселенной и использование только доступной тогда информации; страница 54 — документацию для воспроизведения данных, тестов, метрик и решений.

Шрифты и графические обозначения PortfolioLab

Шрифтовая система 0.11.0, используемая интерфейсом 0.12.0. Проверка и фиксация: 20 октября 2026 года.

Гарнитура и реальные начертания

Основной шрифт интерфейса и числовых данных — Portfolio Sans, локальный WOFF-поднабор Noto Sans 2.015. Имя изменено после преобразования и сокращения набора символов. Исходные авторские права и SIL Open Font License 1.1 сохранены в public/fonts/OFL.txt и метаданных файлов. Пользовательский браузер загружает шрифт с самого сайта; запросы к Google Fonts не нужны.

Публикуются два настоящих статических начертания: Regular 400 и Bold 700. В доступном локальном дистрибутиве не было Medium 500, Semibold 600 или вариативного файла. Поэтому в новой типографической шкале используются 400 и 700. CSS font-synthesis: none запрещает искусственное утолщение и наклон. Промежуточные числовые веса нельзя описывать как встроенные начертания. Явное курсивное начертание в этом выпуске не поставляется.

Оба файла содержат полную русскую азбуку, Ё/ё, латинские буквы, знак рубля ₽, проценты, математический минус −, τ и основные знаки сравнения. Это проверяется по фактической таблице Unicode cmap каждого опубликованного WOFF, а не по названию гарнитуры. По умолчанию десятичные цифры имеют одинаковую ширину 572 единицы при 1000 единицах на em в обоих начертаниях. Для числовых значений включено lining-nums tabular-nums.

Встроенный источник не содержит часть технических стрелок и математические ≤/≥. Для них действует системная цепочка fallback. Такая цепочка также сохранит читаемость текста при задержке загрузки WOFF: system-ui, Apple system, Segoe UI, Arial, sans-serif. Знак рубля и русские буквы от fallback не зависят при успешной загрузке локального шрифта.

WOFF выбран потому, что в среде сборки нет Brotli-модуля, необходимого fontTools для WOFF2. Подмена расширения не выполняется: сигнатура, декодирование и формат реального файла проверяются. Два WOFF весят около 265 КиБ суммарно. Подробные размеры и контрольные суммы — public/fonts/manifest.json.

Правила применения

Общие объявления размещены в public/design-system.css; страницы конструктора, стратегии, денежного рынка и расчётных рядов подключают его до своих уточняющих стилей. Для интерфейса используется var(--font-ui), для метрик и таблиц — var(--font-data), для кода — var(--font-code).

ЭлементПравило
Основной текст16 CSS px, межстрочный интервал около 1.5–1.65
Поля, кнопки и значимые подписиНе менее 14 CSS px; интерактивная область обычно от 44 px
Дополнительные подписиОбычно 13 CSS px; не скрывать существенные ограничения в мелком тексте
Подписи диаграмм12–13 px после масштабирования, обычный вес 400
Заголовки и ключевые метрикиНастоящий Bold 700; числовые колонки — табличные цифры
Синтетические рядыЯвная текстовая метка «Синтетический» вместе с цветовым обозначением

Размер текста внутри SVG viewBox не равен гарантированному экранному размеру. Узкие экраны должны получать горизонтальную прокрутку и минимальную ширину полотна, рассчитанную по исходному viewBox, либо переразметку диаграммы. Простого width:100% недостаточно: при сжатии всего SVG уменьшаются и подписи. Класс .chart-scroll — общий вспомогательный контейнер; конкретные диаграммы задают подходящую минимальную ширину отдельно.

Цветовые роли общие для страниц: зелёный — стратегия/основной ряд, синий — бенчмарк, охра — защитный актив, фиолетовый — синтетический ряд или дополнительная серия. Линии должны иметь подписи и, где возможно, отличаться штриховкой. Один цвет не заменяет текстовую легенду.

Контраст и границы проверки

Для обычного текста использован порог 4.5:1, для значимых линий диаграмм, границ полей и индикатора фокуса — 3:1 относительно проверяемого соседнего фона. Основание: W3C, Understanding SC 1.4.3: Contrast (Minimum) и Understanding SC 1.4.11: Non-text Contrast, проверены 20.10.2026. Контраст сравнивается с порогом до округления результата.

tests/typography.py независимо вычисляет относительную яркость sRGB для фактических цветовых токенов и проверяет перечисленные текстовые и графические пары. Это проверка выбранных пар, а не заявление о полном соответствии сайта WCAG. Декоративные разделители не используются вместо существенных границ полей. Пользовательский фокус отображается отдельной контрастной обводкой.

В текущей среде не было доступно управление браузером. Скриншоты, фактически вычисленные браузером стили, переносы при увеличении масштаба, поведение клавиатуры и реальный экранный размер SVG-подписей в браузере не проверены. До такого просмотра эти пункты остаются ограничением проверки, даже если статические тесты проходят.

Воспроизведение и контроль

  1. Из корня проекта запустить python tests/typography.py. Он декодирует оба опубликованных WOFF, повторно собирает и открывает OpenType, проверяет кириллицу/₽/цифры, настоящие веса и равную ширину цифр, лицензию, контрольные суммы, локальные пути шрифтов и подключение общего CSS на страницах конструктора, стратегии, денежного рынка и расчётных рядов. CSS дополнительно проверяется на отсутствие зависимостей Google Fonts.
  2. Проверить work/review/typography-validation.json: там перечислены реальные файлы, размеры, веса, результаты декодирования и проверенные контрастные пары. Отчёт явно отделяет выполненные проверки от ограничений.
  3. Для пересборки самих шрифтов использовать python public/fonts/build-fonts.py --source-dir /путь/к/исходным/TTF. Нужны fontTools и два исходных Noto Sans 2.015 TTF с SHA-256 из public/fonts/manifest.json. Скрипт отклоняет другой источник, сохраняет авторские и лицензионные метаданные, формирует тот же набор Unicode, меняет имя производного шрифта и обновляет манифест. Сеть и установка пакетов не используются.
  4. В первоначальной сборке исходники находились в локальном LibreOffice: /opt/codex/runtimes/codex-primary-runtime/dependencies/native/libreoffice-headless/libreoffice/share/fonts/truetype/. Сами опубликованные WOFF и лицензия включены в проект, поэтому работа сайта не зависит от этого пути.

Изменение шрифтов и визуальных токенов не меняет финансовые ряды, формулы доходности, порог стратегии или правила исполнения сделок.

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 этим запуском не пересобирается. Принятые исходники и результаты остаются неизменными; журналы нового запуска хранятся отдельно.

Динамическая аллокация по ширине рынка

Методика отдельного модуля PortfolioLab, версия движка 1.0.1 от 20.10.2026 (формат входов 1.0.0). Рыночный срез — 16.10.2026. Начальный сценарий: основной актив MCFTR, защитный актив MM_CBR, порог 0 п.п., капитал 1 000 000 рублей, торговые издержки 10 б.п. на каждую сторону оборота. Это описание гипотетического расчёта, а не фактической доходности управляемого портфеля.

Назначение и границы

Модуль преобразует месячный индикатор ширины рынка в переменные веса двух выбранных активов. Пользователь задаёт порог, основной и защитный активы, период, начальный капитал и ставку торговых издержек; затем явно запускает расчёт. Изменение настройки не изменяет исходный индикатор и не переписывает прежние результаты исследования.

Индикатор — характеристика участия бумаг в тренде; динамическая аллокация — правило распределения капитала по этому индикатору. Обозначение «тактическая аллокация» употребляется для перераспределения между классами активов по сигналам. Здесь точнее название «динамическая аллокация»: отдельная постоянная стратегическая пропорция не задана, а веса могут изменяться от 0 до 100%.

Формула распределения, порог по умолчанию, правило равенства и обработка неизвестных сигналов — решения проекта. Ссылки на отраслевые материалы подтверждают терминологию и принципы раскрытия результатов, а не сертифицируют эту конкретную стратегию. Заявления о соответствии GIPS, IFRS или иному стандарту расчёта доходности не делаются.

Термины

ТерминЗначение в модуле
Ширина рынка / Market breadthДоля исторических участников IMOEX, у которых поддержанный индекс полной доходности не ниже SMA200
TRI / индекс полной доходностиРасчётный ряд, учитывающий доход от распределений по правилам источника; для сигнала используются валовые дивиденды
SMA200Простое среднее 200 подряд подтверждённых уровней TRI
Основной активЭкспозиция, доля которой увеличивается при росте breadth; по умолчанию MCFTR
Защитный активЭкспозиция, доля которой увеличивается при снижении breadth; по умолчанию синтетическая MM_CBR
Порог защитной аллокацииВычитаемый сдвиг в процентных пунктах; не бинарный сигнал полного переключения
Целевой весВес, рассчитанный из индикатора и порога для предстоящей ребалансировки
Фактический модельный весДоля оценённой позиции после исполнения и последующего изменения цен
Гипотетический бэктестРетроспективное применение модели к сохранённым историческим данным
Анализ чувствительностиСопоставление заранее заданных порогов на одном наборе активов, данных и дат

Защитный актив не обязательно обладает меньшим риском в каждом периоде. Золото имеет ценовой риск, валютная экспозиция — риск курса относительно рубля, облигационный фонд — процентный и кредитный риск. Слово «защитный» обозначает роль в модели, а не гарантию сохранности капитала. Эти активы нельзя автоматически объединять термином «кэш». IAS 7 определяет эквиваленты денежных средств через высокую ликвидность, конвертируемость в известную сумму и незначительный риск изменения стоимости; эта бухгалтерская классификация не присваивается всем вариантам модуля.

Индикатор и историческая вселенная

Вселенная сигнала остаётся историческим составом Индекса МосБиржи независимо от выбранных инвестиционных активов. Замена MCFTR фондом, золотом или другой допустимой экспозицией не пересчитывает breadth по составу выбранного фонда.

Одна ценная бумага / класс акций имеет один голос. Обыкновенная и привилегированная акции учитываются отдельно. Веса индекса и капитализация не используются. Для каждой бумаги рассчитываются TRI и SMA200 по 200 подряд поддержанным наблюдениям; разрыв поддержки прерывает непрерывность. Равенство TRI и SMA200 включается в положительную категорию.

N = above + equal + below + unknown
B = (above + equal) / N
U = (below + unknown) / N = 1 - B

unknown включает неподдержанную полную доходность, недостаточную непрерывную историю или отсутствие фактической сигнальной котировки. Такие бумаги остаются в общем знаменателе, но не объявляются находящимися ниже SMA200. График показывает категории отдельно. Полностью отсутствующий месячный индикатор — null; его нельзя заменять нулём, переносить из будущего или трактовать как полный выход из основного актива.

Сигналы берутся из принятого исследования 1.3.0 без изменения его числовых результатов. Полная диагностика содержит 226 месяцев за январь 2008 — октябрь 2026 и 9 413 строк участников. Это месячные срезы, а не ежедневно обновляемая ширина рынка. Отдельный модуль расчёта использует опубликованную историю активов начиная с 2015 года; ранняя диагностика не означает наличие бэктеста с 2008 года.

Календарная метка месяца, сигнальная дата и дата исполнения различаются. В праздники последний сигнальный день перед первой рыночной сессией месяца может лежать уже после первого календарного дня месяца. Поэтому индикатор не объявляется известным в 00:00 календарной даты кадра. Сохранённые ограничения исторической идентичности и доступности публикаций действуют и здесь: три месяца июня — августа 2011 года не имеют принудительного сопоставления MTSS с MTSI-002D; в 37 месяцах сохранены различия поколений ISIN. Подробности — в методике индикатора.

Параметр распределения

tau_pp = пользовательский порог от 0 до 100 п.п.
tau = tau_pp / 100
defensive_weight = max(0, 1 - B - tau)
primary_weight = 1 - defensive_weight

Начальное значение tau_pp равно 0. При допустимых входах оба веса лежат между 0 и 1, их сумма равна 1; плеча и коротких позиций нет. Увеличение порога уменьшает защитную долю. При пороге 100 п.п. модель остаётся полностью в основном активе. При пороге 20 п.п. из дополнения breadth вычитаются ровно 20 процентных пунктов; это не умножение на 0,8 и не правило «если breadth пересёк 20%, перевести всё».

Капитал допускается от 1 до 1 трлн рублей; ставка торговых издержек — от 0 до 500 б.п. Даты задаются в формате YYYY-MM-DD, начало должно предшествовать концу. Неподдерживаемые значения не округляются молча до допустимых границ: расчёт возвращает ошибку валидации.

Ширина рынкаПорогОсновной активЗащитный актив
27,27%0 п.п.27,27%72,73%
27,27%20 п.п.47,27%52,73%
27,27%80 п.п.100,00%0,00%
100,00%0 п.п.100,00%0,00%

Это иллюстрация формулы, не рекомендация порога. На сохранённом октябрьском сигнале 2026 года: 44 бумаги, 12 выше SMA200, 0 равны, 31 ниже, 1 без сигнала; B = 12 / 44. Дата сигнала — 30.09.2026, плановое исполнение — 01.10.2026. Результат не является новым сигналом на дату открытия страницы.

Активы и их идентичность

Начальный основной актив — MCFTR, Индекс МосБиржи полной доходности «брутто», валюта расчёта RUB. Индекс не является покупаемым паем. Дивиденды уже включены в его уровни и повторно не начисляются.

Начальный защитный актив — MM_CBR, синтетическая модель денежного рынка по исторической ставке Банка России. Процент начисляется по календарным дням ACT/ACT, включая выходные; соответствующее накопление уже входит в уровни между оценочными сессиями. Расходы и tracking error реального фонда, налоги и доходность конкретного продукта эта модель не воспроизводит.

Выбор ограничен опубликованным допустимым набором со своей историей уровней и разрешением ребалансировки. Варианты имеют отдельные признаки: индекс, синтетическая модель, реальный фонд или справочный ряд. Одинаковое экономическое назначение не делает разные коды одним инструментом. Синтетическое продление истории не выдаётся за котировки фонда до его появления.

В версии 1.0.0 опубликовано 18 вариантов. Все могут занимать роль основного или защитного актива; роль не меняет свойства ряда.

КатегорияКоды
Индекс полной доходностиMCFTR
Синтетические модели российского денежного рынкаMM_CBR, MM_RUONIA, MM_RUSFAR
Синтетические модели фондов акций и облигацийIMOEX_FUND_PROXY, OFZ_FUND_PROXY, CORP_FUND_PROXY
Реальные БПИФSBMX, SBGB, LQDT, GOLD, TGLD
Синтетический долларовый денежный рынок в рубляхUSD_MM_RUB
Синтетическая валютная корзинаFX_BASKET_RUB
Учётная цена золота Банка РоссииGOLD_RUB
Официальные валютные курсы Банка РоссииUSD_RUB, EUR_RUB, CNY_RUB

Долларовый денежный ряд сочетает накопление SOFR и USD/RUB; используется индекс предыдущей американской даты. Валютная корзина содержит USD, EUR и CNY по трети капитала с внутренней месячной ребалансировкой и без процентов на валюты. Для справочного золота не моделируется хранение, для валютных курсов — процентный доход. Такие свойства не заменяются свойствами MM_CBR. Для реальных фондов принята накопительная интерпретация опубликованной цены; отсутствие выплат и все корпоративные действия за полную историю отдельно не сертифицированы.

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

Календарь, оценка и исполнение

Расчёт идёт по российскому календарю оценки опубликованного финансового среза. Окно ограничено пересечением истории выбранной пары. Начало переносится вперёд до первой общей даты, на которой разрешена ребалансировка обоих активов и доступен предшествующий месячный сигнал. Конец не превышает общее покрытие. Запрошенное и фактически использованное окно сохраняются раздельно; отсутствующая ранняя история не достраивается.

На старте выбирается последнее месячное решение с плановой датой исполнения не позже текущей даты и с сигнальной датой строго раньше неё. Затем решения следуют сохранённому месячному расписанию. На каждой оценочной дате порядок операций такой:

  1. Оценить уже существующие позиции текущими уровнями.
  2. Определить ожидающее месячное решение и возможность исполнения обоих активов.
  3. После закрытия исполнить целевые веса, удержать издержки и определить новые условные количества единиц.
  4. Следующий интервал доходности начислять на новые позиции.

Новый целевой вес не получает доходность периода до исполнения. Если исполнения нет, позиции продолжают действовать и их веса дрейфуют вслед за ценами. При недоступности текущего уровня уже открытая позиция оценивается последним известным прошлым уровнем только для оценки; такая перенесённая оценка не разрешает сделку. Это относится и к ранее перенесённым ненулевым значениям из исходной базы: поле valuation_carried отдельно отмечает перенесённую оценку без разрешения исполнения, а input_age_days сохраняет возраст исходного значения. Возраст справочного курса или условного синтетического входа не равнозначен разрешению реальной биржевой сделки.

Для ребалансировки нужны разрешения can_rebalance обоих активов на текущую дату, даже если целевой вес одного из них равен нулю. Приостановленный приказ сохраняет исходный сигнал до доступного общего дня; если раньше поступило новое месячное решение, оно заменяет ожидающее. Журнал исполнений содержит сигнал, который фактически был использован; неисполненный прежний сигнал не объявляется сделкой. Это правило нового модуля, а не незаметное изменение архивного исследования.

Реальные фонды исполняются только на допустимом текущем наблюдении. Индексные и синтетические варианты используют отдельно оговорённую условную модель исполнения. Прошлый уровень нельзя взять для сделки только потому, что он используется для оценки. Пропуски и переносы показываются в контрольных полях, а не скрываются удалением дат.

Уровни исполнения и аудит хронологии 1.0.1

Сделка моделируется по точным уровням series.levels на закрытии первой допустимой общей сессии после сигнала и не раньше плановой даты: next_eligible_common_close. Старые позиции получают доходность до этого закрытия; новые веса действуют после него. Месячный сигнал — не внутридневное срабатывание порога. Открытие следующего дня и время суток не моделируются.

Все ряды расчётные: MCFTR выражен в пунктах индекса, ряды фондов и синтетические экспозиции — в нормированных единицах полной стоимости. Их нельзя подписывать как фактическую цену пая в рублях. Для фондов исходный дневной CLOSE не доказывает исполнение на аукционе закрытия; официальная цена LEGALCLOSEPRICE — отдельное поле. Справочные валютные курсы и учётное золото ЦБ не являются исполнимыми рыночными котировками.

Журнал раскрывает signal_date, planned_date, execution_date, точные primary_level / defensive_level, единицы *_level_unit, основания *_execution_basis, возраст входов, условные количества и стоимости до/после операции, оборот и расходы. Манифест результата сохраняет эту конвенцию. Патч 1.0.1 добавляет доказательные поля; прежние экономические результаты сохранены.

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

Подробная проверка, единицы и оговорки: Причинность бэктеста и модельное исполнение. При последующих изменениях запускать node tests/backtest-causality.mjs и node tests/backtest-execution.mjs. Нельзя заменять этот вывод фразой «подглядывание полностью исключено».

Издержки и самофинансирование

Пользователь задаёт общую ставку издержек cost_bps; начальное значение — 10 базисных пунктов, то есть 0,10% от каждого покупаемого или продаваемого рубля. Это единая сценарная оценка торговых трений, а не наблюдённый исторический спред или тариф брокера. Внутренние расходы, уже отражённые в опубликованных уровнях фонда, повторно не вычитаются.

Стоимость портфеля после сделки определяется с учётом того, что издержки уменьшают капитал, который распределяется по целевым весам:

c = cost_bps / 10000
T = abs(wP * V_after - oldP) + abs(wD * V_after - oldD)
V_after = V_before - c * T
newP = wP * V_after
newD = wD * V_after

Уравнение решается численно; дополнительное финансирование извне не вносится. Первоначальный капитал до входа считается неинвестированным; обе покупки входят в оборот. При начальном входе V_after = V_before / (1 + c). При переходе между активами продажа одной позиции и покупка другой учитываются обе. Оборот в отчёте — валовой двухсторонний: сумма T / V_before, без деления на два. Сумма издержек выражается в рублях.

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

Этот режим отличается от архивного исследования 1.3.0: там 10 б.п. применялись к абсолютному обороту только MCFTR, а денежная часть считалась без собственной торговой стороны. Совпадение пары и порога 20 п.п. не обязывает новый бэктест побайтно повторять старый результат.

Бенчмарки и сопоставимость

Стратегия сравнивается с двумя сценариями «купить и держать»: 100% выбранного основного и 100% выбранного защитного актива. Они имеют одинаковые с моделью начальный капитал, фактическое окно оценки и ставку первоначальных издержек. Периодических сделок у этих бенчмарков нет; финальная ликвидация также не моделируется. Это помогает отделить эффект выбора защитного актива от эффекта динамического распределения.

Все значения должны сравниваться на одной шкале капитала и общих датах. Период с 2015 года не приписывается фонду с более короткой историей. Бенчмарк является модельным расчётом, а не доказательством возможности купить сам индекс. NASDAQ / S&P 500 не включаются в эту базовую рублёвую концепцию и пять модельных портфелей сайта.

Метрики

МетрикаПравило
Итоговая стоимостьОценённая стоимость последней даты, после понесённых издержек, без финального выхода
Совокупная доходностьПоследняя стоимость / начальный внесённый капитал − 1
CAGR(final / initial) ^ (365.2425 / calendar_days) − 1 при положительной длительности
Годовая волатильностьВыборочное стандартное отклонение дневных доходностей × sqrt(252)
Максимальная просадкаМинимальное отношение стоимости к предшествующему максимуму минус 1; начальный капитал включается в максимум
Коэффициент ШарпаСредняя арифметическая дневная избыточная доходность над MM_CBR / её выборочное стандартное отклонение × sqrt(252)
ИздержкиСумма фактически удержанных модельных расходов, рубли
Валовой оборотСумма двухстороннего торгового номинала / стоимости перед соответствующей сделкой
Средняя доля основного / защитного активаПростое среднее фактических модельных весов по оценочным сессиям; не среднее целевых весов и не календарное взвешивание

Для Шарпа используется MM_CBR на тех же интервалах даже при выборе другого защитного актива; смена защитного актива не меняет базу сравнения избыточной доходности. При менее чем двух дневных доходностях показатель стандартного отклонения остаётся null; для Шарпа также применяется численный порог знаменателя 1e-15, поэтому практически нулевое отклонение не даёт бесконечность. Шкала 252 — соглашение годового пересчёта оценочных доходностей; CAGR использует фактические календарные дни. Сохранённая стоимость на день ребалансировки включает её издержки. Волатильность и Шарп используют изменения между последовательными оценёнными закрытиями, поэтому начальная комиссия до первой сохранённой стоимости не является отдельной дневной доходностью для этих двух метрик. Совокупная доходность, CAGR и просадка учитывают её через сравнение с исходным внесённым капиталом.

Графики и анализ чувствительности

Страница раздельно показывает исходный breadth, целевые веса выбранной пары, капитал и просадку стратегии с бенчмарками. Месячный ползунок и воспроизведение синхронизируют сигнальный срез и целевые веса; доходность и просадка относятся к дневной модели. Цвета и подписи обозначают экономическую роль, а не утверждение, что все защитные варианты — деньги. Целевой график не выдаётся за историю фактических позиций.

Для анализа чувствительности используется заранее заданная сетка 0, 10, 20, 30, 40 и 50 п.п. Пара, даты, капитал, издержки и данные одинаковы. Таблица не выбирает автоматически победителя и не устанавливает «оптимальный» порог. Историческая лучшая доходность может быть результатом подгонки. Для отдельного исследования оптимизации нужны заранее объявленные критерий, обучающий период, проверка вне периода подбора / walk-forward, учёт множественного перебора и проверка устойчивости.

Версии, сохранение и контроль

Версии разделены: общая финансовая база сайта 0.5.1, движок конструктора 0.5.0-rc.2, месячный архив 1.0.0, источник индикатора SMA200 1.3.0 (индикатор 1.3.1 после исправлений 0.5.1) и текущий движок аллокации 1.0.1. Изменение параметра сценария не меняет версии данных. Изменение алгоритма, правил пропусков или состава выгрузки требует новой версии и журнала различий.

Результат сохраняет нормализованные настройки, фактическое окно, версии движка и данных, идентификатор сценария, месячные решения, дневную оценку, сделки и контрольные предупреждения. Идентификатор сценария выводится детерминированно из версии/полного хеша набора данных, версии движка и нормализованного запроса; текущее время расчёта в идентичность не входит. Одинаковые входы и настройки должны давать одинаковый результат.

Пользовательские выгрузки включают настройки и результат JSON, дневную таблицу CSV и журнал исполнения CSV. Локально сохранённый черновик настроек не заменяет канонические данные, подтверждённый расчёт или постоянную память проекта. Исходные базы, реестр и замороженный пакет исследования сохраняются отдельно. Приватные идентификаторы файлов, ключи и учётные данные не включаются в публичную выгрузку.

ФайлНазначение
/breadth-strategy.htmlОтдельная страница сценария и анализа чувствительности
/breadth-strategy/data.json18 наборов уровней и флагов исполнения, календарь 2 965 сессий, 226 месячных сигналов и начальные настройки
/breadth-strategy/provenance.jsonХеш выгрузки, версии и хеши источников, правила исполнения, пропусков и издержек
/breadth-strategy/methodology.htmlЭта методика для чтения и печати
lib/calculation/breadth-allocation.jsДетерминированный движок; браузерная копия в public/calculation/ должна совпадать побайтно
scripts/export_breadth_allocation.pyФормирование производной выгрузки из замороженной финансовой SQLite и принятого breadth JSON
tests/breadth-allocation.mjsКонтроли формулы, дат, учёта и повторяемости
tests/breadth-allocation.pyНезависимая сверка всех исходных уровней и разрешений, повторная выгрузка и контроль ежедневного учёта через Decimal

Производная версия данных 1.0.0: 99f1e4afa8abbf45111499c8ae1da6fc935581ae242710f7d5f08aa3fd1b84b0. Она привязана к SHA-256 замороженной финансовой SQLite 060537796eea286f9ea7e051ba04a4cf56ead1340398da422128d2904bb2b634 и SHA-256 неизменённого breadth JSON 989207b9cd9e9240c448f4dd42a251123ceaed108791484ac71e1b31bb2c5826. Хеш самого файла data.json — fcdfd39433cc5b0e440f4abec505294905fce8e3b9cb667ecfdb614cc3e4b3a4; он приведён отдельно в provenance.json и отличается от логической версии набора данных.

Для воспроизведения восстановить закреплённые входы из реестра, открыть SQLite только для чтения и выполнить в точной версии репозитория:

python3 scripts/export_breadth_allocation.py --database /absolute/path/financial-input-0.5.1.sqlite --breadth /absolute/path/market-breadth/report.json
node tests/breadth-allocation.mjs
python3 tests/breadth-allocation.py

Если входы доступны по штатным путям проекта, аргументы экспорта можно опустить. Для отдельной контрольной выгрузки использовать --output, затем сравнить JSON и хеши, не заменяя эталоны. Новое вычисление пользовательского сценария выполняется тем же модулем runAllocation; идентификатор воспроизведения создаётся makeRunManifest. Данные хранятся отдельно от начальных настроек браузера.

Минимальные контрольные условия:

Полная историческая проверка доступности каждого наблюдения на исходный момент публикации не сертифицирована. Обновления исторических источников, условность индексного/синтетического исполнения, переносы оценок и применение справочных уровней остаются ограничениями модели. Числовые проверки подтверждают реализацию объявленных правил; они не доказывают предсказательную эффективность или возможность сделки по справочному уровню.

Первичные источники терминологии и раскрытий

Материалы проверены 19.10.2026. Они не являются утверждением или одобрением модели их авторами.

  1. Московская биржа — Индекс МосБиржи полной доходности: MCFTR, «брутто», RUB. Идентичность базового индекса; не основание для начисления дополнительных дивидендов.
  2. StockCharts ChartSchool — Percent Above Moving Average. Отраслевое семейство индикаторов участия бумаг относительно скользящей средней. Использование TRI, равенства и неизвестных в PortfolioLab описано отдельно.
  3. CFA Institute — Asset Allocation with Real-World Constraints. Сигнальное перераспределение активов и связь тактической аллокации со стратегическими ограничениями.
  4. IFRS Foundation — IAS 7 Statement of Cash Flows. Определение денежных средств и эквивалентов; не автоматическая классификация всех защитных активов.
  5. CFA Institute Research Foundation — Investment Model Validation. Look-ahead, survivorship, временная проверка вне обучающего периода и контроль моделей.
  6. CFA Institute — GIPS Standards Handbook for Firms. Различение теоретической и фактической доходности, прозрачность предположений. Соответствие GIPS проектом не заявляется.

См. также docs/MARKET_BREADTH_RU.md, docs/PROJECT_CONTINUITY_RU.md, docs/PROJECT_DATA_REGISTRY_RU.md и машинный реестр db/project-data-registry.json. Архивная редакция сайта с фиксированными 20 п.п. сохранена в docs/archive/MARKET_BREADTH_UI_0_9_RU.md.

Архив индекса и ширина рынка: интерфейс 0.10.0

Раздел «Индекс Мосбиржи» показывает 309 месячных составов с 1 февраля 2001 года по 1 октября 2026 года. Исходные составы не продлеваются до 1997 года, за который подтверждённых архивных составов в наборе нет. Это ретроспективный архив на дату: время первоначальной публикации и все пересмотры не подтверждены.

Воспроизведение меняет выбранный месячный срез. Доступны пауза, шаг назад и вперёд, выбор месяца, ползунок и три скорости. Воспроизведение останавливается при выходе из раздела, скрытии вкладки и в конце архива. Расчёт портфеля не запускается и настройки конструктора не меняются.

Дата кадра, дата источника состава и дата источника весов показаны раздельно. Веса берутся строго до начала месяца и отображаются в исходных процентах. Суммы 99,99%, 100,02% и другие округления не нормируются. Два отсутствующих веса остаются пустыми. Доля десяти крупнейших не выводится при неполных весах.

Полосы показывают до 15 наибольших известных весов с общей шкалой всех кадров, чтобы изменение масштаба не искажало таймлапс. Полный состав содержит все выпуски, включая выпуск без веса; поиск не меняет число участников и метрики всего среза. Справочные названия и ISIN наблюдались 18 октября 2026 года и не выданы за подтверждённые исторические наименования. У четырёх ранних выпусков есть только код источника; их идентичность и ISIN не достраиваются предположением.

Входы и выходы сравнивают ID выпусков между двумя соседними месячными составами. Первый кадр не помечает все компании как новые. Смена кода при сохранении ID не считается входом или выходом. Отсутствие выпуска не трактуется как юридический делистинг.

Небольшой исторический график переключается между числом участников, официальным уровнем ценового индекса IMOEX и уровнем полной доходности MCFTR. Значения индексов относятся к рыночной дате строго до начала месяца; ранние отсутствующие значения MCFTR не соединяются и не заполняются. Показаны исходные уровни индексов, без пересчёта базы и без модельного исполнения сделок.

Непосредственно под общим ползунком добавлена панель Market breadth. На отдельном графике одновременно показаны положительная ширина рынка и покрытие подтверждёнными сигналами. Положительная ширина описывает участие бумаг в восходящем тренде; покрытие характеризует полноту данных и не является вторым направленным рыночным сигналом. Фиксированная шкала 0–100% сохраняется между всеми кадрами. Вертикальный маркер и выбранные значения меняются вместе с существующими кнопками, выбором месяца, ползунком и воспроизведением таймлапса. Панель содержит только индикатор и диагностику данных. Распределение капитала и доходность портфеля рассчитываются на отдельной странице /breadth-strategy.html.

Положительная ширина рынка равна (above_count + equal_count) / member_count. Равенство SMA 200 включено в положительный сигнал. Знаменатель — все участники соответствующего исторического состава. Интерфейс отдельно показывает четыре категории: выше, равно, ниже, нет сигнала. Выпуски без сигнала не выдаются за выпуски ниже средней и не исключаются из знаменателя. Покрытие (member_count − missing_count) / member_count показано отдельной метрикой. Четыре метрики — положительная ширина, покрытие сигналом, доля ниже SMA200 и доля без сигнала. Доля ниже SMA200 равна below_count / member_count; доля без сигнала — missing_count / member_count. Сумма положительной ширины, доли ниже и доли без сигнала равна единице. На таймлапсе нет фиксированного порога и нет целевых весов активов. Переменный параметр сдвига и выбор основного и защитного активов относятся к отдельному модулю стратегии. Золото и валюта не называются денежной долей.

Сохранённые поля прежней стратегии со сдвигом 20 п.п. остаются в неизменённом исследовательском архиве версии 1.3.0 для контроля исторического результата. Индикаторная панель их не читает и не использует для визуализации или проверки текущего правила распределения. Их целостность проверяет отдельный контроль исходного архива, а не интерфейс индикатора.

Архив ширины рынка содержит 226 месячных диагностических составов с января 2008 по октябрь 2026. Соединение с 309 кадрами архива индекса выполняется только по точному первому числу календарного месяца. Для 2001–2007 годов выводится отсутствие наблюдения. Ближайший или последний доступный сигнал не подставляется; пропуски графика не соединяются. Сигнал по полной стоимости строится на 200 последовательных торговых сессиях и требует фактическую котировку на дату сигнала. Точная политика исходных котировок и дивидендов хранится в отдельной методике данных.

Дата кадра, дата закрытия сигнала, плановая дата исполнения и, когда она отличается, доступная дата исполнения показаны раздельно. Дата сигнала строго предшествует исполнению, но может оказаться после первого календарного числа месяца из-за нерабочих дней. Архив состава индекса и диагностический состав индикатора не объединяются предположением: диагностика имеет собственную таблицу, исторические коды и подтверждённые ID. При несовпадении идентификации выпусков отображается примечание. Разные даты источников и позднейшая идентификация остаются ограничениями ретроспективного набора.

Таблица диагностики показывает все выпуски выбранного месяца, категорию, TRI, SMA 200 и отношение TRI/SMA 200. Отсутствующие числовые значения отображаются прочерками. У выпуска без сигнала причина уточняется, когда доступны признаки отсутствия фактической котировки или недостаточной непрерывной истории. Уровни TRI разных бумаг имеют разные базы и не интерпретируются как сопоставимые цены. Отдельные файлы JSON, история CSV, полная диагностика CSV и HTML-методика доступны для воспроизведения.

Архивная таблица фильтруется по году и вхождению искомого выпуска. Фильтр таблицы не меняет область воспроизведения. Текущий срез скачивается в CSV с исходными датами; полный архив, месячные изменения и паспорт источников доступны отдельными файлами. Ссылки на официальные источники и их SHA-256 меняются вместе с выбранным срезом.

Интеграция: createIndexHistoryView({getCatalog,notify}), вызов show() при переходе в view-index и hide() при выходе. Данные загружаются лениво из /index-history/timelapse.json?v=0.10.0; сверка финансовой версии выполняется, если каталог уже загружен. Модуль не зависит от доступности каталога для показа архива. История ширины рынка загружается отдельным запросом /market-breadth/report.json?v=0.10.0 после появления архива. Ошибка индикатора и его кнопка повтора независимы от архива состава: таймлапс сохраняет работоспособность. Переключение раздела и скрытие вкладки по-прежнему останавливают воспроизведение.

Проверки: node tests/index-history-view.mjs сверяет реальные 309 кадров, пропуски, покрытие, изменения по ID, фильтры, CSV, версии и даты, а также соответствие селекторов HTML. Дополнительно проверяются 226 сохранённых наблюдений ширины рынка, включение равенства, сохранение неизвестных в знаменателе, нейтральность к полям распределения портфеля, раздельные доли ниже средней и без сигнала, отсутствие переноса сигнала в ранние месяцы, разрывы линий и порядок сигнала/исполнения. Модуль не вызывает /api/backtest и не меняет состояние конструктора. Проверка в реальном браузере в управляемом окружении не выполнялась.

Реестр данных PortfolioLab

Редакция 1.3.3 от 21.10.2026. Рыночный срез — 16.10.2026. Машинная версия: db/project-data-registry.json. Этот реестр связывает сохранённые входы, их рабочие проекции и способы восстановления; он не заменяет сами базы.

Независимые версии

КонтурДействующая версияНазначение
Финансовая база сайта0.5.1, f04fde3f… (корректирующий выпуск поверх 0.5.0, e43569f3…)Инструменты, синтетические ряды, расчёт конструктора
Движок конструктора0.5.0-rc.2Одинаковые правила Python и JavaScript
Месячная историческая база1.0.0Все исторические акции, листинги, месячные наблюдения и составы IMOEX
Исследование SMA200 / Market breadth1.3.0; индикатор 1.3.1Принятое исследование 1.3.0 (архивный сценарий 20 п.п.); индикатор 1.3.1 — переоценка участников с изменённым TR в 0.5.1
ИнтерфейсОтдельная версия public/ui-version.jsonПредставление данных; изменение интерфейса не меняет финансовую версию

Исследовательский расчёт Market breadth и конструктор сайта — разные контуры. Их расходы, области данных и перенос оценок при пропусках не подменяются друг другом. Версия паспорта проекта также не является версией финансового движка.

Основные базы и сохранённые источники

База / наборКанонический сохранённый файлПроверенный объём и охватСтатус
Финансовый срез 0.5.1PortfolioLab_Financial_0_5_1.sqlite (пакет 0.5.1); сборка scripts/build_financial_0_5_1.py из 0.5.0 и db/corrections-0.5.1.json308 666 368 байт; 33 таблицы; 290 записей; 777 473 расчётные строки; SHA-256 d4a69da4…e96fДействующий вход; проверка 16/16
Финансовый срез 0.5.0PortfolioLab_Synthetic9_Control_0_5_0_2026-10-18.zip → PortfolioLab_0_5_0/engine/data/portfolio.sqlite311 996 416 байт; 33 таблицы; 290 записей справочника; 777 473 расчётные строки; календарь 22.09.1997–16.10.2026Активный неизменяемый вход
Ставки ЦБ, MM_CBR и LQDTТот же ZIP → PortfolioLab_v0_4_3_2026-10-18/engine/data/policy_rates/policy_rates.sqlite8 294 400 байт; 9 таблиц; 205 событий ставки; 12 709 уровней модели, включая начальный; 1 687 котировок LQDTАктивная подбаза; MM_CBR — модель
Финансовый срез 0.4.3Тот же ZIP → PortfolioLab_v0_4_3_2026-10-18/engine/data/portfolio.sqlite269 606 912 байт; 281 запись; 736 208 расчётных строкНеизменяемый базовый вход синтетических моделей
Девять синтетических моделейТот же ZIP, synthetic_sources/ и три входные SQLite111 первичных артефактов; 9 моделей; формулы и SHA-256 закреплены в коде и манифестахПересобираемый слой; синтетика выделена явно
Полная историческая месячная базаPortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip → PortfolioLab_MOEX_Monthly/outputs/MOEX_Monthly_Equities_1997_2026.sqlite689 049 600 байт; 355 месяцев; 112 165 месячных строк; 2 207 кодов; 1 978 753 дневных строкиПолный исходный контур истории рынка
Месячная база, отдельная копияMOEX_Monthly_Equities_1997_2026.sqlite.gzПосле распаковки тот же SHA-256, что у SQLite в полном месячном архивеАльтернативное восстановление базы; без полного raw-архива
Принятый SMA200 / breadthPortfolioLab_SMA200_Breadth_Backtest_2026-10-18.zip, редакция исследования 1.3.028 замороженных входов; 226 месячных диагностик; 9 413 строк по участникам; 142 решения и 2 965 сессий бэктеста с 2015 годаПолный воспроизводимый исследовательский комплект
Аналитическая SQLite SMA200В архиве sma200_breadth/outputs/PortfolioLab_SMA200_Analysis_2026-10-18.sqlite; также сохранена отдельно под этим именем3 461 120 байт; 16 таблиц; 226 строк общей истории сигналов и 142 строки основной моделиПроизводный результат принятого исследования
Полный SQL-мастер 0.4.3PortfolioLab_All_Data_0_4_3.sqlite.gz; альтернативный дамп PortfolioLab_All_Data_0_4_3.sql.gzПринятый SHA-256 распакованного мастера 495133ed…; полный размер и строки здесь повторно не проверялисьСохранённый архивный мастер; это не текущая SQLite 0.4.3 из контрольного ZIP
Полный исходный проект 0.4.3PortfolioLab_0_4_3_2026-10-18.zipВключает прежние raw и исходную офлайн-сборку, не дублируемые небольшим контрольным ZIPАрхив воспроизведения базового слоя
LowVol50PortfolioLab_LowVol50_Backtest_v1_0_0_2026-10-18.zipОтдельное прежнее исследование; актуальная стратегия breadth не отбирает отдельные акцииАрхив; не активная стратегия
Ранние версииАрхивы PortfolioLab 0.2, 0.3, 0.4, 0.4.2Сохранены для истории решений; актуальная совместимость не проверяласьАрхив; автоматическое переключение запрещено
Ранние самостоятельные SQLitePortfolio_Lab_Database_v2_2026-09-11.sqlite, portfolio.sqliteПо 87 965 696 байт по текущим метаданным; хеши и связь с текущим движком не провереныНаследуемые ссылки, не канонические входы

Идентификаторы сохранённых файлов и их наблюдаемые версии находятся в закрытом паспорте PROJECT_MEMORY.json. Публичная версия реестра содержит имена, контрольные суммы и команды, без персональных идентификаторов и учётных данных. Значение null в реестре означает, что факт не проверен или не сообщён источником; оно не означает нулевой объём.

Проекции сайта и временные базы

Серверная D1 — рабочая производная проекция: 42 финансовые таблицы, 1 946 745 строк и 541 проверяемый пакет, плюс представления и служебные таблицы. Число 42 складывается из 33 таблиц финансового файла и 9 таблиц денежной подбазы. Готовый срез sealed / ready не редактируется. Серверная копия не заменяет сохранённые входы и исходные артефакты.

work/launch-api.sqlite — пересоздаваемая тестовая база. Её размер и строки зависят от сценариев; она не является резервной копией проекта. Не сохранять её вместо канонических входов и не восстанавливать из неё промышленный финансовый срез.

public/data/, public/model-portfolios/, public/index-history/ и public/market-breadth/ — небольшие производные выгрузки, поставляемые с кодом. Они удобны для проверки интерфейса и выгрузки результатов, но не заменяют полную месячную базу, raw источники и замороженные входы исследования.

Архив таймлапса содержит 309 месячных составов за 01.02.2001–01.10.2026, 10 946 строк участников и два отсутствующих веса. 46 более ранних месяцев не имеют подтверждённого состава. Нет нормализации известных весов и восстановления пропусков. Членство и веса имеют разные даты: состав на дату либо ранее, вес строго ранее даты месяца. Имена и ISIN могут относиться к наблюдаемому справочнику, поэтому исходный исторический код сохраняется отдельно.

Карта восстановления

Сначала восстановить из сохранённых файлов точную версию кода, указанную в паспорте или SOURCE_VERSION.json, и необходимые архивы. Не использовать произвольную последнюю ревизию вместо принятого commit. Следующие команды выполняются после получения архивов, из корня репозитория сайта; /path/ заменяется фактическим локальным путём.

python3 scripts/restore_control_inputs.py /path/PortfolioLab_Synthetic9_Control_0_5_0_2026-10-18.zip
python3 scripts/reproduce.py --structure-only
python3 scripts/reproduce.py

Восстановитель сверяет полный BUNDLE_MANIFEST.json, а затем отдельные физические SHA-256 трёх SQLite и первичных артефактов. verify_database.py открывает их только для чтения и сверяет логические значения всех 42 таблиц с финансовым runtime-манифестом. Перед API-контролем временная тестовая база пересоздаётся штатной программой. Не применять seed или импорт к готовому серверному срезу ради офлайн-контроля.

Таймлапс восстанавливается из полного месячного архива:

python3 scripts/export_index_history.py --archive /path/PortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip
python3 tests/index-history.py --archive /path/PortfolioLab_MOEX_Monthly_1997_2026_v1_0_0_2026-10-18.zip

Экспорт проверяет закреплённый SHA-256 архива, SQLite, сохранённые ответы источников, согласование месячных составов и запрет будущих дат. Он не загружает источники заново. Для повторного построения самой полной месячной базы нужны build.py, audit.py, deliver.py из её исходного архива и сохранённые там входы. Это самостоятельный уровень воспроизведения, его нельзя подменять экспортом интерфейса.

Исследование SMA200 восстанавливается из полного принятого архива. Из каталога sma200_breadth:

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python reproduce.py --mode preflight
.venv/bin/python reproduce.py --mode rebuild

Отдельная выгрузка индикатора в сайт повторяется из корня репозитория:

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

Сохраняются public/market-breadth/report.json, provenance.json, monthly.csv, constituents.csv, strategy-daily.csv и methodology.html; новая SQLite не создаётся. Протокол — work/market-breadth-validation.json. Значения индикатора месячные, дневной CSV описывает стоимость принятой стратегии. По всем 226 месяцам совпадает число участников; для 223 месяцев точно совпадают сопоставленные наборы выпусков. За июнь–август 2011 года сохраняется неразрешённое соответствие временного выпуска MTSS/MTSI; 37 месяцев имеют отличия винтажа справочного ISIN и исторического кода. Не менять принятый индикатор ради принудительного совпадения справочников.

preflight проверяет код, настройки, 28 входов и 21 принятый числовой файл. rebuild работает с временной копией, независимо восстанавливает портфель и требует точного совпадения 21 CSV/JSON; принятые результаты на месте не изменяются. config.json — экспортный снимок, фактический CONFIG находится в backtest_sma200.py. Изменение одного JSON не переключает расчёт. SQLite проверяется отдельно; бинарные XLSX, PNG и HTML могут содержать служебные отличия и не считаются числовыми эталонами.

Отдельная копия месячной SQLite восстанавливается стандартным gzip. Архивный полный SQL-мастер также распаковывается gzip, а дамп SQL — в новую пустую SQLite. До использования обязательны физический SHA-256 распакованной базы, PRAGMA integrity_check и PRAGMA foreign_key_check. Принятый хеш мастера нельзя подставлять вместо хеша текущей финансовой базы. Для старых самостоятельных SQLite без зафиксированного SHA-256 сначала провести отдельный аудит и установить происхождение; они не допускаются автоматически.

Смысл индикатора и границы контроля

Market breadth — доля исторических участников индекса с поддержанным уровнем полной доходности выше либо равным SMA200 TR. Знаменатель включает всех участников. Неизвестный TR, менее 200 последовательных уровней или отсутствие фактической сигнальной котировки дают статус «нет сигнала», не удаляют бумагу из знаменателя и входят в исходную защитную долю до применения выбранного порога. Обыкновенные и привилегированные выпуски имеют отдельный голос; капитализационные веса не используются при подсчёте индикатора.

Текущее правило отдельного модуля: w_defensive = max(0, 1 − breadth − tau), w_primary = 1 − w_defensive. Порог tau выбирает пользователь, по умолчанию 0 п.п.; доступны основной и защитный активы с базовой парой MCFTR / MM_CBR. Прежнее правило 20 п.п. сохранено исключительно как архивный сценарий 1.3.0. Индикатор, целевые и фактические веса хранятся раздельно. Исторические акции остаются входами индикатора; LowVol и отбор отдельных бумаг не подменяют исходную концепцию.

Диагностика за 226 месяцев с 2008 года не означает наличие бэктеста портфеля с 2008 года. Принятый портфель рассчитан за 05.01.2015–16.10.2026. Сигнал использует предыдущее закрытие; исполнение — наблюдаемый MCFTR на первой доступной сессии месяца. В принятой исследовательской версии 07.01.2022 и 24.03.2022 перенесён предыдущий индексный уровень только для оценки, а заявка 24.03.2022 исполнена 25.03.2022 с исходным сигналом. Все 142 исполнения имеют наблюдаемый индексный уровень.

Все финансовые и исторические данные ретроспективны. Исходное время публикации каждого значения и полная point-in-time история не сертифицированы. Неполнота дивидендов не превращается в нулевые выплаты. Полные внешние документы эмитентов не дублируются в расчётном SMA200-архиве: сохранены реквизиты, хеши и решения. Числовое повторение работает без сети, повторная экспертиза оригиналов требует доступа к ним.

Учёт изменений и критерии сохранения

Каждый выпуск получает отдельные версии данных, исследования и интерфейса; cutoff, физические и логические SHA-256, точный код, настройки, покрытие до/после, влияние на результат и протокол контроля. Ранее принятые архивы и результаты сохраняются. Повторная загрузка API — новый винтаж, даже если даты совпадают. Сбой, неполная пагинация, неизвестное время публикации и отсутствующее поле не являются нулевыми значениями.

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

Сохранённый проектный паспорт хранит связи и инструкции; сами SQLite и исходные архивы сохраняются отдельными файлами. Временная рабочая папка и память диалога не заменяют их. Полный источник сайта и его методики версионируются в Git, архивы данных — отдельными сохранёнными файлами. Персональные идентификаторы, подписанные URL, ключи, токены и пароли в публичные выгрузки не включаются.

Динамическая аллокация — новое назначение индикатора

С 19.10.2026 фиксированный текущий порог 20 п.п. отменён пользователем. Распределение между выбранными основным и защитным активами исследуется на отдельной странице /breadth-strategy.html. Порог tau переменный, стартовое значение 0 п.п. Подробная методика docs/BREADTH_ALLOCATION_RU.md. Пять статических модельных портфелей сайта сохранены. Неизменный архив 1.3.0 не заменяется результатами нового модуля; его комиссия и входы имеют свою версию.

Проекция аллокации 1.0.0 (public/breadth-strategy/data.json) содержит 18 активов, 2 965 сессий 05.01.2015–16.10.2026 и 226 месячных сигналов. Версия данных: 99f1e4afa8abbf45111499c8ae1da6fc935581ae242710f7d5f08aa3fd1b84b0. Она восстанавливается python3 scripts/export_breadth_allocation.py из текущей финансовой SQLite и принятого индикатора. Переносы оценок и возраст исходных наблюдений разделены; справочные цены не становятся биржевыми котировками. Число записей полного реестра теперь 24, включая производные проекции.

Движок отдельной аллокации 1.0.1 использует прежнюю проекцию 1.0.0 с тем же SHA-256. Новые поля журнала описывают расчётные уровни и порядок исполнения; они не заменяют исходные котировки и не меняют финансовый выпуск. Контроли хронологии/цен и шрифтов сохраняются в отдельном комплекте интерфейса 0.11.0 с точным опубликованным commit. Старые архивы остаются источниками баз.

Продолжение и воспроизведение PortfolioLab

Инструкция от 19.10.2026. Читать вместе с docs/PROJECT_DATA_REGISTRY_RU.md, db/project-data-registry.json и действующими методиками, а при восстановлении проекта — с сохранёнными PROJECT_MEMORY.json и PROJECT_MEMORY_RU.txt.

Приоритет источников

  1. Действующее решение владельца проекта.
  2. Принятая версия методики, исходных данных и замороженных манифестов.
  3. Код и настройки, которыми создан принятой результат.
  4. Проверенные выходные таблицы и протоколы.

Паспорт хранит контекст и карту файлов. Число из пересказа прежнего диалога не заменяет сохранённый расчёт. При несовпадении версии сначала прочитать текущий файл, а не восстанавливать неизвестные цифры по памяти.

Перед работой

Сохранённые решения владельца проекта

При изменении данных

Создать новый срез, сохранить оригинальные байты источников, полную пагинацию, даты наблюдения/публикации, единицы и SHA-256. NULL не заменять нулём. Не переносить текущее число акций, текущий состав или текущий код в прошлое без документированного основания. Изменения источников внутри закрытого периода заносить в журнал пересмотров.

Обновить реестр, методику, код, настройки и тесты одной согласованной редакцией. Показать разницу покрытия и результатов с прежней версией. Не перезаписывать готовые серверные финансовые строки и не обходить ошибку контроля заменой эталона. Полный rebuild исходной базы, числовой backtest и экспорт интерфейса — разные проверки; выполнять соответствующие изменённой области.

Перед выпуском

  1. Проверить физические хеши входов, целостность SQLite, внешние ключи, логические хеши, границы календаря и составов.
  2. Для финансового контура выполнить python3 scripts/reproduce.py; для исследования — его reproduce.py --mode preflight и --mode rebuild; для представления — контроль выгрузок и интерфейсного контракта.
  3. Проверить синхронизацию даты таймлапса и breadth. До начала принятой истории индикатора показывать отсутствие данных, не ноль. Отдельно показывать дату сигнала и дату исполнения, если они различаются.

Для отдельного модуля проверить граничные значения tau, выбранную пару, общий календарь, лаг исполнения, обе стороны торгового оборота, издержки, сопоставимое окно бенчмарков, детерминированные настройки и выгрузки. Различать график целевых весов и фактические веса после движения цен. Перебор порогов обозначать анализом чувствительности, результаты — гипотетическим бэктестом.

  1. Сохранить код в Git, новые данные и протоколы — отдельными постоянными файлами; обновлять существующие паспорта с сохранением их идентичности и истории версий. Не дублировать весь Git-репозиторий как новый файл.
  2. Зафиксировать успешный опубликованный commit, точную версию данных, статус развёртывания и ссылки в закрытом паспорте. Если публикация или сохранение не завершены, оставить статус pending и назвать ограничение.

Публикация обновления не расширяет аудиторию сайта и не создаёт автоматического расписания обновлений. Числовые тесты не подтверждают визуальное взаимодействие, правомерность использования источников, полноту рынка, строгий PIT или коммерческую пропускную способность. Отмечать только действительно проведённые проверки.

Минимальный комплект восстановления

Нужны закреплённый исходный код, три финансовые SQLite из контрольного архива 0.5.0, пакет исправлений 0.5.1 (db/corrections-0.5.1.json, control/evidence_0_5_1/), полный месячный архив 1.0.0 и полный SMA200-архив 1.3.0. Для отдельной страницы переменной аллокации нужны также её версионированная производная выгрузка цен и сигналов, методика, параметры сценария и код расчёта; эта выгрузка не заменяет исходные SQLite. Для повторного формирования прежнего финансового слоя нужен также полный исходный архив 0.4.3 / архивный SQL-мастер. Малый проектный комплект памяти содержит паспорта, реестр, ссылки на эти исходники, принятую аналитическую SQLite и новые протоколы; он не заменяет большие архивы.

Конкретные имена, SHA-256, размеры, члены архивов, текущие идентификаторы и границы проверки находятся в реестре и закрытом паспорте. Внешний .zip.sha256 фиксирует архив; внутренний манифест — его члены. При неизвестном хеше сначала проверить исходник, не придумывать значение. Для следующего шага сначала читать действующие паспорта и протоколы, затем продолжать с принятой версией.

Проверка интерфейса и хронологии 20.10.2026

Текущий интерфейс 0.11.0 использует локальные лицензированные шрифты с реальными начертаниями 400/700 и табличными цифрами. Основная навигация сохраняет пять групп, модуль аллокации доступен из раздела портфелей. Перед продолжением читать также docs/TYPOGRAPHY_RU.md и docs/BACKTEST_CAUSALITY_RU.md.

Движок аллокации 1.0.1 добавляет точные уровни и единицы исполнения; формат входов 1.0.0 и их SHA-256 не менялись. После сигнала исполнение происходит по следующему допустимому общему закрытию, новые веса получают только последующую доходность. Расчётные уровни нельзя выдавать за исполнимую цену пая в рублях или гарантированную цену аукциона закрытия.

При любом изменении учёта запускать node tests/backtest-causality.mjs и node tests/backtest-execution.mjs, при изменении представления также node tests/breadth-strategy-view.mjs, node tests/index-history-view.mjs, python3 tests/typography.py и python3 tests/interface-contract.py. Проверки кода не сертифицируют исходную публикацию исторического состава/выплат и строгий PIT. Отдельно сохранять ограничения источников и выполненный объём проверки; не объявлять непроведённый браузерный просмотр выполненным.

Мобильное представление 0.12.0

Поручение 20.10.2026: сделать сайт удобным для пользователей телефона. Сохранять мобильную нижнюю навигацию и нативное меню, крупные зоны нажатия, видимые названия полей, одноколоночные формы, компактные карточки и управление датой графика пальцем/клавиатурой. Не скрывать существенные ограничения источников и исполнения ради компактности. Общие правила — docs/MOBILE_UX_RU.md.

Базовый проектный размер зоны нажатия44CSSpx, текст ввода16CSSpx; это проектные ориентиры, не гарантия поведения конкретной ОС. Не отключать увеличение страницы. Проверять управление меню, сохранение выбранного состава/сценария, устаревшие результаты и видимые ползунки. Новые проверки: node tests/mobile-shell.mjs, node tests/mobile-workspace.mjs, python3 tests/mobile-contract.py. Статические проверки/макеты DOM не заменяют реальные мобильные браузеры и не доказывают отсутствие переполнения при каждом масштабе.

Приложение Словарь колонок и логические хеши

Раскрываемые описания ниже встроены в документ и доступны без сети. Полные внешние ключи и индексы дополнительно приведены в машинном data_dictionary.json.

instruments · 290 строк

Идентичность инструментов и производных рядов

Физическое имя rf04fde3f_instruments

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
nameTEXTNOT NULL
asset_classTEXTNOT NULL
currencyTEXTNOT NULL
isinTEXTNULL по DDL
issuer_idTEXTNULL по DDL
boardTEXTNULL по DDL
is_referenceINTEGERNOT NULL
qualityTEXTNOT NULL
notesTEXTNOT NULL
underlying_symbolTEXTNULL по DDL

Логический SHA-256 05acbfce3b279f3ebee2ae16e9c5737558e10c3b92a35ae3c368323eb060e527

CREATE TABLE `rf04fde3f_instruments` (
	`symbol` text PRIMARY KEY NOT NULL,
	`name` text NOT NULL,
	`asset_class` text NOT NULL,
	`currency` text NOT NULL,
	`isin` text,
	`issuer_id` text,
	`board` text,
	`is_reference` integer NOT NULL,
	`quality` text NOT NULL,
	`notes` text NOT NULL,
	`underlying_symbol` text,
	FOREIGN KEY (`underlying_symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_instruments_check_0" CHECK(asset_class IN ('stock','stock_price_reference','bond_fund','money_market_fund','money_market_model','equity_fund','gold_fund','fx','gold_reference','index','cash','synthetic_model')),
	CONSTRAINT "rf04fde3f_instruments_check_1" CHECK(is_reference IN (0,1))
)
metadata · 33 строк

Параметры замороженного финансового выпуска

Физическое имя rf04fde3f_metadata

ПолеТип SQLNULLПорядок PKDEFAULT
keyTEXTNOT NULL1
valueTEXTNOT NULL

Логический SHA-256 de456d82aecd723a711e3d0d10bb4df041ddff9ded7ef9ffc8d293cbf63ce2db

CREATE TABLE `rf04fde3f_metadata` (
	`key` text PRIMARY KEY NOT NULL,
	`value` text NOT NULL
)
primary_annual_coverage · 14 строк

Первичные годовые сверки выплат

Физическое имя rf04fde3f_primary_annual_coverage

ПолеТип SQLNULLПорядок PKDEFAULT
secidTEXTNOT NULL1
yearINTEGERNOT NULL2
window_fromTEXTNOT NULL
window_toTEXTNOT NULL
expectedREALNOT NULL
facts_jsonTEXTNOT NULL

Логический SHA-256 285d69d65897e41b9a7611a265072fcd9630a7f229ec77f0af359da5725630f8

CREATE TABLE `rf04fde3f_primary_annual_coverage` (
	`secid` text NOT NULL,
	`year` integer NOT NULL,
	`window_from` text NOT NULL,
	`window_to` text NOT NULL,
	`expected` real NOT NULL,
	`facts_json` text NOT NULL,
	PRIMARY KEY(`secid`, `year`)
)
quality_issues · 72 строк

Замечания по качеству данных

Физическое имя rf04fde3f_quality_issues

ПолеТип SQLNULLПорядок PKDEFAULT
idINTEGERNOT NULL1
symbolTEXTNULL по DDL
dateTEXTNULL по DDL
severityTEXTNULL по DDL
codeTEXTNULL по DDL
detailTEXTNULL по DDL

Логический SHA-256 ca764f3a64604f434f0f536ce7e7c205ef4d6af02ac7bafc0f560e7d20d08ff1

CREATE TABLE `rf04fde3f_quality_issues` (
	`id` integer PRIMARY KEY NOT NULL,
	`symbol` text,
	`date` text,
	`severity` text,
	`code` text,
	`detail` text
)
runs · 0 строк

Журнал исходного Python API который текущий сайт не заполняет

Физическое имя rf04fde3f_runs

ПолеТип SQLNULLПорядок PKDEFAULT
run_idTEXTNOT NULL1
created_atTEXTNOT NULL
data_versionTEXTNOT NULL
engine_versionTEXTNOT NULL
request_jsonTEXTNOT NULL
result_jsonTEXTNOT NULL

Логический SHA-256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

CREATE TABLE `rf04fde3f_runs` (
	`run_id` text PRIMARY KEY NOT NULL,
	`created_at` text NOT NULL,
	`data_version` text NOT NULL,
	`engine_version` text NOT NULL,
	`request_json` text NOT NULL,
	`result_json` text NOT NULL
)
sources · 14522 строк

Происхождение наблюдений и контрольные суммы источников

Физическое имя rf04fde3f_sources

ПолеТип SQLNULLПорядок PKDEFAULT
source_idTEXTNOT NULL1
urlTEXTNOT NULL
sha256TEXTNULL по DDL
retrieved_atTEXTNULL по DDL
local_pathTEXTNULL по DDL

Логический SHA-256 748520bdbe2b6c709ba61d3bdbc2d92049293dfc90b97cb5bc44d9731dabba5a

CREATE TABLE `rf04fde3f_sources` (
	`source_id` text PRIMARY KEY NOT NULL,
	`url` text NOT NULL,
	`sha256` text,
	`retrieved_at` text,
	`local_path` text
)
trading_calendar · 7277 строк

Общий календарь оценок на основе IMOEX

Физическое имя rf04fde3f_trading_calendar

ПолеТип SQLNULLПорядок PKDEFAULT
dateTEXTNOT NULL1

Логический SHA-256 3e22c82e0dfcdbef95f5c58eb4c9a6bc7fc15296163c5ebd32e24b9778351459

CREATE TABLE `rf04fde3f_trading_calendar` (
	`date` text PRIMARY KEY NOT NULL
)
mm_fund_model · 1 строк

Определение теоретической модели MM_CBR

Физическое имя rf04fde3f_mm_fund_model

ПолеТип SQLNULLПорядок PKDEFAULT
model_idTEXTNOT NULL1
nameTEXTNOT NULL
ruleTEXTNOT NULL
annual_expenseREALNOT NULL
tax_rateREALNOT NULL
day_countTEXTNOT NULL

Логический SHA-256 72e33384375809a015df5a39d16575500e5ddd6f03041bb96451cd7f1282fc7a

CREATE TABLE `rf04fde3f_mm_fund_model` (
	`model_id` text PRIMARY KEY NOT NULL,
	`name` text NOT NULL,
	`rule` text NOT NULL,
	`annual_expense` real NOT NULL,
	`tax_rate` real NOT NULL,
	`day_count` text NOT NULL
)
mm_lqdt_action · 1 строк

Юридическая дата дробления и дата применения к цене LQDT

Физическое имя rf04fde3f_mm_lqdt_action

ПолеТип SQLNULLПорядок PKDEFAULT
effective_dateTEXTNOT NULL1
legal_dateTEXTNOT NULL
ratioREALNOT NULL
source_urlTEXTNOT NULL

Логический SHA-256 a733b04c9ca88e2e26230afdbad135360f2879543b12b09826720489ec2a0c3e

CREATE TABLE `rf04fde3f_mm_lqdt_action` (
	`effective_date` text PRIMARY KEY NOT NULL,
	`legal_date` text NOT NULL,
	`ratio` real NOT NULL,
	`source_url` text NOT NULL
)
mm_metadata · 14 строк

Параметры и границы денежной подбазы

Физическое имя rf04fde3f_mm_metadata

ПолеТип SQLNULLПорядок PKDEFAULT
keyTEXTNOT NULL1
valueTEXTNOT NULL

Логический SHA-256 c79df6d45f988131cec5e679caa97f75fab7b805b295aa568aae209f7ede8e7f

CREATE TABLE `rf04fde3f_mm_metadata` (
	`key` text PRIMARY KEY NOT NULL,
	`value` text NOT NULL
)
mm_source_artifact · 28 строк

Метаданные первичных артефактов денежной подбазы

Физическое имя rf04fde3f_mm_source_artifact

ПолеТип SQLNULLПорядок PKDEFAULT
source_idTEXTNOT NULL1
urlTEXTNOT NULL
sha256TEXTNOT NULL
retrieved_atTEXTNULL по DDL
local_pathTEXTNOT NULL
source_kindTEXTNOT NULL

Логический SHA-256 3ae02090c7d3c5ce2d5fdcd95a02991b6badcb3448c6ae403918a611f173f60a

CREATE TABLE `rf04fde3f_mm_source_artifact` (
	`source_id` text PRIMARY KEY NOT NULL,
	`url` text NOT NULL,
	`sha256` text NOT NULL,
	`retrieved_at` text,
	`local_path` text NOT NULL,
	`source_kind` text NOT NULL
)
candle_archive · 240191 строк

Отдельно сохранённые ранние дневные свечи

Физическое имя rf04fde3f_candle_archive

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNULL по DDL1
dateTEXTNULL по DDL2
openREALNULL по DDL
highREALNULL по DDL
lowREALNULL по DDL
closeREALNULL по DDL
volumeREALNULL по DDL
turnoverREALNULL по DDL
source_idTEXTNULL по DDL
basisTEXTNOT NULL

Логический SHA-256 662a3d778b34fce3e5403ecd28138252646a0e1f6dcb9e81ee9427e65f46b030

CREATE TABLE `rf04fde3f_candle_archive` (
	`symbol` text,
	`date` text,
	`open` real,
	`high` real,
	`low` real,
	`close` real,
	`volume` real,
	`turnover` real,
	`source_id` text,
	`basis` text NOT NULL,
	PRIMARY KEY(`symbol`, `date`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
corporate_actions · 11 строк

Дробления и другие корпоративные действия

Физическое имя rf04fde3f_corporate_actions

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNULL по DDL1
effective_dateTEXTNULL по DDL2
action_typeTEXTNULL по DDL3
ratioREALNULL по DDL
source_urlTEXTNULL по DDL
statusTEXTNULL по DDL

Логический SHA-256 e337e27b2c149b2341c6720ede9cd882969bca1e27a7e88a36cea722a0e3cdf0

CREATE TABLE `rf04fde3f_corporate_actions` (
	`symbol` text,
	`effective_date` text,
	`action_type` text,
	`ratio` real,
	`source_url` text,
	`status` text,
	PRIMARY KEY(`symbol`, `effective_date`, `action_type`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_corporate_actions_check_0" CHECK(ratio>0)
)
distribution_evidence · 2112 строк

Исходные свидетельства выплат

Физическое имя rf04fde3f_distribution_evidence

ПолеТип SQLNULLПорядок PKDEFAULT
evidence_idINTEGERNOT NULL1
symbolTEXTNOT NULL
record_dateTEXTNOT NULL
source_idTEXTNULL по DDL
raw_jsonTEXTNOT NULL

Логический SHA-256 5e108db5c975dd663b12b1a082dde19b8377b1cb61cd956120b3ce4d2eee9a93

CREATE TABLE `rf04fde3f_distribution_evidence` (
	`evidence_id` integer PRIMARY KEY NOT NULL,
	`symbol` text NOT NULL,
	`record_date` text NOT NULL,
	`source_id` text,
	`raw_json` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
distributions · 1312 строк

Канонические экономические события выплат

Физическое имя rf04fde3f_distributions

ПолеТип SQLNULLПорядок PKDEFAULT
event_idTEXTNOT NULL1
symbolTEXTNULL по DDL
ex_dateTEXTNULL по DDL
record_dateTEXTNULL по DDL
payment_date_actualTEXTNULL по DDL
payment_date_modelTEXTNULL по DDL
amountREALNULL по DDL
currencyTEXTNULL по DDL
amount_qualityTEXTNULL по DDL
date_qualityTEXTNULL по DDL
source_noteTEXTNULL по DDL

Логический SHA-256 b4af02f8b36e3645bb66a9a543b004b7bc3130b12b2a9004cb4d3f6808865b7b

CREATE TABLE `rf04fde3f_distributions` (
	`event_id` text PRIMARY KEY NOT NULL,
	`symbol` text,
	`ex_date` text,
	`record_date` text,
	`payment_date_actual` text,
	`payment_date_model` text,
	`amount` real,
	`currency` text,
	`amount_quality` text,
	`date_quality` text,
	`source_note` text,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
dividend_annual_control · 1592 строк

Годовая сверка канонических дивидендов

Физическое имя rf04fde3f_dividend_annual_control

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNULL по DDL1
yearINTEGERNULL по DDL2
expected_current_unitsREALNULL по DDL
selected_current_unitsREALNULL по DDL
consistentINTEGERNULL по DDL

Логический SHA-256 d2e33a32007847f71a55a8b7afd50552cf102e0309fba1f19012866e1d2eed9c

CREATE TABLE `rf04fde3f_dividend_annual_control` (
	`symbol` text,
	`year` integer,
	`expected_current_units` real,
	`selected_current_units` real,
	`consistent` integer,
	PRIMARY KEY(`symbol`, `year`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
event_exclusions · 12 строк

Кандидаты исключённые из денежных событий

Физическое имя rf04fde3f_event_exclusions

ПолеТип SQLNULLПорядок PKDEFAULT
decision_idTEXTNOT NULL1
symbolTEXTNOT NULL
source_record_dateTEXTNOT NULL
source_idTEXTNULL по DDL
review_jsonTEXTNOT NULL

Логический SHA-256 6579a052ff60082393ed82f608d52691d45b666f7068d09739b110a2b5dc5109

CREATE TABLE `rf04fde3f_event_exclusions` (
	`decision_id` text PRIMARY KEY NOT NULL,
	`symbol` text NOT NULL,
	`source_record_date` text NOT NULL,
	`source_id` text,
	`review_json` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
fund_policy · 15 строк

Исследовательские правила распределения дохода БПИФ

Физическое имя rf04fde3f_fund_policy

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
distribution_modeTEXTNOT NULL
verified_fromTEXTNULL по DDL
verified_throughTEXTNULL по DDL
source_urlTEXTNULL по DDL
review_statusTEXTNOT NULL

Логический SHA-256 94e0a13e0e631f616d25d0ff6bf847c8c973a72444063d2a5c1958a3fd93ebc4

CREATE TABLE `rf04fde3f_fund_policy` (
	`symbol` text PRIMARY KEY NOT NULL,
	`distribution_mode` text NOT NULL,
	`verified_from` text,
	`verified_through` text,
	`source_url` text,
	`review_status` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
index_members · 228786 строк

Исторические составы и исходные веса IMOEX

Физическое имя rf04fde3f_index_members

ПолеТип SQLNULLПорядок PKDEFAULT
index_codeTEXTNULL по DDL1
dateTEXTNULL по DDL2
symbolTEXTNULL по DDL3
weight_pctREALNULL по DDL
source_idTEXTNULL по DDL

Логический SHA-256 9d52311f055c8031e1dca3ff2e33ade1e990492bb61894ea6e620d64e00d79c6

CREATE TABLE `rf04fde3f_index_members` (
	`index_code` text,
	`date` text,
	`symbol` text,
	`weight_pct` real,
	`source_id` text,
	PRIMARY KEY(`index_code`, `date`, `symbol`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
instrument_aliases · 32 строк

Исходные коды фондов и интервалы справочника

Физическое имя rf04fde3f_instrument_aliases

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
source_symbolTEXTNOT NULL2
isinTEXTNOT NULL
boardTEXTNOT NULL3
valid_fromTEXTNOT NULL
valid_throughTEXTNOT NULL

Логический SHA-256 7d6a6a0977f1040f1a416d9736c418e81d4a6041150da652dc1f95061531d0e4

CREATE TABLE `rf04fde3f_instrument_aliases` (
	`symbol` text NOT NULL,
	`source_symbol` text NOT NULL,
	`isin` text NOT NULL,
	`board` text NOT NULL,
	`valid_from` text NOT NULL,
	`valid_through` text NOT NULL,
	PRIMARY KEY(`symbol`, `source_symbol`, `board`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
model_parameters · 1 строк

Параметры импорта модели денежного рынка

Физическое имя rf04fde3f_model_parameters

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
model_typeTEXTNOT NULL
rate_database_sha256TEXTNOT NULL
ruleTEXTNOT NULL
day_countTEXTNOT NULL
tax_rateREALNOT NULL
annual_expenseREALNOT NULL
history_startTEXTNOT NULL
history_endTEXTNOT NULL

Логический SHA-256 ad26465b02e3b94ec0a883944d3a0e7b077f228887f95255fd47306543879134

CREATE TABLE `rf04fde3f_model_parameters` (
	`symbol` text PRIMARY KEY NOT NULL,
	`model_type` text NOT NULL,
	`rate_database_sha256` text NOT NULL,
	`rule` text NOT NULL,
	`day_count` text NOT NULL,
	`tax_rate` real NOT NULL,
	`annual_expense` real NOT NULL,
	`history_start` text NOT NULL,
	`history_end` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
prices · 487931 строк

Исходные цены OHLC и торговая активность

Физическое имя rf04fde3f_prices

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNULL по DDL1
dateTEXTNULL по DDL2
closeREALNOT NULL
openREALNULL по DDL
highREALNULL по DDL
lowREALNULL по DDL
volumeREALNULL по DDL
turnoverREALNULL по DDL
source_idTEXTNULL по DDL
basisTEXTNOT NULL
boardTEXTNULL по DDL

Логический SHA-256 cf2611bde9722205ca21a2898d26c3f1eb4522e62d06e6ba3bc9bdabb73318e4

CREATE TABLE `rf04fde3f_prices` (
	`symbol` text,
	`date` text,
	`close` real NOT NULL,
	`open` real,
	`high` real,
	`low` real,
	`volume` real,
	`turnover` real,
	`source_id` text,
	`basis` text NOT NULL,
	`board` text,
	PRIMARY KEY(`symbol`, `date`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_prices_check_0" CHECK(close>0)
)
reference_observations · 45804 строк

Исходные величины ЦБ с номиналами и датами

Физическое имя rf04fde3f_reference_observations

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNULL по DDL1
dateTEXTNULL по DDL2
original_dateTEXTNULL по DDL
valueREALNULL по DDL
original_valueREALNULL по DDL
nominalREALNULL по DDL
denomination_factorREALNULL по DDL
source_idTEXTNULL по DDL
usableINTEGERNULL по DDL
reasonTEXTNULL по DDL
block_idTEXTNULL по DDL
regimeTEXTNULL по DDL
valid_untilTEXTNULL по DDL

Логический SHA-256 fa60534001d9845ba7b961a650b3d8b9a12f5fe5cc6cb686feaa7416c599921f

CREATE TABLE `rf04fde3f_reference_observations` (
	`symbol` text,
	`date` text,
	`original_date` text,
	`value` real,
	`original_value` real,
	`nominal` real,
	`denomination_factor` real,
	`source_id` text,
	`usable` integer,
	`reason` text,
	`block_id` text,
	`regime` text,
	`valid_until` text,
	PRIMARY KEY(`symbol`, `date`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
return_coverage · 127 строк

Допустимые исследовательские окна TRI акций

Физическое имя rf04fde3f_return_coverage

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
eligible_fromTEXTNULL по DDL
ruleTEXTNOT NULL
detail_jsonTEXTNOT NULL

Логический SHA-256 f88dec7f93fe1a220de6dffda99e4eeeea5fc6c62debe58f976ca6ae25dc9e4f

CREATE TABLE `rf04fde3f_return_coverage` (
	`symbol` text PRIMARY KEY NOT NULL,
	`eligible_from` text,
	`rule` text NOT NULL,
	`detail_json` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
security_code_changes · 2 строк

Доказанные переходы между историческими кодами

Физическое имя rf04fde3f_security_code_changes

ПолеТип SQLNULLПорядок PKDEFAULT
change_idTEXTNOT NULL1
old_codeTEXTNOT NULL
new_codeTEXTNOT NULL
effective_dateTEXTNOT NULL
isinTEXTNOT NULL
shares_ratioREALNOT NULL
source_idTEXTNOT NULL
review_jsonTEXTNOT NULL

Логический SHA-256 93f4bd56ccabd66ca3498bb62ad222784fe22fa36e72f6bcd69dbff48ee5c179

CREATE TABLE `rf04fde3f_security_code_changes` (
	`change_id` text PRIMARY KEY NOT NULL,
	`old_code` text NOT NULL,
	`new_code` text NOT NULL,
	`effective_date` text NOT NULL,
	`isin` text NOT NULL,
	`shares_ratio` real NOT NULL,
	`source_id` text NOT NULL,
	`review_json` text NOT NULL,
	FOREIGN KEY (`old_code`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`new_code`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_security_code_changes_check_0" CHECK(shares_ratio>0)
)
series · 777473 строк

Уровни расчётных рядов и признаки доступности сделки

Физическое имя rf04fde3f_series

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNULL по DDL1
dateTEXTNULL по DDL2
levelREALNOT NULL
price_levelREALNULL по DDL
tradableINTEGERNOT NULL
stale_daysINTEGERNOT NULL
qualityTEXTNOT NULL

Логический SHA-256 d6b46bd60f70e1b8e37c39afe7d4b8e9379fca8c2890883c28a59531205a15a2

CREATE TABLE `rf04fde3f_series` (
	`symbol` text,
	`date` text,
	`level` real NOT NULL,
	`price_level` real,
	`tradable` integer NOT NULL,
	`stale_days` integer NOT NULL,
	`quality` text NOT NULL,
	PRIMARY KEY(`symbol`, `date`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`date`) REFERENCES `rf04fde3f_trading_calendar`(`date`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_series_check_0" CHECK(level>0),
	CONSTRAINT "rf04fde3f_series_check_1" CHECK(tradable IN (0,1))
)
source_revision_reviews · 43 строк

Решения по изменениям закрытых источников

Физическое имя rf04fde3f_source_revision_reviews

ПолеТип SQLNULLПорядок PKDEFAULT
review_idTEXTNOT NULL1
symbolTEXTNOT NULL
source_record_dateTEXTNOT NULL
dispositionTEXTNOT NULL
review_jsonTEXTNOT NULL

Логический SHA-256 8e386cfb9004711fbddf096e23312e7851c98f29aa1fa3f4ec3f12b28543dd4e

CREATE TABLE `rf04fde3f_source_revision_reviews` (
	`review_id` text PRIMARY KEY NOT NULL,
	`symbol` text NOT NULL,
	`source_record_date` text NOT NULL,
	`disposition` text NOT NULL,
	`review_json` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
synthetic_artifacts · 111 строк

Происхождение и хеши сохранённых первичных входов расчётных рядов

Физическое имя rf04fde3f_synthetic_artifacts

ПолеТип SQLNULLПорядок PKDEFAULT
source_idTEXTNOT NULL1
artifact_keyTEXTNOT NULL
raw_sha256TEXTNOT NULL
gzip_sha256TEXTNOT NULL
raw_bytesINTEGERNOT NULL
gzip_pathTEXTNOT NULL
evidence_typeTEXTNOT NULL
publication_time_knownINTEGERNOT NULL0

Логический SHA-256 0793720032133fafa37ea064379222589fce2438b66e912a9b2c1c5779de812c

CREATE TABLE `rf04fde3f_synthetic_artifacts` (
	`source_id` text PRIMARY KEY NOT NULL,
	`artifact_key` text NOT NULL,
	`raw_sha256` text NOT NULL,
	`gzip_sha256` text NOT NULL,
	`raw_bytes` integer NOT NULL,
	`gzip_path` text NOT NULL,
	`evidence_type` text NOT NULL,
	`publication_time_known` integer DEFAULT 0 NOT NULL,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
synthetic_inputs · 54866 строк

Нормализованные исходные индексы цены выплаты и дробления

Физическое имя rf04fde3f_synthetic_inputs

ПолеТип SQLNULLПорядок PKDEFAULT
datasetTEXTNOT NULL1
dateTEXTNOT NULL2
fieldTEXTNOT NULL3
valueREALNOT NULL
source_idTEXTNOT NULL
extra_jsonTEXTNOT NULL

Логический SHA-256 85b848585bc87d4fa392d6f758071f38648209c958ef8f14a63281d18f333354

CREATE TABLE `rf04fde3f_synthetic_inputs` (
	`dataset` text NOT NULL,
	`date` text NOT NULL,
	`field` text NOT NULL,
	`value` real NOT NULL,
	`source_id` text NOT NULL,
	`extra_json` text NOT NULL,
	PRIMARY KEY(`dataset`, `date`, `field`),
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
synthetic_models · 9 строк

Версионированные определения девяти расчётных рядов

Физическое имя rf04fde3f_synthetic_models

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
model_versionTEXTNOT NULL
kindTEXTNOT NULL
formulaTEXTNOT NULL
annual_expense_bpsREALNOT NULL
tax_rateREALNOT NULL
source_timingTEXTNOT NULL
full_startTEXTNOT NULL
full_endTEXTNOT NULL
portfolio_startTEXTNOT NULL
portfolio_endTEXTNOT NULL
definition_jsonTEXTNOT NULL

Логический SHA-256 89301a26ea4953049d773da5b44f133b5019225e1da373eacd7eeae504548533

CREATE TABLE `rf04fde3f_synthetic_models` (
	`symbol` text PRIMARY KEY NOT NULL,
	`model_version` text NOT NULL,
	`kind` text NOT NULL,
	`formula` text NOT NULL,
	`annual_expense_bps` real NOT NULL,
	`tax_rate` real NOT NULL,
	`source_timing` text NOT NULL,
	`full_start` text NOT NULL,
	`full_end` text NOT NULL,
	`portfolio_start` text NOT NULL,
	`portfolio_end` text NOT NULL,
	`definition_json` text NOT NULL,
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_instruments`(`symbol`) ON UPDATE no action ON DELETE no action
)
mm_lqdt_quote · 1687 строк

Фактические положительные котировки LQDT и VTBM

Физическое имя rf04fde3f_mm_lqdt_quote

ПолеТип SQLNULLПорядок PKDEFAULT
dateTEXTNOT NULL1
source_symbolTEXTNOT NULL
isinTEXTNOT NULL
closeREALNOT NULL
volumeREALNULL по DDL
turnoverREALNULL по DDL
source_idTEXTNOT NULL
split_factorREALNOT NULL
day_returnREALNOT NULL
levelREALNOT NULL
tradableINTEGERNOT NULL

Логический SHA-256 c5ef462f3dd3b3d1580946e7723d073af7926b3539f67c2fdd112823d517243f

CREATE TABLE `rf04fde3f_mm_lqdt_quote` (
	`date` text PRIMARY KEY NOT NULL,
	`source_symbol` text NOT NULL,
	`isin` text NOT NULL,
	`close` real NOT NULL,
	`volume` real,
	`turnover` real,
	`source_id` text NOT NULL,
	`split_factor` real NOT NULL,
	`day_return` real NOT NULL,
	`level` real NOT NULL,
	`tradable` integer NOT NULL,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_mm_source_artifact`(`source_id`) ON UPDATE no action ON DELETE no action
)
mm_model_daily · 12709 строк

Полный календарный индекс MM_CBR включая начальную точку

Физическое имя rf04fde3f_mm_model_daily

ПолеТип SQLNULLПорядок PKDEFAULT
model_idTEXTNOT NULL1
dateTEXTNOT NULL2
rate_typeTEXTNULL по DDL
annual_pctREALNULL по DDL
year_daysINTEGERNULL по DDL
day_returnREALNOT NULL
levelREALNOT NULL
denomination_factorREALNOT NULL

Логический SHA-256 16a21efbcf6142a604deafd30ab22deaf7c57d475551ea800cb3f4586bc46b3e

CREATE TABLE `rf04fde3f_mm_model_daily` (
	`model_id` text NOT NULL,
	`date` text NOT NULL,
	`rate_type` text,
	`annual_pct` real,
	`year_days` integer,
	`day_return` real NOT NULL,
	`level` real NOT NULL,
	`denomination_factor` real NOT NULL,
	PRIMARY KEY(`model_id`, `date`),
	FOREIGN KEY (`model_id`) REFERENCES `rf04fde3f_mm_fund_model`(`model_id`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_mm_model_daily_check_0" CHECK(level>0)
)
mm_rate_daily · 17487 строк

Раздельные календарные значения ключевой ставки и рефинансирования

Физическое имя rf04fde3f_mm_rate_daily

ПолеТип SQLNULLПорядок PKDEFAULT
rate_typeTEXTNOT NULL1
dateTEXTNOT NULL2
annual_pctREALNOT NULL
source_idTEXTNOT NULL
derivationTEXTNOT NULL

Логический SHA-256 3d52bbb7de74598f916be810611d253405c86ac929789ef73716dfc4bdedd8a0

CREATE TABLE `rf04fde3f_mm_rate_daily` (
	`rate_type` text NOT NULL,
	`date` text NOT NULL,
	`annual_pct` real NOT NULL,
	`source_id` text NOT NULL,
	`derivation` text NOT NULL,
	PRIMARY KEY(`rate_type`, `date`),
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_mm_source_artifact`(`source_id`) ON UPDATE no action ON DELETE no action
)
mm_rate_event · 205 строк

Датированные события изменений ставок

Физическое имя rf04fde3f_mm_rate_event

ПолеТип SQLNULLПорядок PKDEFAULT
rate_typeTEXTNOT NULL1
effective_fromTEXTNOT NULL2
effective_toTEXTNULL по DDL
annual_pctREALNOT NULL
source_idTEXTNOT NULL
ruleTEXTNOT NULL
documentTEXTNULL по DDL
announced_atTEXTNULL по DDL

Логический SHA-256 b15dbdf9b78728756537675c11fe372b7d3ef49e841c6a3ccd4a3dc22d07da31

CREATE TABLE `rf04fde3f_mm_rate_event` (
	`rate_type` text NOT NULL,
	`effective_from` text NOT NULL,
	`effective_to` text,
	`annual_pct` real NOT NULL,
	`source_id` text NOT NULL,
	`rule` text NOT NULL,
	`document` text,
	`announced_at` text,
	PRIMARY KEY(`rate_type`, `effective_from`),
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_mm_source_artifact`(`source_id`) ON UPDATE no action ON DELETE no action
)
mm_rate_observation · 3281 строк

Исходные опубликованные наблюдения ключевой ставки

Физическое имя rf04fde3f_mm_rate_observation

ПолеТип SQLNULLПорядок PKDEFAULT
rate_typeTEXTNOT NULL1
dateTEXTNOT NULL2
annual_pctREALNOT NULL
source_idTEXTNOT NULL

Логический SHA-256 97add667911773c36dfaf96afc0d587c27765daeb7d7b594ebda33626d3ce53e

CREATE TABLE `rf04fde3f_mm_rate_observation` (
	`rate_type` text NOT NULL,
	`date` text NOT NULL,
	`annual_pct` real NOT NULL,
	`source_id` text NOT NULL,
	PRIMARY KEY(`rate_type`, `date`),
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_mm_source_artifact`(`source_id`) ON UPDATE no action ON DELETE no action
)
dividend_currency_facts · 19 строк

Первичная валюта единица выплаты и RUB эквиваленты

Физическое имя rf04fde3f_dividend_currency_facts

ПолеТип SQLNULLПорядок PKDEFAULT
fact_idTEXTNOT NULL1
secidTEXTNOT NULL
event_idTEXTNULL по DDL
source_record_dateTEXTNOT NULL
record_dateTEXTNOT NULL
native_amountREALNOT NULL
native_currencyTEXTNOT NULL
native_unitTEXTNOT NULL
issuer_rub_actualREALNULL по DDL
accounting_rub_equivalentREALNULL по DDL
conversion_statusTEXTNOT NULL
facts_jsonTEXTNOT NULL

Логический SHA-256 bd22f61f942f457a1e4d0026d88708efb3e0f4e98633faca92f155d51868a552

CREATE TABLE `rf04fde3f_dividend_currency_facts` (
	`fact_id` text PRIMARY KEY NOT NULL,
	`secid` text NOT NULL,
	`event_id` text,
	`source_record_date` text NOT NULL,
	`record_date` text NOT NULL,
	`native_amount` real NOT NULL,
	`native_currency` text NOT NULL,
	`native_unit` text NOT NULL,
	`issuer_rub_actual` real,
	`accounting_rub_equivalent` real,
	`conversion_status` text NOT NULL,
	`facts_json` text NOT NULL,
	FOREIGN KEY (`event_id`) REFERENCES `rf04fde3f_distributions`(`event_id`) ON UPDATE no action ON DELETE no action
)
event_aliases · 1345 строк

Связь исходных событий с каноническими

Физическое имя rf04fde3f_event_aliases

ПолеТип SQLNULLПорядок PKDEFAULT
original_event_idTEXTNOT NULL1
canonical_event_idTEXTNOT NULL
decision_idTEXTNULL по DDL

Логический SHA-256 e8e766aae4b7397ea8bbd9513d9d0f9514b017568ab7ed79c72cc182588140ba

CREATE TABLE `rf04fde3f_event_aliases` (
	`original_event_id` text PRIMARY KEY NOT NULL,
	`canonical_event_id` text NOT NULL,
	`decision_id` text,
	FOREIGN KEY (`canonical_event_id`) REFERENCES `rf04fde3f_distributions`(`event_id`) ON UPDATE no action ON DELETE no action
)
event_evidence · 2100 строк

Связь экономического события со свидетельствами

Физическое имя rf04fde3f_event_evidence

ПолеТип SQLNULLПорядок PKDEFAULT
event_idTEXTNOT NULL1
evidence_idINTEGERNOT NULL2

Логический SHA-256 77aedc3217c420edcde63142a178ce4b79d47e72fec6329b9f45bdf2bf1a9e05

CREATE TABLE `rf04fde3f_event_evidence` (
	`event_id` text NOT NULL,
	`evidence_id` integer NOT NULL,
	PRIMARY KEY(`event_id`, `evidence_id`),
	FOREIGN KEY (`event_id`) REFERENCES `rf04fde3f_distributions`(`event_id`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`evidence_id`) REFERENCES `rf04fde3f_distribution_evidence`(`evidence_id`) ON UPDATE no action ON DELETE no action
)
event_reviews · 56 строк

Сохранённые решения проверки событий

Физическое имя rf04fde3f_event_reviews

ПолеТип SQLNULLПорядок PKDEFAULT
decision_idTEXTNOT NULL1
event_idTEXTNOT NULL
reviewed_atTEXTNOT NULL
source_idTEXTNULL по DDL
review_jsonTEXTNOT NULL

Логический SHA-256 cff7a703829b6413930582c8beae09f5d2e59831c349793441a766c9e1e51630

CREATE TABLE `rf04fde3f_event_reviews` (
	`decision_id` text PRIMARY KEY NOT NULL,
	`event_id` text NOT NULL,
	`reviewed_at` text NOT NULL,
	`source_id` text,
	`review_json` text NOT NULL,
	FOREIGN KEY (`event_id`) REFERENCES `rf04fde3f_distributions`(`event_id`) ON UPDATE no action ON DELETE no action,
	FOREIGN KEY (`source_id`) REFERENCES `rf04fde3f_sources`(`source_id`) ON UPDATE no action ON DELETE no action
)
event_timing · 1312 строк

Даты события и подтверждённая историческая доступность

Физическое имя rf04fde3f_event_timing

ПолеТип SQLNULLПорядок PKDEFAULT
event_idTEXTNOT NULL1
announced_date_reportedTEXTNULL по DDL
approved_atTEXTNULL по DDL
available_atTEXTNULL по DDL
timing_qualityTEXTNOT NULL

Логический SHA-256 1b166ebcc1f9fe46842b5fc31011068d923abc3170456ef5fcfc5e155d82051a

CREATE TABLE `rf04fde3f_event_timing` (
	`event_id` text PRIMARY KEY NOT NULL,
	`announced_date_reported` text,
	`approved_at` text,
	`available_at` text,
	`timing_quality` text NOT NULL,
	FOREIGN KEY (`event_id`) REFERENCES `rf04fde3f_distributions`(`event_id`) ON UPDATE no action ON DELETE no action
)
primary_dividend_facts · 18 строк

Первичные факты по отдельным выплатам

Физическое имя rf04fde3f_primary_dividend_facts

ПолеТип SQLNULLПорядок PKDEFAULT
fact_idTEXTNOT NULL1
secidTEXTNOT NULL
event_idTEXTNOT NULL
record_dateTEXTNOT NULL
amountREALNOT NULL
currencyTEXTNOT NULL
approved_atTEXTNULL по DDL
available_atTEXTNULL по DDL
facts_jsonTEXTNOT NULL

Логический SHA-256 5d6d6f9549492a69ad22b61ff3207f4c5add2b8f27f510e93973b0c42b31b259

CREATE TABLE `rf04fde3f_primary_dividend_facts` (
	`fact_id` text PRIMARY KEY NOT NULL,
	`secid` text NOT NULL,
	`event_id` text NOT NULL,
	`record_date` text NOT NULL,
	`amount` real NOT NULL,
	`currency` text NOT NULL,
	`approved_at` text,
	`available_at` text,
	`facts_json` text NOT NULL,
	FOREIGN KEY (`event_id`) REFERENCES `rf04fde3f_distributions`(`event_id`) ON UPDATE no action ON DELETE no action
)
synthetic_points · 43871 строк

Полная история моделей с датами входов и действующим курсом

Физическое имя rf04fde3f_synthetic_points

ПолеТип SQLNULLПорядок PKDEFAULT
symbolTEXTNOT NULL1
dateTEXTNOT NULL2
levelREALNOT NULL
input_dateTEXTNOT NULL
fx_dateTEXTNULL по DDL
fx_valueREALNULL по DDL
conditional_rebalanceINTEGERNOT NULL
stale_daysINTEGERNOT NULL
details_jsonTEXTNOT NULL

Логический SHA-256 4e555a352e9ae7d2fc5edf9581eb8e5fed0916725e12e2c3cdb4ecc1736e385b

CREATE TABLE `rf04fde3f_synthetic_points` (
	`symbol` text NOT NULL,
	`date` text NOT NULL,
	`level` real NOT NULL,
	`input_date` text NOT NULL,
	`fx_date` text,
	`fx_value` real,
	`conditional_rebalance` integer NOT NULL,
	`stale_days` integer NOT NULL,
	`details_json` text NOT NULL,
	PRIMARY KEY(`symbol`, `date`),
	FOREIGN KEY (`symbol`) REFERENCES `rf04fde3f_synthetic_models`(`symbol`) ON UPDATE no action ON DELETE no action,
	CONSTRAINT "rf04fde3f_synthetic_points_check_0" CHECK(level>0),
	CONSTRAINT "rf04fde3f_synthetic_points_check_1" CHECK(conditional_rebalance IN (0,1))
)
Финансовый выпуск 0.5.0 · движок 0.5.0-rc.2 · интерфейс 0.13.0 · рыночный срез 16.10.2026Наверх ↑