Signal cards

Signal Card 1 · MVRV percentile

Version: v0.2 (window 1460 days, min history 730 days) · first used 2026-09-02 · owner: engine config

What it measures and why it relates to the regime

MVRV is the ratio of Bitcoin's market value (price × supply) to its realized value (every coin valued at the price it last moved on-chain). Realized value is the aggregate cost basis of all holders, so MVRV tells how far the market price sits above or below what holders paid. Historically MVRV is high near cycle tops (holders sit on large unrealised profit and start distributing) and low near bottoms (the average coin is under water and selling dries up).

The raw ratio is not comparable across cycles: peaks of 4–5 in 2013–2017 gave way to ~3 in 2021 as the market matured. We therefore use the rank percentile of today's MVRV inside a trailing four-year window (one halving cycle): "today's MVRV is higher than X% of the days in the last four years". Percentile makes the thresholds regime boundaries rather than magic numbers tied to one cycle.

Rule

mvrv_percentile = share of days d in the last 1460 days with MVRV(d) <= MVRV(today)

Regime boundaries (config v0.2, PROPOSED):

percentileregimebase BTC weight (before M2 modifier and k)
< 0.25ACCUMULATION1.00
0.25 – 0.75NEUTRAL0.80
0.75 – 0.90OVERHEATED0.50
≥ 0.90EUPHORIA0.20

CAPITULATION (price below realized price, see card 2) takes precedence over the percentile. If fewer than 730 days of history are available the signal is null and the engine holds.

Data source and frequency

Primary: Coin Metrics Community API, metric CapMVRVCur, daily (end of day UTC), free tier. Shadow source (B1): bitcoin-data.com mvrv, daily; divergence above 3% blocks the decision. Updated once per day after the UTC day closes; the engine acts on the last complete day.

Version history

Known limitations

nothing happens. Regime flips near a boundary are damped only by the 5 pp rebalance threshold.

absolute terms; the percentile normalises the level but not changes in the composition of supply.

possibly one-sided, sample.

previous window's range always reads as "≥ 0.90".


RU · Перцентиль MVRV

Что измеряет. MVRV — отношение рыночной стоимости биткоина (цена × предложение) к реализованной стоимости (каждая монета учтена по цене последнего ончейн‑движения). Реализованная стоимость — это совокупная себестоимость держателей, поэтому MVRV показывает, насколько цена выше или ниже того, что заплатили держатели. Исторически MVRV высок у вершин цикла и низок у дна.

Сырой коэффициент несопоставим между циклами (пики 4–5 в 2013–2017 против ~3 в 2021), поэтому мы берём ранговую перцентиль сегодняшнего MVRV внутри скользящего окна в четыре года (один цикл халвинга): «сегодняшний MVRV выше, чем в X % дней за последние четыре года».

Правило. Доля дней окна с MVRV ≤ сегодняшнего. Границы режимов (v0.2, предложение): < 0.25 — ACCUMULATION (вес 1.00) · 0.25–0.75 — NEUTRAL (0.80) · 0.75–0.90 — OVERHEATED (0.50) · ≥ 0.90 — EUPHORIA (0.20). CAPITULATION (цена ниже realized price) имеет приоритет. Меньше 730 дней истории — сигнал пуст, движок держит вес.

Источник. Coin Metrics Community API (CapMVRVCur), ежедневно; теневая сверка с bitcoin-data.com, расхождение выше 3 % блокирует решение.

Ограничения. Медленный сигнал: в долгом боковике перцентиль дрейфует просто от движения окна; реализованная стоимость учитывает потерянные монеты; окно не знает о начале нового цикла — первый выход выше диапазона окна всегда читается как «≥ 0.90».


Signal Card 2 · Realized price

Version: v0.2 · first used 2026-09-02 · owner: engine config

What it measures and why it relates to the regime

Realized price is realized value divided by circulating supply: the average on-chain cost basis of one bitcoin. When the market price falls below it, the average holder is at a loss. Such periods (2015, late 2018 – early 2019, mid 2022) have marked the deepest part of every bear market so far: forced sellers are exhausted, long-term holders are under water and stop selling. The engine treats "price below realized price" as its own regime, CAPITULATION, checked before the MVRV percentile.

Rule

realized_price = market_cap / MVRV / supply           (realized cap = market cap / MVRV)
price_below_realized = price < realized_price  →  regime CAPITULATION, base weight 1.00

The base weight is still subject to the trend gate (card 3): in a downtrend the engine will not *increase* its weight, so CAPITULATION does not mean buying a falling knife — it means the engine is allowed to be fully weighted once the trend turns.

Data source and frequency

Primary: Coin Metrics Community API — derived from CapMrktCurUSD, CapMVRVCur, SplyCur (the realized-cap metric itself is not in the free tier; the identity above is exact). Daily. Shadow source: bitcoin-data.com realized-price; divergence above 3% blocks the decision. Measured 2026-09-02: 53,087 (derived) vs 52,680 (bitcoin-data), 0.8% apart — different realized-cap methodologies, well inside tolerance.

Version history

Known limitations

reported (price_to_realized) but not used in the weight.

treatment); the shadow check tolerates 3%.

change and therefore a rebalance trigger (limited by the trend gate and the cost model).


RU · Realized price (реализованная цена)

Что измеряет. Реализованная стоимость, делённая на предложение: средняя ончейн‑себестоимость одного биткоина. Когда рыночная цена опускается ниже неё, средний держатель в убытке. Такие периоды (2015, конец 2018 — начало 2019, середина 2022) пока всегда были самой глубокой частью медвежьего рынка. Движок выделяет «цена ниже realized price» в отдельный режим CAPITULATION, который проверяется раньше перцентили MVRV.

Правило. realized_price = market cap / MVRV / supply; цена ниже — режим CAPITULATION, базовый вес 1.00. Вес по‑прежнему подчинён trend gate: при нисходящем тренде движок не *увеличивает* вес — это не покупка падающего ножа, а разрешение быть полностью в позиции, когда тренд развернётся.

Источник. Coin Metrics Community API (вывод из трёх бесплатных метрик, тождество точное); теневая сверка с bitcoin-data.com (замер 02.09: расхождение 0.8 %).

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


Signal Card 3 · Trend gate

Version: v0.2 (SMA 200) · first used 2026-09-02 · owner: engine config

What it measures and why it relates to the regime

Valuation signals (cards 1–2) say *where* price is relative to holders' cost basis; they say nothing about *whether the decline has stopped*. A cheap market can get cheaper for months. The trend gate is a coarse filter for that: the 200-day simple moving average of price is the most widely watched long-term trend line, and price below it is the textbook definition of a downtrend.

The gate is a gate, not a weight: it never sets the target, it only blocks *increases* of BTC weight while the trend is down. Reductions always pass. This protects against premature entry against the trend (docs/02 §2) without delaying risk-off decisions.

Rule

trend_up = price >= SMA200(price)
if trend_up is False and target_weight > current_weight:
    target_weight = current_weight        # increase blocked; the decision records gated = true

The gate applies after the regime target and the M2 modifier and after the k scalar.

Data source and frequency

Coin Metrics Community API PriceUSD (daily reference rate, end of day UTC). The SMA needs 200 days of history; with less the signal is null and the engine holds.

Version history

Known limitations

block an increase. Trades still need the 5 pp deviation or a regime change to trigger.

stay at its previous weight for a while after the low — accepted as the price of not catching knives. The backtest's Calmar advantage (docs/02) already includes this lag.

is fully explainable.


RU · Trend gate (трендовый фильтр)

Что измеряет. Оценочные сигналы говорят, *где* цена относительно себестоимости держателей, но не говорят, *остановилось ли падение*. Дешёвый рынок может дешеветь месяцами. Фильтр — 200‑дневная простая скользящая средняя: цена ниже неё — нисходящий тренд по учебнику.

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

Правило. trend_up = цена ≥ SMA200. Если тренд вниз и целевой вес больше текущего — цель ограничивается текущим весом, в решении пишется gated = true. Применяется после режима, модификатора M2 и k.

Источник. Coin Metrics PriceUSD, ежедневно; нужно 200 дней истории.

Ограничения. Пила в боковике; запаздывание — средняя разворачивается через месяцы после дна, и в CAPITULATION движок какое‑то время держит прежний вес (цена того, чтобы не ловить ножи); намеренно простое правило без фильтров наклона.


Signal Card 4 · M2 acceleration

Version: v0.2 (yoy 12 m, lag 3 m, deadband 0.25 pp, modifier ±10 pp) · first used 2026-09-02

What it measures and why it relates to the regime

Bitcoin has been the most liquidity-sensitive large asset: its big moves have followed turns in global money growth with a lag of a few months. Rather than the level of M2 (which only grows) the engine watches whether money growth is speeding up or slowing down — the second derivative. We use US M2 (seasonally adjusted) as the single, freely available, monthly proxy. It is a *modifier*, not a regime: it nudges the regime's base weight by ±10 percentage points, never overrides it.

Rule

yoy(t)    = M2(t) / M2(t − 12 months) − 1
accel(t)  = yoy(t) − yoy(t − 3 months)
state     = accelerating if accel > +0.25 pp · decelerating if accel < −0.25 pp · flat otherwise
modifier  = +0.10 / 0.00 / −0.10 added to the regime's base weight, clamped to [0, 1], before k

For a given day the engine uses the latest M2 observation dated on or before that day.

Data source and frequency

FRED series M2SL (Board of Governors, billions USD, SA), monthly, published with roughly a three-week lag, downloaded as CSV without an API key. Data errors or a missing series make the state null → modifier 0 (the engine does not guess).

Version history

Known limitations

which can differ slightly from what was known at the time. Accepted for the paper stage (DECISIONS D-07); a vintage feed is a candidate for a later config version.

old information; it is deliberately small (±10 pp) for that reason.

be long.


RU · Ускорение M2

Что измеряет. Биткоин — самый чувствительный к ликвидности крупный актив: его большие движения следовали за разворотами роста денежной массы с лагом в несколько месяцев. Движок смотрит не на уровень M2 (он только растёт), а на то, ускоряется или замедляется рост — вторую производную. Прокси — американский M2 (с сезонной корректировкой), единственный бесплатный месячный ряд. Это *модификатор*, а не режим: он сдвигает базовый вес режима на ±10 п.п. и никогда его не отменяет.

Правило. yoy = M2(t)/M2(t−12 мес) − 1; accel = yoy(t) − yoy(t−3 мес); ускорение при accel > +0.25 п.п., замедление при < −0.25 п.п., иначе плоско; модификатор +0.10 / 0 / −0.10 к базовому весу, с ограничением [0, 1], до умножения на k. Берётся последнее наблюдение с датой не позже дня сигнала.

Источник. FRED M2SL, месячно, лаг публикации около трёх недель, CSV без ключа. Ошибка данных — состояние пустое, модификатор 0.

Ограничения. Только США; FRED отдаёт ревизованный ряд без винтажей (принято для paper‑этапа, D‑07); месячный шаг и лаг — поэтому модификатор намеренно мал; связь ликвидности и BTC статистическая, 2022 год показал, что лаг бывает долгим.


Generated 2026-09-09T18:26:03Z from hash-chained records. Research paper track — not an offer, not investment advice. Commercial terms only after go-live and legal review.