Методика: почему панель показывает зону, а не прогноз
Короткий ответ: потому что прогноз направления курса не подтвердился данными. Длинный — ниже, с числами.
1. Что было проверено до постройки панели
Исследование ruble-drivers (каталог показателей + validation/VALIDATION.md) прогнало ~60 дневных сигналов × 3 цели × 4 горизонта × 6 режимов курсообразования, плюс месячные потоковые, фискальные и внешнеторговые ряды. Каждая находка прошла адверсариальную проверку независимыми агентами, писавшими собственный код с задачей её опровергнуть.
Итог: ни один показатель не предсказывает направление курса USD/RUB на горизонте от дня и дольше.
Опровергнуты, в частности:
- операции Минфина по бюджетному правилу (объявляются на месяц вперёд — казалось бы, идеальный опережающий индикатор): IC −0,035 на 104 месяцах, p = 0,73; проверено 182 комбинациями, включая точное окно операций, неожиданность объёма, долю в обороте и ступеньки зеркалирования ЦБ. Объём операций эндогенен нефти — вся информация уже в цене;
- ставка по юаню RUSFAR CNY как опережающий сигнал: держалась на одном эпизоде осени 2024, знак перевёрнут в предыдущем режиме, честный walk-forward даёт Шарп 0,00;
- продажи валюты экспортёрами, нефтегазовые доходы, цена Urals, торговый баланс, доля нерезидентов в ОФЗ, позиционирование физлиц во фьючерсе Si;
- налоговый период (эффект жив до 2022, после — ноль);
- нефть с лагом 1,5–2 месяца (работала в режиме контроля капитала, в текущем структура связи исчезла).
2. Почему обычные тесты здесь врут
Через ту же батарею были прогнаны заведомо неинформативные сигналы: 150 случайных блужданий, 300 процессов AR(1), синусоиды, тренды. Результат:
| Режим | h=1 | h=5 | h=21 | h=63 |
|---|---|---|---|---|
| Текущий (внебиржевой курс с 13.06.2024) | 0,109 | 0,186 | 0,373 | 0,505 |
В ячейках — 95-й процентиль |IC| у сигналов, которые физически не могут ничего знать о будущем. Синусоида с периодом 125 дней получает IC = −0,36 при p = 0,000. Случайное блуждание на трёхмесячном горизонте даёт |IC| до 0,50 в 5% случаев.
Отсюда правило панели: горизонты 21 и 63 дня в двухлетнем режиме непроверяемы (7 независимых окон, минимально обнаружимая связь 0,6–0,7). Это отсутствие мощности, а не доказательство отсутствия эффекта — и то, и другое одинаково запрещает строить на них сигнал.
3. Что уцелело и попало в панель
Уровень A — единственный. Перенос вечернего разрыва «биржевой юань против фиксинга ЦБ» в завтрашний официальный курс: β ≈ 0,91–1,05, R² 0,38–0,53, на крайних децилях разрыва ±106 б.п. при 90–94% верных знаков. Эмбарго в один день обнуляет эффект — это механика, а не прогноз: официальный курс считается по сделкам до 15:30, и вечернее движение рынка просто переезжает в завтрашний фиксинг.
Применимость узкая и указана на панели: только расчёты, привязанные к курсу ЦБ регламентом (брокерская конвертация «по курсу ЦБ плюс комиссия», учёт, часть контрактов). При банковском спреде 100–200 б.п. эффект в 20 б.п. не имеет смысла.
Уровень B — контекст, не сигнал. Реверсия после всплеска волатильности; кластеризация волатильности на 1–3 дня; REER как магнит для инфляции, но не для номинального курса; девальвационный байес консенсуса (факт, но не контрариан).
4. Как устроена зона справедливости
Панель считает не прогноз, а веер независимых якорей равновесия.
Якорей пять, независимых КОНЦЕПЦИЙ — три: реальный курс (три окна REER), бюджет (фискальный якорь) и собственная история цены (трендовый якорь, §9). Разница между «якорями» и «концепциями» не бухгалтерская: три окна REER — это одно понятие, посчитанное на трёх горизонтах, и считать их тремя голосами значило бы дать реальному курсу вес 3:1.
REER-якоря (три окна)
мост = 0,4 · USD_месяц_публикации/USD_сегодня + 0,6 · CNY_месяц/CNY_сегодня
REER_сейчас = REER_опубликованный × мост
FV(окно) = спот × REER_сейчас / среднее(REER, окно), окно ∈ {24, 60, 120} мес
Новкаст-мост обязателен. REER публикуется с лагом ~2 месяца. Без моста панель врёт: опубликованный июнь-2026 давал 85-й перцентиль («рубль экстремально дорог»), а мост через номинал — 47-й, потому что девальвация июня–августа разрыв уже закрыла.
Полоса якоря — межквартильный размах отклонения REER от собственной скользящей средней, центрированный на самом якоре (без центрирования полоса окна 120 мес уезжала целиком выше точки, и значение оказывалось вне своего же интервала) и калиброванный только на эпохе свободного плавания (с 2015: раньше курс был управляемым, и полоса, посчитанная с 1994, раздувалась до бессмысленных ±25%).
Фискальный якорь
базовая бочка = цена отсечения × курс бюджета (2026: 59 $ × 92,2 = 5 440 ₽)
FV = базовая бочка / min(цена Urals, цена отсечения)
Пока нефть дороже цены отсечения, FV равен курсу, на котором построен бюджет (92,2 ₽ в 2026 году), и от нефти не зависит. Дешевле отсечки — растёт, как и раньше: недостачу закрывает ФНБ, а его ликвидная часть невелика (меньше 4 трлн ₽ на 01.09.2026), поэтому бюджету нужен рубль слабее заложенного в закон.
Почему цена ограничена отсечкой (24.09.2026). До этого формула была бочка / Urals без ограничения: она считала, что бюджету достаётся вся цена нефти. При работающем бюджетном правиле это не так: базовые нефтегазовые доходы считаются по цене отсечения, а всё сверх них Минфин отправляет в ФНБ покупкой валюты. Как в базе учитывается курс, текст Минфина однозначно не говорит: в объём операций входит «отклонение оценки базового месячного объёма от базового месячного объёма» (релиз от 03.06.2026), и это читается двумя способами — база зафиксирована в рублях закона (тогда отклонения и цены, и курса уходят в ФНБ) либо пересчитывается по фактическому курсу (тогда в ФНБ уходит только отклонение цены). Вывод «выше отсечки якорь равен курсу бюджета» верен при обоих прочтениях. В первом бюджет получает базу закона при любом курсе, а курс бюджета остаётся точкой, на которой сходятся ненефтяные доходы и план; точка бочка / Urals — лишь курс, при котором операции Минфина равны нулю. Во втором бюджету достаётся отсечка × фактический курс, и нужный ему курс — ровно курс бюджета. Ниже отсечки прочтения расходятся: в первом якорь растёт как бочка / Urals (ФНБ докладывает недостачу и истощается), во втором бюджету по-прежнему нужен курс бюджета, а давит только тающий ФНБ. Панель оставляет прежнее, более осторожное поведение — рост якоря. В обоих случаях старая точка падала с ростом нефти ровно там, где правило разрывает связь нефти с бюджетом. Замер 24.09.2026: при Brent за 21 день около 108 $ якорь стоял на 64,9 ₽, одна эта концепция утаскивала центр зоны с ~88 до 79,7 ₽ и переворачивала знак заголовочного разрыва (+6,7% вместо −4,3%). С отсечкой 50 $, заложенной в проект бюджета на 2027–2029 годы, та же нефть дала бы ~52 ₽ — на пороге отбраковки концепций (40% от медианы), и центр прыгал бы между ~75 и ~87 ₽ от движения нефти на десятки центов.
Параметры бюджета — по годам, с датой и источником (pipeline/lib/policy.py). Их две: цена отсечения и курс бюджета. Именно отсечка, а не прогноз цены Urals: до 2027 года они совпадали (59 $), в проекте на 2027 год разошлись (прогноз 53 $, отсечка 50 $), и бюджет тратит базу по отсечке, а разницу копит в ФНБ. Статус («закон», «проект», «плановый период») печатается на карточке; проект вносится в правительство до конца сентября, закон подписывается в ноябре. С 1 октября панель сама пишет в ops-канал, если параметров следующего года ещё нет: 1 января якорь без них исчезает. Если Минфин приостановит операции по правилу (так было в начале 2026 года), весь нефтяной доход идёт в бюджет — флаг RULE_ACTIVE в том же файле возвращает якорь к полной цене Urals.
Полоса строится от той же цены через ту же отсечку. Если нефть дороже отсечки с запасом больше своей неопределённости, полоса нулевая: якорь равен курсу бюджета при любой правдоподобной цене. У самой отсечки полоса только вверх. У этого якоря нет полураспада и не считается реверсия — это точка политического давления, а не статистический магнит, и панель не имеет права обещать возврат к нему.
Смена методики и смена бюджетного года сдвигают зону без движения рынка. В такой прогон переход курса через границу зоны событием не считается: смена методики уходит в ops-канал, смена параметров бюджета — в ленту отдельным событием «зона пересчитана по бюджету», с тем, на сколько сдвинулись якорь и центр.
Цена Urals идёт по мосту, а не месячным шагом — тот же принцип, что новкаст-мост REER: у официальной цены месячная конвенция публикации, а механизм (доходной бочке бюджета нужен курс) живёт непрерывно. Пока нефть заметно дороже отсечки, мост на якорь не влияет, но он решает, когда цена подходит к отсечке.
Urals_сейчас = среднее(Brent, последний 21 торговый день) − скидка_последнего_официального_месяца
Цену шага измерил август 2026. Нефть ралли (Brent июль 83,76 → август 91,40), а якорь весь месяц стоял на июльских 92,17 при мостовых 80–85: средняя ошибка +9,1 ₽, пик +11,8 ₽ — до +3,9 ₽ завышения центра зоны, — и 1 сентября он переставился скачком в 10,6 ₽, когда рынок движение давно отыграл. Мост увёл бы якорь ниже 85 ₽ уже 3 августа. Информация всё это время лежала в собственном входе панели (живая котировка Brent).
Официальную цену добывают ДВА канала. Сайт Минэка недоступен ни с рабочей машины, ни с сервера, и цитату его сообщения приходится брать у прессы. До сентября 2026 канал был один — агентство ПРАЙМ; в сентябре оно про августовскую цену (67,11 $, опубликована 04.09) просто не написало, и панель неделю жила на оценке: якорь 66,34 вместо 67,11, а мост держал июльскую скидку с лагом в два месяца и полосой ±7,9 $ вместо ±6,3. Второй канал — лента тега «Минэкономразвития» на Lenta.ru. Отбор там идёт строго по обороту «рассчитываемая в целях налогообложения»: под тем же адресом и почти тем же заголовком Лента печатает РЫНОЧНУЮ цену Urals в портах (10.09.2026 — больше 80 $ против налоговых 67,11), и подмена сдвинула бы якорь на шестнадцать рублей, выглядя при этом правдоподобно. Молчание одного канала теперь строчка в диагностике, а не потерянный вход.
Скользящее окно при этом честно воспроизводит будущую календарную цену:
| среднее 21 дня на конец месяца − календарное среднее | за 7 месяцев 2026 — |
|---|
медиана 0,61 $, максимум 1,62 $. Скидка калибруется ТОЛЬКО официальными публикациями (месяц с неправдоподобной скидкой пропускается), её старение несёт та же таблица ошибок, что у оценки; месячная налоговая цена остаётся на карточке справкой и сверкой. При недоступном мосте (нет Brent) якорь честно падает на месячную цену и говорит об этом.
Агрегат
Зона = веер якорей (min…max). Веса руками не назначаются; ширина веера — самостоятельный индикатор: узкий = якоря согласны, широкий = режимная неопределённость.
Центр = среднее концепций. Окна REER сворачиваются в одно значение медианой, и уже три концепции усредняются. Почему среднее, а не медиана, и как устроена ЯВНАЯ отбраковка сломанной концепции — §9.
Полоса неопределённости показывается у каждого якоря отдельно. Раньше их объединяла одна бледная заливка на весь график: она была шире зоны, ничем не подписана и читалась как вторая, более широкая зона. Объединение к тому же теряло сведения — у окна 24 месяца полоса 78–92 ₽, у окна 120 месяцев 85–96 ₽, и это разные утверждения о разной неопределённости.
От какого курса считается зона
Курс в формулах якорей — рыночный, а не официальный. Официальный курс ЦБ административен и зафиксирован вчера в 15:30; зона от него отвечала на вопрос «где курс был вчера». Замер 13.08.2026: 82,9977 против рыночных 84,0304 — отставание 1,24%, разрыв −7,83% вместо −6,62%.
Рыночный курс берётся ярусами:
| ярус | источник | когда |
|---|---|---|
| 1 | FX_IDC:USDRUB через сканер TradingView — та же котировка, что показывает Finam | всегда, когда доступен |
| 2 | кросс CNYRUB_TOM × USDCNY | если эталон молчит |
| 3 | Yahoo RUB=X | если молчит и биржевая нога |
Ярусы 2 и 3 подписываются на панели словом «резерв».
Почему эталон, а не кросс, у которого тиков больше. Прямых торгов долларом на Мосбирже нет с 2024 года: доллар/рубль торгуется внебиржевым рынком, и пауза между тиками FX_IDC означает отсутствие СДЕЛОК, а не отсутствие наблюдения. Это принципиально не то же, что отставание официального курса: там задержка систематическая и направленная. Кросс через юань тикает чаще просто потому, что чаще торгуется юань, — но он прокси, а FX_IDC принят ориентиром.
Что остаётся на ОФИЦИАЛЬНОМ базисе, и это не недосмотр:
- краткосрочный слой — он про фиксинг ЦБ по определению;
- кросс-юаневый разрыв — тождество арбитража формулируется к официальному курсу;
- carry и покрытый паритет — фьючерс Si исполняется расчётом ПРОТИВ официального курса ЦБ на дату экспирации, то есть его базовый актив именно фиксинг. Подстановка рыночного курса однажды сместила вменённую доходность на четыре процентных пункта и подняла ложное «арбитраж сломан» — событийный слой поймал эту ошибку сам;
- ключи суточной истории.
Когда живой котировки нет вовсе, зона считается от официального курса, и заголовок панели говорит об этом словами.
Диагностика сходимости (обязательна к показу)
Каждый якорь выводится только вместе с: перцентилем текущего разрыва в его собственной истории, полураспадом (AR(1) на месячном ряду отклонения; для REER ≈ 15 мес) и каналом закрытия. Канал для REER помечен как смешанный: валидация показала, что отклонение предсказывает будущий сам REER (IC −0,22…−0,36), но не номинальный курс — значит разрыв закрывается движением курса, движением якоря через инфляцию, или не закрывается годами.
5. Что панель сознательно не делает
- не выдаёт торговых сигналов и вердиктов;
- не обещает сходимости к якорю;
- не показывает совпадающие индикаторы как опережающие (RUSFAR CNY подписан как совпадающий явно — это результат опровержения, а не осторожность);
- не подменяет протухший вход вчерашним значением: устаревший источник помечается и выпадает из агрегата.
6. Ловушки данных, оплаченные ошибками
- Официальный курс с датой действия D зафиксирован в 15:30 предыдущего рабочего дня. Смешение баз втрое исказило главный эффект в исследовании. Панель работает только на базисе даты фиксации; последний день календаря остаётся пустым, а не заполняется вчерашним значением.
- Фактические нефтегазовые доходы месяца M публикуются в начале M+1. Привязка к анонсу самого месяца создавала «находку» IC = −0,395, которая после исправления выравнивания превратилась в −0,106, то есть в шум.
- Экспирация фьючерсов Si — третий четверг месяца, а не конец месяца. Ошибка завышала срок до погашения на ~13 дней и ломала аннуализацию базиса.
- Браузерный User-Agent обязателен для minfin.gov.ru и ЯДОВИТ для FRED: с ним FRED уходит в бот-проверку и висит до таймаута, без него отвечает за 0,8 с.
- ISS отдаёт историю страницами по 100 строк. Без пагинации ряд молча обрезается и выглядит целым.
- Бесплатный ISS отдаёт срочный рынок с задержкой в 15 минут. Замер 14.08.2026 в 09:51 МСК: у ВСЕХ контрактов Si
UPDATETIME=09:36:11приSYSTIME=09:51:11. ПолеSYSTIME— часы сервера, а не время котировки, и принять одно за другое легко. На цене это 0,19%, на вменённой девальвации — до 2 п.п. годовых (см. §11). - У шлюза T-Invest один базовый актив
USD/RUBносят контракты РАЗНОГО масштаба. Квартальный Si котируется пунктами (84803 = 84,803 ₽/$), а мини-контракты UM\* и вечный USDRUBF — рублями за доллар (84,3). ПолеbasicAssetSizeне различает их: у Si и у USDRUBF оно одинаковое (1000). Ошибка множителя дала бы 0,0848 вместо 84,8 и прошла бы молча везде, кроме вменённой девальвации, поэтому отбор идёт по двум признакам сразу, а живая цена дополнительно сверяется с ценой ISS в пределах 5%. - P2P-объявления — не курс, и на панели их НЕТ. Покупка и продажа расходятся на 20%+ (95,2 против 77,4 в замере 12.08.2026): это разные лимиты, способы оплаты и наценки мейкеров, а не два конца стакана. Середина между ними не значит ничего, ширина — тоже (она меряет разнородность объявлений). Показатель, который нельзя истолковать, хуже отсутствующего, поэтому блок удалён целиком; из крипто-сегмента осталась Rapira, у которой есть настоящие bid/ask.
Полные результаты проверки — ruble-drivers/validation/VALIDATION.md; проект движка и формулы — ruble-drivers/ENGINE.md.
7. Что изменил адверсариальный аудит 13.08.2026
Тринадцать агентов атаковали панель собственным кодом; скептики опровергали находки, судья разрешал споры своим прогоном. Подтверждённое и исправленное:
| Что было | Чем оказалось | Как сейчас |
|---|---|---|
| «Полураспад 11/16/27 мес» как измеренная скорость возврата | Артефакт конструкции: dev строится на перекрывающихся окнах, и AR(1) меряет перекрытие. У случайного блуждания та же процедура даёт 9,5/19,2/24,7 мес — наблюдаемые значения лежат ВНУТРИ коридора шума | Печатается вместе с коридором нуля и подписью «НЕ отличим от шума»; при отсутствии реверсии — прочерк, а не приор 15 |
| Полоса «межквартильный размах» | Накрывает 46/33/15% истории вместо подразумеваемых 50%: медиана отклонения у структурного окна −9,2%, и уровень «REER равен своей средней» в эпоху плавания почти не посещался | Рядом с полосой печатается измеренное покрытие и типичное отклонение |
| Отказ ряда юаня ЦБ | Молча выключал новкаст-мост: заголовочный разрыв уезжал с −6,4% на −14,9% при «здоровой» панели | Якорь без моста получает статус degraded и в зону не входит |
| «Оценка следующего фиксинга» | Целилась в курс, который ЦБ уже опубликовал: история биржи отстаёт на сутки | Называется сверкой, печатает дату цели и расхождение с фактом |
| Кросс-юаневый разрыв | Считался на трёх датах сразу; чистый рассинхрон давал 0,75 п.п. при пороге 2 п.п., а суточный ход курса превышает 2% в 5% дней текущего режима | Все три ноги берутся на одну дату закрытия биржи |
| Флаг правдоподобия цены Urals | Вычислялся и игнорировался: цена 20 $ давала якорь 272 ₽ и зону [85; 272] | Не прошедшая проверку цена = отсутствие цены; в кэш не пишется |
| «Медиана четырёх независимых якорей» | Медиана трёх окон одного ряда: REER имел вес 3:1, и пока нефть дороже 60,43 $, фискальная концепция на центр не влияла вовсе | Центр = медиана КОНЦЕПЦИЙ (окна REER свёрнуты в одно значение) |
| Протухшая цена Urals | Считалась такой же точной, как свежая публикация | Ошибка растёт с лагом: 1,8 / 3,4 / 3,3 $ на лагах 1/2/3 месяца |
series/anchors.json | Обнулялся одной неудачей чтения: 300 точек превращались в одну без предупреждения | При неудаче чтения ряд не трогается вовсе |
| Прямой запуск тестов | Собирал 25 инвариантов из 34: точка входа стояла в середине файла | Точка входа в конце; оба способа запуска дают 42 |
Что проверено и НЕ сломано: арифметика всех якорей воспроизведена независимым кодом до 10-го знака; ярусы источников REER (BIS и FRED) совпадают до 0,000000%; утечек будущего в деэтрендировании и лампе риска нет; краткосрочная регрессия жива вне выборки (walk-forward R² 0,387 против 0,468 внутри); медиана защищает центр от съехавшего якоря; периметр /data/ не отдал ни одного 200 с вёрсткой и ни одной утечки; CSP реальна.
Вторая волна правок того же аудита
| Что было | Чем оказалось | Как сейчас | ||
|---|---|---|---|---|
| Паспорт свежести | Пустой ответ источника (None/{}/[]) давал «возраст 0, свежий»: молча замолчавший источник зеленел ярче работающего | Пустой ответ = unavailable; недоступный Algopack отвечает названной причиной, а не пустотой | ||
| «Протухший вход выпадает из агрегата» (METHOD §5) | Обещание исполнялось только на бумаге: слова stale в compute/ не было вовсе, фильтр существовал, статус ему никто не ставил | Паспорт прокинут в якорь; протухший вход даёт status=stale и выпадает из зоны | ||
| Возрасты на странице | Все до одного приходили из файла — снимок вчерашнего дня показывал «возраст 0» и выглядел свежим. Мёртвый конвейер не отличался от живого | Возраст снимка считается в браузере от as_of; старше 30 ч — красный баннер поверх заголовка | ||
Поле events контракта | Считалось ПОСЛЕ r2.put — в проде поля не было ни разу, а падение событийного слоя оставляло свежие данные и прогон с кодом 2 | Считается до сериализации, обёрнуто в try; худший исход — молчание в журнале | ||
| Дата фиксации | Отсчитывалась рабочими днями назад и на праздниках промахивалась: 9 дат за 10 лет давали коллизию history/{дата}.json с разными курсами | Берётся из самого ряда: ЦБ ставит один курс на весь нерабочий отрезок, и календарь праздников уже закодирован в данных | ||
| Новкаст-мост | Двигает только номинал и теряет ногу разницы инфляций: занижение 0,62% (t = −3,75 на 128 парах) | Поправка применена и опубликована полем bias_pct — её видно и можно вычесть обратно | ||
n_hist 366/330/270 | Указывало не на ту выборку, а независимых наблюдений 6–16: соседние точки строятся на окнах, перекрытых на window−1 месяцев | Рядом с перцентилем печатается n_eff — сколько наблюдений независимы | ||
gap_percentile | Считался перцентиль ОТКЛОНЕНИЯ REER, а разрыва — зеркальный (сумма ровно 100): 83 означало «рубль дорог», а не «разрыв велик» | Переименован в dev_percentile | ||
| Покрытый паритет | Простая разность ставок против геометрической аннуализации рядом: завышение \ | CIP\ | на 0,35 п.п. = 11,6% порога слома. Плюс п.п. печатались со знаком «%» | Обе ноги геометрические, единицы подписаны п.п. |
| Карточка фьючерсов | Печатала последний контракт кривой: открытый интерес 768 против 9,7 млн у ближнего, разница вменённой ставки 2,31 п.п. | Конвейер помечает ликвидный контракт, витрина берёт его | ||
| Полоса краткосрочного слоя | Стояла на остатке своей же регрессии — на 14% уже правды | Строится на ошибке вне выборки; r2 подписан in_sample | ||
fix_gap_pct | Детрендированный остаток под именем сырого разрыва: 0,414% против 0,509% | fix_gap_detrended_pct рядом с fix_gap_raw_pct — читатель воспроизведёт сам | ||
| 01.01.2027 | Фискальный якорь исчез бы молча (в таблице бюджетных цен нет 2027 года), веер сузился бы с 7,9% до 5,5% — и сузился бы под подписью «якоря согласны» | Отказ называет причину; смена состава якорей даёт событие | ||
| VWAP Algopack | 22.06.2026 все 108 баров пришли со сдвигом масштаба в 1000 раз; реконструкция опубликовала бы доллар 0,073 ₽ с подписью «типичная ошибка 0,096%» | Сверка с медианой цен закрытия того же среза, допуск 5% | ||
/DATA//data.json | Уходил к статике за HTML-404: статус верный, тело — вёрстка там, где просили данные | Разбор пути под /data/ не зависит от регистра | ||
| Журнал спредов | 400 строк при такте в 2 часа = 33 суток памяти: скачок премии на 8 п.п. держал режим «разорван» 16 суток, на 17-е база догоняла | 90 суток | ||
brent_live | Собирался и не потреблялся нигде, а оценка цены Urals считалась по ряду FRED с лагом 1–2 дня | Домешивается в ряд на своей дате |
Инвариантов после обеих волн: 58, оба способа запуска дают одно число.
8. Финальный аудит 13.08.2026 и что он изменил
Тридцать один агент по пятнадцати направлениям: независимый пересчёт всего, что панель печатает; инъекция отказов в каждый из девятнадцати входов; мутационная проба тестового сьюта; живые пробы периметра; проверка VPS. Скептик на каждый пакет находок, судья со своим прогоном поверх.
Ядро счёта устояло. Все три REER-якоря, фискальный якорь, агрегат, оценка фиксинга, геометрия CIP и периметр /data/ воспроизведены независимым кодом побитово; прод сверен с ЦБ, Мосбиржей, FRED и BIS напрямую.
Числа, которые панель искажала
| Что | Чем оказалось | Как сейчас |
|---|---|---|
| «Спред стакана 0,50 коп» | Поле spread_l1 Algopack — БАЗИСНЫЕ ПУНКТЫ, и они печатались как копейки без конверсии: 0,5 б.п. при цене юаня 12,28 ₽ это 0,061 копейки. Завышение в восемь раз каждый день | Конвейер переводит б.п. в копейки по цене того же дня; базисные пункты показаны рядом для сверки с источником |
| Премия USDT | Делилась на ВЧЕРАШНИЙ фиксинг (лишние 0,78 п.п.), тогда как журнал замеров копил базу на действующем курсе. С накоплением 60 наблюдений разъехавшиеся базисы начали бы двигать классификацию режима | Два знаменателя вместо одного: кросс-разрыв на фиксинге своей даты, премия канала — на действующем курсе |
| «Все ноги разрыва на одной дате» | Мировой курс брался из FRED DEXCHUS — недельного релиза H.10, и фолбэк «последняя дата не позже нужной» срабатывал КАЖДЫЙ прогон, подставляя ногу четырёхдневной давности | Дневная история (Yahoo CNY=X, 11 баров) с попаданием в свою дату; остаточный рассинхрон публикуется числом и печатается на витрине |
| Обучающая выборка краткосрочного слоя | Скан «до пяти дней вперёд» приписывал торговому дню 29.04.2024 курс, зафиксированный 02.05 — четверо суток ЗАГЛЯДЫВАНИЯ ВПЕРЁД, тринадцать таких дней; плюс тринадцать вырожденных пар с нулевым изменением | Точное правило: курс дня T действует с T+1. Совпало со старым на всех общих датах, отбросило ровно те дни, у которых фиксинга не было. Бета выросла 0,93 → 0,97, R² 0,47 → 0,50 |
Что сломалось бы предсказуемо
«Слом арбитража» каждый квартал. CIP считался по ближнему контракту Si, а срок ближнего доходит до 5 дней: аннуализация 365/dte превращает вечерний рассинхрон «фьючерс 23:50 против фиксинга 15:30» в десятки пунктов. Сдвиг цены 0,3% даёт +3,3 п.п. при сроке 36 дней и +43 п.п. при сроке 5. Ретро-прогон предэкспирационного SiM6 пробил порог во всех восьми сессиях с разбросом −24…+48 п.п. Теперь база — самый ликвидный контракт со сроком не меньше 60 дней, а рядом с числом печатается разрешение измерения (во что превращается типичный рассинхрон на этом сроке).
Фискальный якорь в первые дни месяца. Ряд Brent в FRED отстаёт от 2 до 9 дней, и среднее целевого месяца считалось по обрезанному хвосту: июль по 18 дням из 23 дал 59,69 $ против 61,88 $ — ошибка 2,19 $ при печатаемой 1,8 $, то есть +3,2 ₽ на якоре. Живая котировка дыру не закрывает по построению: она датирована следующим месяцем и в среднее целевого не попадает вовсе. Теперь неполнота месяца измеряется и честно расширяет заявленную ошибку.
Дата фиксации. Правка предыдущего круга отматывала серию одинаковых значений, полагая, что ЦБ ставит курс на каждый день нерабочего отрезка. Замер на 2840 записях за 11,5 лет: записей на нерабочие дни нет вообще, понедельников среди дат действия ноль, суббот 562. Зато курс двух соседних рабочих дней иногда совпадает — и отмотка датировала фиксацию сутками раньше, затирая чужой снимок дня. Правильное правило элементарно: дата фиксации = дата действия минус день.
Надёжность
Тревожная цепь была мертва трижды: OnFailure стоял в секции [Service], где systemd его не читает (журнал VPS нёс предупреждение на каждом запуске), юнита dash-alert@ на машине не существует, а notify.report_failure был написан и не вызывался ниоткуда. Теперь мостик подключён обоими юнитами через ExecStopPost (он срабатывает и на успехе, поэтому «прогон снова проходит» тоже доезжает), а падение прогона дополнительно зовёт report_failure — два независимых пути.
Прочее закрытое: база сравнения событий продвигалась ДО публикации, и переход зоны, случившийся в такт с отказом R2, терялся навсегда; один NaN от Yahoo ронял всю публикацию (bool(nan) истинно, и truthiness-гварды его пропускали); отрицательная цена фьючерса давала комплексные числа и роняла сериализацию; фильтры правдоподобия Algopack отключались при пустых полях; кэш цены Urals отравлялся при недоступном Brent (пропущенная проверка считалась пройденной); пустое тело ответа R2 стирало накопленный ряд зоны.
Тесты
Мутационная проба судьи: пять нарочных багов проходили сьют зелёными, включая флип знака поправки моста и снос центрирования полосы. Причина одна — тесты сверяли исходник с самим собой (подстрока, константа) вместо проверки поведения. Заменено поведенческими: знак поправки задан физикой, а не значением константы; «якорь лежит внутри своей полосы» проверяется на трендовом ряду, где мутация видна; build_snapshot впервые вызывается тестом целиком на фикстурах. Инвариантов 74; повторная мутационная проба ловит 10 из 10.
9. Третья концепция: тренд по собственной истории курса
Добавлена 14.08.2026. REER смотрит на реальный курс, фискальный якорь — на бюджет, третья концепция — только на цену: где проходит линия, описывающая последние 60 месяцев в логарифмах.
Почему скользящее окно, а не то, что напрашивается
Сравнивались пять оценок на 225 месячных наблюдениях с декабря 2007.
| оценка | уровень | почему не она |
|---|---|---|
| тренд с изломом | 89,7 ₽ | ищет излом по ВСЕЙ выборке, то есть глядя в будущее; с 2017 по 2021 уверенно называл изломом 2011–2013 годы с наклоном, зеркальным правде, и перевернулся только в январе 2022. При двух разрешённых изломах BIC предпочитает другую структуру и другой уровень (86,4) |
| окно 60 мес, Хьюбер | 87,2 ₽ | глушит выбросы, но на валютном рынке крупное движение — не помеха измерению, а сам рынок: в феврале–июне 2015 хьюберовская линия шла на 9–13% ниже, потому что приглушила девальвацию 2014 года |
| экспоненциальные веса | 88,8 ₽ | никогда не забывает полностью: через 60 месяцев после смены режима разрыв застревал на −25,7% |
| Калман (локальный линейный тренд) | 81,7 ₽ | при подборе по максимуму правдоподобия уровень схлопывается РОВНО в цену: у курса нет шума наблюдения, поэтому разрыв тождественно нулевой. Любой другой ответ навязывается руками и им же определяется — от 79,9 до 102,4 ₽ на одних данных. Плюс наклон состояния инерционен: через 60 месяцев после смены режима разрыв доходил до −72% и продолжал расти |
| окно 60 мес, МНК | 87,6 ₽ | выбрано |
Скользящее окно забывает полностью и точно за окно, прошлое не переписывает по построению, а длина 60 лежит на плато устойчивости: окна 48–84 дают 85–88 ₽ и только 36 выпадает (76 ₽, знак разрыва переворачивается).
Чего эта концепция НЕ делает
Не предсказывает. Плацебо на 2000 случайных блужданиях той же длины, дрейфа и волатильности: отклонение от линии не несёт информации о будущем ни на одном горизонте от 3 до 36 месяцев — факт внутри полосы шума везде, включая IC −0,31 на двух годах, который обычная формула оценивает как «p = 0,000». Полураспад отклонения (11 мес) тоже внутри коридора шума [5; 17] и печатается вместе с ним.
Центр зоны — среднее концепций, а не медиана
При трёх концепциях медиана есть ОДНО из трёх значений, два других отбрасываются. Замеры: в спокойном режиме медиана шумнее среднего в 1,16 раза (СКО ошибки 3,02% против 2,60%), а «кто в середине» менялся семь раз за 104 месяца, и в момент смены центр прыгает скачком.
Робастность медианы при этом нужна — но получать её МОЛЧАНИЕМ нельзя. Медиана скрывает сломанный якорь: при отравленном фискальном якоре 272 ₽ она показала бы нормальный центр и не сказала бы ни слова. Поэтому отбраковка сделана явной: концепция дальше 40% от медианы концепций исключается и называется в center_rule. Порог откалиброван по истории — 99-й перцентиль отклонения концепции от медианы 27,5%, максимум 33,3%, а задокументированные аварии панели давали 200% и больше.
10. Долгосрочная линия с 2008 года: почему ориентир, а не якорь
Наблюдение верное и заслуживает проверки: на логарифмическом графике нижняя граница тянется с 2008 года, держалась до 2014-го, а сейчас курс подошёл к ней вплотную. Если у государства есть воля и средства не давать рублю укрепляться, такая граница обязана существовать.
Проверено тремя способами, и все три говорят одно.
Опорное свойство держалось валютным КОРИДОРОМ, а не рынком. Курс проводил у нижней границы (в пределах 5% над ней):
| режим | доля времени | полоса шума | вердикт |
|---|---|---|---|
| до ноября 2014 (управляемый) | 35 % | 8 … 33 % | вне полосы — эффект настоящий |
| после ноября 2014 (плавающий) | 5 % | 4 … 13 % | внутри полосы — эффекта нет |
Граница была свойством политики, которую отменили в ноябре 2014 года. Ровно то событие, которое отмечено на графике как смена режима, эту границу и убрало.
Отскок от границы не подтверждается. Средний ход после подхода к границе против хода из середины канала: +10,4 % на полугоде, +19,4 % на годе, +39,0 % на двух. Плацебо на 1500 случайных блужданиях той же длины и волатильности даёт [+5,9; +19,7], [+8,7; +30,5] и [+8,9; +43,9] — факт внутри полосы везде. Причина механическая: граница подогнана по всей выборке, и «подошёл снизу, потом вырос» получается у любого дрейфующего ряда.
Это та же величина, что реальный курс. Корреляция «запаса над нижней границей» с логарифмом REER — −0,913 (ранговая −0,907). Линия на номинальном графике и реальный эффективный курс измеряют одно и то же на 91 %, но REER строится из отношения цен, а линия подгоняется. Добавить её концепцией значило бы дать реальному курсу двойной вес под видом независимого измерения.
Что при этом ПРАВДА. Механизм, который стоит за наблюдением, реален, и панель его уже показывает: REER сейчас на 82-м перцентиле собственной истории — рубль у сильного края своего реального диапазона. Фискальный якорь (92,17 ₽) — самый высокий из пяти, то есть бюджету нужен рубль слабее рынка. Оба числа говорят ровно то, что читается с графика, но говорят измеримо.
Решение. Линия дрейфа с 2008 года публикуется как точка-ориентир вида scenario — рядом с бюджетным курсом, прогнозом Минэка и консенсусом ЦБ. В расчёт центра ориентиры не входят никогда: это позиции и сценарии, а не концепции равновесия.
10.1. Чем проводится сама линия
Сравнивались четыре выражения на одном ряде (225 месяцев, логарифм курса):
| выражение | наклон, %/год | линия сегодня | устойчивость к концу выборки |
|---|---|---|---|
| МНК | +7,69 | 103,5 ₽ | 20,9 % |
| Тейл-Сен | +7,42 | 102,9 ₽ | 15,6 % |
| Хьюбер (RLM) | +7,82 | 103,7 ₽ | 18,3 % |
| медианная (L1) | +8,38 | 110,8 ₽ | 9,3 % |
Устойчивость к выбросам ничего не решает: выброс ноября 2014 — июня 2015 и марта — августа 2022 меняет уровень на 1,0–1,5 % у любого из четырёх. Решает устойчивость к концу выборки — последний столбец: если считать сегодняшний уровень по данным, обрывающимся в 2022 / 2023 / 2024 / 2025 годах, МНК гуляет на 20,9 %, а медианная линия — на 9,3 %. Ориентир, который переезжает с каждым новым месяцем, ориентиром не является.
Вторая причина смысловая: остаток вокруг линии несимметричен (асимметрия +0,40, Шапиро-Уилк W = 0,973, p = 0,0003 — нормальность отвергается). При несимметричном остатке МНК описывает *среднее логарифма*, тогда как «где курс обычно был» — это *медиана*. Расхождение между ними и есть цена выбора: 103,5 против 110,8 ₽.
Реализация — итеративное перевзвешивание (веса 1/|остаток| превращают взвешенный МНК в минимизацию суммы модулей), стандартная библиотека, без зависимостей. Сверено с эталонной реализацией statsmodels.QuantReg(q=0.5): коэффициенты совпадают до седьмого знака, сумма модулей остатков не хуже эталонной.
На замере 14.08.2026 линия даёт 110,8 ₽ при наклоне +8,4 % в год на 224 месяцах. Уровень по-прежнему зависит от выбора начала выборки — 87 ₽ при старте с 2020 года против 111 ₽ с 2008-го, — и это ещё одна причина держать её ориентиром, а не якорем.
11. Что на панели живое, а что из снимка
Конвейер собирает снимок дважды в рабочий день (13:15 и 16:10 UTC). Якорям равновесия этого с запасом: REER выходит раз в месяц, бюджетное правило — раз в год. Но две величины двигаются внутри дня, и обе выведены из суточного такта отдельными каналами.
Рыночный курс — раз в 15 секунд
Браузер опрашивает функцию-посредник /quote (напрямую нельзя: политика CSP connect-src 'self' и отсутствие CORS у сканера) и пересчитывает на каждый тик разрыв, границы зоны, центр, значения и полосы всех якорей.
Пересчёт возможен потому, что значение якоря аффинно по курсу: значение = a + b · курс, причём b ≠ 1 — новкаст-мост частично гасит движение спота. Коэффициенты считает конвейер ЧИСЛЕННО: весь набор якорей считается второй раз на курсе +1%. Способ вызывает ровно ту реализацию, которую описывает, и разъехаться с ней не может.
Витрина проверяет коэффициенты ДО первого тика: подставляет опорный курс и сверяет с опубликованными центром и разрывом. Не сошлось — живого слоя нет вовсе, на экране остаётся снимок и надпись «живой канал молчит». Три неудачных опроса подряд дают ту же надпись.
Две оценки одного и того же курса
Плиток про завтрашний официальный курс на панели ДВЕ, и это не дублирование:
| плитка | что делает | когда работает |
|---|---|---|
| «Оценка следующего фиксинга» | регрессия: вечерний разрыв «биржевой юань против фиксинга» переносится в завтрашний курс | в любой момент; это единственный эффект уровня A из §3 |
| «Фиксинг определён» | реконструкция: курс УЖЕ определён сделками до 15:30 МСК, и панель считает его по тому же срезу | после 15:30 МСК, пока ЦБ не опубликовал |
Первая — прогноз, вторая — не прогноз вовсе: она восстанавливает уже случившееся. Обе печатаются с полосами, и полосы пересекаются; расхождение точечных значений внутри полос — норма, а не признак поломки.
Маршрут сменился: считаем по самому внебиржевому курсу (12.09.2026)
Решение от 01.09 отменено замером. До 12.09.2026 панель восстанавливала курс через биржевой юань, и на то была причина: у внебиржевого доллара нет ИСТОРИИ. Сканер TradingView отдаёт только «сейчас», сайт Finam закрыт JS-челленджем, у Мосбиржи прямых торгов долларом нет с 2024 года. Поэтому панель начала копить собственный ряд — замер раз в три минуты до среза, — и сравнение отложили до того, как ряда хватит.
Ряд накопился (20 торговых дней), и сравнение перевернуло вывод:
| маршрут | медиана \ | ошибки\ | среднее | 95-й перцентиль | доступность | |
|---|---|---|---|---|---|---|
| внебиржевой: среднее FX_IDC в окне ЦБ | 0,040 % | 0,093 % | 0,296 % | 20 из 20 дней | ||
| юаневый: биржевой юань × мировой кросс | 0,088 % | 0,110 % | 0,469 % | 15 из 20 дней |
Промежуточный вывод 01.09 («юань точнее: 0,096% против 0,129%») был артефактом окна усреднения: считалось по всем накопленным замерам, то есть с 07:00 МСК, а ЦБ берёт срез с 10:00. Окно не подобрано задним числом, а измерено — сетка начал даёт гладкий минимум ровно на 10:00:
| начало окна, МСК | 07:00 | 09:00 | 10:00 | 11:00 | 13:00 | ||
|---|---|---|---|---|---|---|---|
| среднее \ | ошибки\ | 0,188 % | 0,128 % | 0,093 % | 0,099 % | 0,141 % |
Публичное сообщение ЦБ называет только конец окна («по состоянию на 15:30»), поэтому начало — эмпирическое: так ведут себя данные. Усреднение обязательно: последний замер перед срезом вместо среднего даёт 0,215 %.
Второй довод сильнее первого: внебиржевой маршрут не зависит от платной подписки. 11.09.2026 Algopack отдал 401 — месячная подписка кончилась ровно через месяц после покупки, — и юаневый маршрут отвалился вместе с ним. Плитка в этот день исчезла бы; с внебиржевым маршрутом она остаётся.
Внебиржевые котировки идут и в праздник, поэтому маршрут сверяется с календарём дней фиксинга: ЦБ ставит курс в те же дни, когда торгует биржа. Без этого 4 ноября окно набралось бы, панель объявила бы «курс на 5 ноября», которого ЦБ не установит вовсе, и записала бы в журнал точности ошибку против курса соседнего дня. Сегодняшний день подтверждается датой торгов кривой Si: дневной ряд юаня доезжает только к вечеру, и требуй панель его — плитка каждый день теряла бы главное своё свойство, показывать курс раньше ЦБ.
Сверка с фактом идёт по ТОЧНОМУ правилу: курс, установленный в день T, действует с T+1, и запись на T+1 в ряду ЦБ существует тогда и только тогда, когда T был днём фиксации. Прежний скан «до четырёх дней вперёд» в праздники подставлял курс соседнего дня — то же заглядывание вперёд, от которого избавились в базисе фиксации (§6.2).
Юаневый маршрут никуда не делся: он стал сверкой. Два независимых пути к одному числу расходятся ровно тогда, когда сломан один из них; молчащая сверка означала бы, что поломку заметят по факту, а не по расхождению. Точность каждого маршрута копится в СВОЁМ журнале — смешать их значило бы усреднить два разных метода.
Почему юаневый маршрут вообще появился
У юаня же всё наоборот: биржевой VWAP до 15:30 — это в точности тот срез, по которому ЦБ считает официальный курс юаня, и он воспроизводится с ошибкой 0,010%. Цена этого пути — мостик от юаня к доллару, в котором сидит вся неточность.
Измеренные альтернативы (одни и те же 40 дней, замер августа 2026):
| путь | медиана модуля ошибки | СКО |
|---|---|---|
| юань × мировой курс юаня (сейчас на панели) | 0,220 % | 0,322 % |
| вечный фьючерс USDRUBF минус его медианный базис | 0,162 % | 0,206 % |
| внебиржевой доллар до 15:30 | не проверено — нет ряда | — |
Вечный фьючерс — единственный биржевой инструмент на пару USD/RUB, и он немного точнее, но требует поправки на базис, который сам гуляет от −0,45 % до +0,64 %. Разница слишком мала, чтобы менять метод ради неё.
Так и вышло: панель копила собственный ряд внебиржевого курса — замер раз в три минуты до среза, тем же таймером, что обновляет цену фьючерса, — и метод выбран по замеру, а не по соображениям (см. выше).
Точность реконструкции курса ЦБ
Плитка «Фиксинг определён» показывает курс, который ЦБ опубликует через два часа: сделки до 15:30 его уже определили. Считается он в два шага, и точность у шагов разная.
Юаневая нога честна. Средневзвешенная цена биржевого юаня по сделкам до 15:30 воспроизводит завтрашний официальный курс юаня с медианной ошибкой 0,010%.
Долларовая нога — слабое место, и подпись о ней была занижена вдвое. Доллар получается из юаня умножением на мировой курс USD/CNY. Но ЦБ считает курс доллара по ВНЕБИРЖЕВЫМ сделкам, а курс юаня — по биржевым, и отношение двух его собственных курсов — как раз та величина, которую реконструкция вынуждена угадывать. Отношение гуляет: за 148 дней 2026 года медиана суточного дрейфа 0,174%, СКО 0,255%, 95-й перцентиль 0,485%. Быть точнее того, что угадываешь, нельзя.
Прямой замер кроссовой ноги — мировой курс дня торгов против вменённого курса ЦБ следующего дня, 115 дней:
| мера | значение |
|---|---|
| медиана | −0,099 % (систематический сдвиг вниз) |
| медиана модуля | 0,134 % |
| СКО | 0,182 % |
| 95-й перцентиль модуля | 0,433 % |
Раньше на плитке стояло «калибровочная ошибка 0,096% по доллару» и одно число без интервала. При 84 ₽ настоящая типичная ошибка — около 11 копеек, а хвост доходит до 36. Теперь печатается полоса, накрывающая 95% дней замера, а рядом названа настоящая типичная ошибка. Собственные сверки панель копит и, когда их станет двадцать, начнёт печатать измеренную по ним точность вместо этого приора.
Всё сказанное здесь — про ЮАНЕВЫЙ маршрут, который с 12.09.2026 работает сверкой. У основного, внебиржевого, неточность другой природы: он меряет ровно ту величину, которую считает ЦБ, и вся его ошибка — это разница между составом сделок в отчётности банков и индикативной котировкой FX_IDC. Замер: медиана 0,040 %, среднее 0,093 %, 95-й перцентиль 0,296 %, смещение +0,028 % — при 84 ₽ это около 3 копеек типично и 25 копеек в хвосте.
Цена фьючерса — раз в три минуты
Плитка «что в цене фьючерсов» печатает не цену, а вменённую девальвацию, и аннуализация 365/dte умножает любую ошибку цены. Пятнадцать минут задержки ISS (§6.6) дают на ближнем контракте (34 дня) 2 п.п. годовых, а на базе паритета (125 дней) — 0,5 п.п., то есть 58% от разрешения измерения ±0,88 п.п., которое панель печатает рядом с числом. Вторая задержка была больше первой: к утру пятницы на панели стояла цена вечера четверга, а после выходных — до 66 часов давности.
Поэтому цена берётся из T-Invest (котировка отмечена текущей секундой), а состав кривой, срок и открытый интерес — по-прежнему из ISS: у шлюза их нет, а за пятнадцать минут они не меняются. Отказ любого из двух деградирует честно: без T-Invest остаётся ISS со своей задержкой; без ISS кривая собирается целиком из T-Invest, но без открытого интереса, и выбор ликвидного контракта вырождается в первый по сроку.
Этот канал идёт НЕ через Cloudflare, и это вынужденно. Цепочка сертификатов T-Invest упирается в Russian Trusted Root CA Минцифры, которого нет ни в одном публичном хранилище, а в TLS-хранилище Workers свой корень добавить нельзя. Проверено с прода: curl отдаёт код 000 и ssl_verify_result=19 — это не блокировка по IP, а непройденная проверка цепочки. За фьючерсом ходит VPS и кладёт котировку отдельным маленьким объектом; браузер читает его раз в минуту и пересчитывает вменённую девальвацию той же формулой и от того же официального курса, что и конвейер, — чтобы одна арифметика не жила в двух местах.
Живая цена принимается, только если она СВЕЖЕЕ уже нарисованной, а время котировки печатается рядом. В выходные и до открытия торгов на плитке честно стоит «цена на 18:45» с датой.
12. Как читать веер
График — строка на величину, а не двенадцать марок на одной оси. Так сделано не для красоты: подписи на общей оси не помещались и уезжали ступеньками в три ряда, REER 60 мес и трендовый якорь расходятся на 0,2 ₽ (два пикселя), а один далёкий ориентир растягивал ось так, что зона и курс занимали четверть холста.
Что кодируют марки:
- точка на строке — якорь равновесия, он строит зону;
- отрезок с засечками — полоса неопределённости ЭТОГО якоря;
- полая точка — ориентир: бюджетный курс, прогноз Минэка, консенсус ЦБ, дрейф с 2008 года. В центр ориентиры не входят никогда;
- вертикальные линии подписаны все три: рыночный курс, официальный, центр зоны;
- уголок у края — значение за пределами шкалы; точное число стоит в столбце справа. Марка при этом НЕ рисуется: кружок у края читался бы как «значение здесь».
Шкала строится по ядру — якоря со своими полосами, зона, центр и курс. Ориентир попадает в окно, только если стоит рядом с ядром; далёкий прижимается к краю. Границы окна округляются до рубля, иначе живой тик двигал бы ось каждые пятнадцать секунд.
13. Слом паритета: отклонение от своей базы, а не уровень от нуля
Детектор «слома арбитража» сравнивал CIP с нулём при пороге ±3 п.п. Замер на 148 торговых днях (февраль–август 2026, реальные истории RUONIA и SOFR) показал, что ноль здесь — выдумка учебника: структурная база сама гуляла от −5,5 п.п. (апрель) до +2,4 (июнь) вместе со ставкой RUONIA (18,5% → 13,7%), и детектор горел 51% дней — 52 события за семь месяцев. Поднять порог не лечит (±4 п.п. → 39% дней): любой фиксированный порог от нуля молча перекалибровывается политикой ЦБ. Перекат базового контракта добавлял фантомный скачок −1,3 п.п. на ровном месте.
Слом теперь определён так: |CIP − медиана CIP этого же контракта за 60 торговых дней| больше полосы, где полоса = max(механическое разрешение, 95-й перцентиль |отклонений| внутри окна), с гистерезисом 0,7 на восстановление. База считается по собственной истории базового контракта — у нового контракта она есть задолго до того, как он станет базовым, поэтому перекат ряд не рвёт. Сегодняшняя точка в свою базу не входит.
На том же ряде: 11% дней в тревоге, 20 событий, и флагуются настоящие дислокации (19 мая −11,6 п.п., 19 августа −9,2), а не дрейф ставки. Та же конструкция уже лечила премию USDT — у неё структурная база тоже не ноль.
Уровень CIP остаётся на плитке как факт о сегментированном рынке; тревогу несёт отклонение от собственной нормы.
13.1. Премия крипто-канала: свой знаменатель и своя полоса
Панель меряет единство курса двумя измерителями, и у них РАЗНАЯ природа.
Кросс через биржевой юань — арбитражное тождество: биржевой юань, мировой кросс и официальный доллар одной даты обязаны сойтись. База здесь нулевая, её держит арбитраж, поэтому пороги абсолютные: 2 п.п. — «расходится», 5 п.п. — «разорван».
Премия крипто-канала USDT/RUB — не тождество, а издержки канала: в ней сидят комиссии, риск и премия за обход ограничений. Её структурный уровень не ноль и заранее неизвестен, поэтому судить по УРОВНЮ нельзя: панель кричала бы «курс расходится» каждый день.
До 12.09.2026 премия только показывалась и копила историю. В этот день набрались 360 замеров, она вошла в классификацию режима — и сразу обнажились два дефекта, невидимые, пока число было справочным.
*Знаменатель.* Премия делилась на ДЕЙСТВУЮЩИЙ официальный курс — тот, что ЦБ установил накануне в 15:30. Канал торгуется непрерывно, официальный курс стоит сутки, и в дни сильного хода рынка в премию попадал сам ход. 19-20 августа 2026 (курс 85,13 → 83,36) отклонение доходило до −3,7 п.п. при живом кросс-курсе около нуля: панель объявила бы расслоение рынка и расширила полосы всех якорей на ровном месте. Теперь знаменатель живой — биржевой юань через мировой кросс, тот же, которым панель сверяет рыночный курс, — и он пишется в журнал ВМЕСТЕ с замером: база и сегодняшнее значение обязаны жить на одном правиле.
*Линейка.* Вместо чужих 2 и 5 п.п. у премии собственная полоса — 95-й перцентиль
| отклонений | в окне из 270 замеров (месяц), не уже собственной ошибки |
|---|
знаменателя. Эта ошибка измерена: биржевой кросс расходится с внебиржевым эталоном на 0,109 п.п. по медиане и 0,391 в 95-м перцентиле (58 сверок с разрывом меньше четырёх минут), отсюда пол полосы 0,4 п.п. Гистерезис 0,7 душит дребезг у границы. По построению за полосой оказывается 5% замеров; замер сентября 2026 подтверждает: 13 из 270, одна смена режима за месяц.
Событие о смене режима называет измеритель, его отклонение и его полосу — одно и то же число у двух измерителей значит разное.
14. Состояние проверок
На 24.09.2026: тестов 252, мутационная проба ловит все нарочные поломки, с которыми её запускали (отсечка в фискальном якоре — 8 из 8). Проверки идут в CI на каждый пуш: разбор всех модулей и файлов витрины, отсутствие внешних зависимостей у конвейера, весь набор тестов. Два стража тишины валят сборку отдельно — «ноль тестов» и «тесты пропущены»: и то, и другое выглядит как успех, а означает, что проверок не осталось.
Проверки, которые стоит знать читателю, потому что они про честность вывода, а не про код:
- свежесть страницы считается в браузере, а не берётся из файла: снимок вчерашнего дня показывал бы «возраст 0» и выглядел свежим, а мёртвый конвейер не отличался бы от живого;
- баннер просрочки считает пропущенные СЛОТЫ расписания, а не часы: порог в часах давал ложную тревогу 38 часов каждые выходные, а детектор, который врёт еженедельно, перестают замечать к тому дню, когда он понадобится. У слота два разных запаса, и прежде они были одним: сколько ждать ПОСЛЕ номинальной минуты, прежде чем спрашивать за слот (таймер размазан, сборка и выгрузка идут ещё минуту-две), и насколько снимок может быть СТАРШЕ слота, оставаясь закрывающим его. Пока запас был один, баннер хоронил живой конвейер дважды в каждый будний день;
- число на плитке и его источник не разъезжаются: «единство курса» печатает максимум по измерителям с известной базой, и подпись обязана назвать того, кто этот максимум дал. Пока база премии USDT копилась, максимум всегда давал кросс-курс, и зашитая подпись «расхождение по кросс-курсу» была верна случайно — в день, когда премия вошла в классификацию, панель приписала кросс-курсу чужое число вместе с чужим объяснением про арбитраж;
- методика, которую вы читаете, сверяется с исходником: страница собирается из
docs/METHOD.md, хэш источника вшит в неё, и инвариант падает, если они разошлись; - смена методики и бюджетного года не выдаёт себя за рынок: обе сдвигают зону без движения курса, и в такой прогон переход через границу зоны событием не считается — вместо него приходит объяснение, на сколько сдвинулись якорь и центр. Тест держит и обратное: настоящий переход в обычный день не глушится.