# Дослідження 34 — межа ноги і підпис півота

| | |
| --- | --- |
| Пари | BTC_USDT + 5 монет |
| Клас | `клас210х10-1х7д/д` — шість відношень похідних плюс похідна ціни |
| Ряд подій | `train` + `val` разом, сітка `t_start` |
| Розмітка | зігзаг 2.3 % на ема10 `price_open`, ноги цілком, від півота до півота |
| Ноги | 531 нога шести монет, 465 суцільних стиків (півотів) |
| Статус | етапи 1–6 підтверджені, 2026-09-20; етапи 7 і 8 підтверджені, 2026-09-29 |
| Вкладка | [`/border`](http://localhost:8080/border) |
| Правила | [`01-data-and-db.md`](../../rules/01-data-and-db.md), [`02-markup.md`](../../rules/02-markup.md) |

## Ціль

Знайти **унікальну й універсальну ознаку півота** — таку, за якою можна
сказати, де нога починається і де закінчується, однаково для ніг росту
й ніг падіння.

Питання ставиться в три кроки:

1. **Чи дзеркальний клас.** Фічі стоять парами «покупці / продавці».
   Якщо ряд дзеркальний, ознака вершини має дорівнювати ознаці дна з
   переставленими парами. Тоді всі 531 нога міряються однією лінійкою.
2. **Де насправді стоїть межа.** Точку розвороту дозволено рухати:
   півот зігзага стоїть на ема10, а ема відстає. Якщо підпис класу
   найгучніший не там, де стоїть півот, — межу треба перенести.
3. **Чи ця ознака тільки на межі.** Підозра користувача: у кінці ноги
   росту продавці мають перебити покупців, і кінець ноги можна
   призначити так, щоб цей фінальний сплеск повністю лежав усередині
   ноги.
4. **Чим корекція відрізняється від межі.** Якщо той самий підпис
   стоїть і на повороті всередині ноги, треба знати, різниця це в
   явищі чи тільки в розмірі повороту.

Дослідження 30 (етапи 8 і 10) і 31 (етап 4) вже показали, що **край**
ноги видно, а **кінець** від **початку** не відрізняється. Тут той самий
клас читається інакше: пари фіч зводяться дзеркалом, а точка розвороту
не вважається заданою.

## Дані

| | |
| --- | --- |
| Датасет | `data/datasets/<PAIR>/class210x10m1x7dd/{train,val}.npz` |
| Побудова | `python3 rules/scripts/build_class210x10x7dc.py --pair <PAIR>` |
| Подія | `(9, 7)` — девʼять блоків по 21 с, сім фіч |
| Фічі | `d_up`, `d_down`, `d_resist_buy`, `d_bal_resist_buy`, `d_support_sell`, `d_bal_support_sell`, `d_price_avg` |
| Період | 2026-02-14 … 2026-09-07 |
| Монети | BTC, ETH, SOL, XRP, BNB, DOGE |

Ноги по монетах (нога з дірою в ряді понад годину або коротша за
60 подій у заміри не йде):

| монета | ніг | півотів |
| ------ | --- | ------- |
| BTC_USDT | 70 | 63 |
| ETH_USDT | 99 | 88 |
| SOL_USDT | 106 | 93 |
| XRP_USDT | 93 | 80 |
| BNB_USDT | 62 | 51 |
| DOGE_USDT | 101 | 90 |
| **разом** | **531** | **465** |

Півот тут — **стик двох сусідніх ніг, що йдуть підряд**. Якщо між ногами
викинута третя, стик не рахується: звідси 465 півотів на 531 ногу.

## Метод

    ряд подій монети -> ема10(price_open) -> півоти зігзага 2.3 %
    -> ноги -> 42 величини події -> ранги в межах монети
    -> дзеркало -> якір межі -> заміри

### Дзеркало

Відображення ціни (вгору ↔ вниз) переставляє фічі класу парами:

| фіча | пара при дзеркалі |
| ---- | ----------------- |
| `d_up` | `d_down` |
| `d_resist_buy` | `d_support_sell` |
| `d_bal_resist_buy` | `d_bal_support_sell` |
| `d_price_avg` | сама собі, зі зміною знака |

Звідси **власний** і **зустрічний** бік ноги: у нозі вгору власний бік —
покупці (`d_up`, `d_resist_buy`, `d_bal_resist_buy`), у нозі вниз —
продавці. Так нога росту й нога падіння лягають одна на одну, і питання
«чи більше продавців у кінці ноги росту» стає одним питанням для обох
напрямків: **чи перебиває зустрічний бік власний у кінці ноги**.

Попередні дослідження зводили ноги в один пул із **фіксованими**
покупцями й продавцями. Тоді ознака, дзеркальна за побудовою,
скорочується: те, що на вершині дає плюс, на дні дає мінус, і в пулі
лишається нуль.

### Величина події і ранги

Кожна фіча згортається по девʼяти блоках у шість параметрів — `mean`,
`first`, `last`, `peak`, `spread`, `slope` (як у дослідженні 30). Разом
7 × 6 = **42 величини на подію**.

Відношення похідних не мають скінченного розкиду, тому кожна величина
переводиться в **ранги серед подій ніг цієї монети**, двома кривими:
`ранг` (величина зі знаком) і `амплітуда` (ранг модуля). Усі заміри
нижче — на `амплітуда·mean`, якщо не сказано інше.

### Підпис місця

Одне число на подію, зведене з дослідження 31 (етап 4):

```
S = середнє(амплітуда d_up, d_down)
  − середнє(амплітуда d_resist_buy, d_support_sell,
            d_bal_resist_buy, d_bal_support_sell)
```

`S` **дзеркально симетричний**: при перестановці пар обидві половини
переставляються самі в собі. Тому він однаковий для вершини й дна і не
знає напрямку. Рівень `S` у тілі ноги — близько нуля (0.5 − 0.5).

### Бік розвороту

Одне число, **дзеркально антисиметричне**:

```
B = амплітуда(d_down) − амплітуда(d_up)
```

При дзеркалі `B` міняє знак: на вершині має бути додатний, на дні —
відʼємний.

### Якір межі

Точка розвороту ставиться чотирма способами, і всі заміри проходять на
кожному:

| якір | точка розвороту |
| ---- | --------------- |
| `none` | півот зігзага 2.3 % на ема10, як є |
| `open` | найвища (найнижча) `price_open` у вікні ±25 подій |
| `close` | те саме по `price_close` — ціні в кінці події |
| `oracle` | подія з найбільшим `S` у тому самому вікні — стеля |

Вікно пошуку ±25 подій — це ±1.5 години; лаг ема10 наперед не
закладається.

### Контролі

| контроль | від чого страхує |
| -------- | ---------------- |
| **корекція** | півот вкладеного зігзага 0.5 % усередині ноги, не ближче 40 подій до її країв, перенесений **тим самим** якорем. Підпис краю ноги вже відомий — питання, чи він тільки на справжній межі |
| **подія того самого руху** | 20 подій тіла ноги з найближчим рангом руху ціни. Страхує від того, що весь підпис — це просто велика подія |
| **перемішана мітка** | 500 перемішувань, найбільший \|z\| перебору щоразу |
| **випадкова верхівка** | 200 разів межі розкидаються по ряду навмання й міряється та сама верхівка |
| **по монетах** | кожен замір повторений на шести монетах окремо |

## Скрипти

| Файл | Що робить |
| ---- | --------- |
| [`scripts/mirror.py`](scripts/mirror.py) | спільний хід: ряд, ноги, ранги, дзеркало, якір, корекції, контролі |
| [`scripts/pivot_signature.py`](scripts/pivot_signature.py) | етапи 1–2: дзеркальний тест і хід підпису по зсувах |
| [`scripts/leg_border.py`](scripts/leg_border.py) | етап 3: чотири якорі, зсув, симетрія профілю, місце межі в нозі |
| [`scripts/pivot_side.py`](scripts/pivot_side.py) | етап 4: бік розвороту, `B` проти самої ціни |
| [`scripts/pivot_unique.py`](scripts/pivot_unique.py) | етап 5: межа проти корекції й тіла, верхівка ряду, розмір розвороту |
| [`scripts/inner_turn.py`](scripts/inner_turn.py) | етап 6: межа проти корекції пофічно, за формою, за околицею і за розміром |
| [`scripts/border_side.py`](scripts/border_side.py) | етап 7: дві моделі на подіях краю — бік межі й бік розвороту, три набори входів, два якорі, хід за відстанню від межі | `border_side.json` |
| [`scripts/border_edge.py`](scripts/border_edge.py) | етап 8: ті самі дві моделі з третьою відповіддю «не край» — навчання на всьому тілі ноги, верхівка ряду, пороги, корекції як тверді негативи | `border_edge.json` |
| [`scripts/border_series.py`](scripts/border_series.py) | ті самі моделі по всьому ряду val однієї монети разом із ціною й межами ніг | `border_series_<PAIR>.json` |
| [`../28-leg-edge-profile/scripts/edge_profile.py`](../28-leg-edge-profile/scripts/edge_profile.py) | розмітка ноги: `load`, `legs_of`, пороги `THRESHOLD`, `PERIOD`, `HOLE` |
| [`../../tests/test_pivot_signature.py`](../../tests/test_pivot_signature.py) | тести кроків на синтетичних рядах |

Запуск (кожен скрипт бере `--pairs`, перший і четвертий — ще й `--anchor`):

```bash
python3 research/34-pivot-signature/scripts/pivot_signature.py --anchor none
python3 research/34-pivot-signature/scripts/pivot_signature.py --anchor close
python3 research/34-pivot-signature/scripts/leg_border.py
python3 research/34-pivot-signature/scripts/pivot_side.py --anchor close
python3 research/34-pivot-signature/scripts/pivot_unique.py
python3 research/34-pivot-signature/scripts/inner_turn.py
python3 -m unittest discover -s tests -t tests -k pivot_signature
```

Прохід по шести монетах — 20–40 секунд на скрипт.

Параметри (у `mirror.py`, без ключів): `THRESHOLD = 0.023`,
`PERIOD = 10`, `HOLE = 3600`, `MIN_LEG = 60`, `WINDOW = 40`,
`SEARCH = 25`, `INNER = 0.005`, `CLEAR = 40`, `SHUFFLES = 500`,
`SEED = 17`. У `pivot_unique.py`: `NEAR = 2`,
`SIZES = (0.003, 0.005, 0.008, 0.012, 0.018, 0.023)`. У
`pivot_side.py`: `WINDOWS = (0, 1, 2, 3, 5, 8)`, сусідів у контролі 20.
У `inner_turn.py`: `NEAR = 2`, `OFFSETS = −10…+10`, `CROSS_FROM = −10`,
`HOLD = 20`, `CALIPER = 0.10` (наскільки близькі розміри приймаються за
пару, у логарифмі), `TAILS = ((3, 10), (3, 20), (3, 40), (11, 20),
(21, 40))` — вікна хвоста ноги перед точкою.

Вихід:

```
results/pivot_signature_none.json    — етапи 1-2 на півоті ема10
results/pivot_signature_open.json    — те саме на екстремумі price_open
results/pivot_signature_close.json   — те саме на екстремумі price_close
results/leg_border.json              — етап 3
results/pivot_side_close.json        — етап 4
results/pivot_unique.json            — етап 5
results/inner_turn.json              — етап 6
results/border_side.json             — етап 7
results/border_edge.json             — етап 8
results/border_series_<PAIR>.json    — ряд val під ціною
```

## Приклад

Вхід — подія класу, `(9, 7)`. Шість параметрів однієї фічі:

```python
>>> block = np.array([[0., 1., 2., 3., 4., 5., 6., 7., -9.]])
>>> [round(float(reduce_blocks(block, how)[0]), 3) for how in PARAMS]
[2.111, 0.0, -9.0, -9.0, 4.483, -0.133]   # mean first last peak spread slope
```

Перенесення межі:

```python
>>> row = {"open": np.array([10., 11., 12., 15., 12., 11., 10.]),
...        "close": np.array([10.5, 11.5, 12.5, 15.5, 12.5, 11.5, 10.5])}
>>> anchor(row, 6, kind=1, by="close", span=5)   # вершина у вікні ±5
3
```

Вихід — рядок звіту:

```
якір      підпис  пік  центр ліво/право зсув мед  ліворуч   розмах
close      0.589   +0   -0.3       1.05     -4.0      99%   +0.170%
```

## Етап 1. Чи дзеркальний клас

Статус: **підтверджено**, 2026-09-20.

Для кожної фічі береться її рівень (крива `ранг`, вікно 20 подій) на
**вершині** й рівень її **дзеркальної пари** на **дні**. Якщо ряд
дзеркальний, ці два числа збігаються. Якір — `close`, 230 вершин і
235 днищ шести монет.

| фіча | бік | вершина | дно (дзеркало) | різниця | t |
| ---- | --- | ------- | -------------- | ------- | - |
| `d_up` | до | 0.359 | 0.390 | −0.031 | −2.4 |
| `d_up` | після | 0.381 | 0.415 | −0.034 | −2.6 |
| `d_down` | до | 0.379 | 0.401 | −0.023 | −1.8 |
| `d_down` | після | 0.361 | 0.390 | −0.030 | −2.4 |
| `d_resist_buy` | до | 0.663 | 0.625 | +0.037 | +2.3 |
| `d_resist_buy` | після | 0.650 | 0.601 | +0.050 | +3.0 |
| `d_support_sell` | до | 0.668 | 0.631 | +0.036 | +2.4 |
| `d_support_sell` | після | 0.686 | 0.648 | +0.037 | +2.6 |
| `d_bal_resist_buy` | після | 0.545 | 0.516 | +0.029 | +3.2 |
| `d_bal_support_sell` | після | 0.579 | 0.557 | +0.023 | +3.0 |
| `d_price_avg` | до | 0.598 | 0.590 | +0.009 | +1.7 |
| `d_price_avg` | після | 0.429 | 0.436 | −0.007 | −1.4 |

1. **Дзеркало тримається за формою.** Усі 14 рядків мають той самий
   знак, що й пара: різниці лежать у межах 0.007–0.050 рангу там, де
   сам ефект півота — 0.15–0.25 рангу (етап 2). Тобто вершина й дно
   описуються одним правилом із переставленими парами.
2. **Вершина гучніша за дно** на 0.02–0.05 рангу, стабільно по всіх
   фічах (t від 2.3 до 3.2). Дзеркало **не точне**: розворот униз
   лишає в класі виразніший слід, ніж розворот угору.
3. Ціна в дзеркальний тест майже не входить (t −1.4 … +1.7) — вона й
   так зведена зміною знака.

**Висновок етапу: ноги росту й падіння можна міряти однією лінійкою**,
якщо пари фіч переставляти за напрямком ноги. Далі всі заміри йдуть у
цій рамці.

## Етап 2. Хід підпису навколо півота ема10

Статус: **підтверджено**, 2026-09-20.

Профіль власного й зустрічного боку ноги, що закінчується, по зсувах від
точки розвороту. Якір — `none` (півот зігзага, як є), 465 півотів.

Обʼємні відношення (`амплітуда·mean`), нога **вгору**:

| зсув | −20 | −10 | −5 | −2 | 0 | +2 | +5 | +10 | +20 |
| ---- | --- | --- | -- | -- | - | -- | -- | --- | --- |
| власний (`d_up`) | 0.656 | 0.712 | **0.726** | 0.710 | 0.642 | 0.649 | 0.642 | 0.615 | 0.611 |
| зустрічний (`d_down`) | 0.624 | 0.690 | 0.703 | 0.718 | **0.769** | 0.677 | 0.675 | 0.676 | 0.628 |

Нога **вниз** (пари переставлені) — та сама картина:

| зсув | −20 | −10 | −5 | −2 | 0 | +2 | +5 | +10 | +20 |
| ---- | --- | --- | -- | -- | - | -- | -- | --- | --- |
| власний (`d_down`) | 0.612 | 0.622 | **0.686** | 0.666 | 0.596 | 0.602 | 0.567 | 0.540 | 0.572 |
| зустрічний (`d_up`) | 0.625 | 0.633 | 0.674 | 0.665 | **0.735** | 0.662 | 0.616 | 0.589 | 0.605 |

Піки кривих: власний бік — на зсуві **−8** (нога вгору) і **−4** (нога
вниз); зустрічний бік — рівно на **0** в обох. Перекид
(зустрічний мінус власний) переходить у плюс на зсуві **0** в обох
напрямках.

Підпис місця `S` по зсувах, той самий якір:

| зсув | −30 | −20 | −10 | −5 | −2 | 0 | +2 | +5 | +10 | +20 | +30 |
| ---- | --- | --- | --- | -- | -- | - | -- | -- | --- | --- | --- |
| нога вгору | 0.252 | 0.289 | 0.397 | **0.417** | 0.417 | 0.397 | 0.327 | 0.324 | 0.302 | 0.224 | 0.257 |
| нога вниз | 0.169 | 0.215 | 0.253 | 0.340 | **0.348** | 0.335 | 0.263 | 0.180 | 0.138 | 0.181 | 0.119 |

1. **Підозра користувача підтверджується за формою.** У кінці ноги
   росту зустрічний бік (продавці) справді перебиває власний, і робить
   це рівно в точці розвороту. На ногах падіння — дзеркально, покупці
   перебивають продавців, на тому самому зсуві.
2. **Але сам підпис стоїть не там, де стоїть півот.** `S` найгучніший
   на зсуві −4 … −8 подій, а не на нулі, і профіль перекошений ліворуч:
   ліва половина горба важить у 3.1 раза більше за праву, центр ваги
   −7.2 події.
3. Перекіс однаковий на всіх шести монетах (пік підпису від −2 до −7) і
   на обох типах півота. Це не монета й не випадковість — це **лаг
   ема10**: півот зігзага стоїть пізніше за подію, у якій розворот
   стався.

**Висновок етапу: розворот видно в класі, але півот ема10 стоїть не на
ньому.** Зустрічний бік перебиває власний рівно в точці розвороту й
однаково на обох напрямках, проте підпис місця найгучніший на 4–8 подій
раніше, а горб перекошений ліворуч у 3.1 раза — межу треба шукати назад
по ряду.

## Етап 3. Куди ставити межу ноги

Статус: **підтверджено**, 2026-09-20.

Точка розвороту переноситься на справжній екстремум ціни у вікні
±25 подій і всі величини етапу 2 переміряються. 465 півотів, 531 нога.

| якір | підпис у точці | пік профілю | центр ваги | ліво/право | зсув, медіана | ліворуч | розмах ноги |
| ---- | -------------- | ----------- | ---------- | ---------- | ------------- | ------- | ----------- |
| `none` (ема10) | 0.366 | −4 | −7.2 | 3.10 | 0 | 0 % | — |
| `open` | 0.517 | −1 | −1.0 | 1.36 | −3 | 91 % | +0.168 % |
| `close` | **0.589** | **0** | **−0.3** | **1.05** | −4 | 99 % | **+0.170 %** |
| `oracle` (стеля) | 0.843 | +1 | +1.5 | 0.64 | −7 | 67 % | −0.127 % |

**Розмах ноги** — на скільки піднявся край ноги від переносу: ціна події
береться крайня з двох (`open`, `close`), у бік ноги.

Зсув до екстремуму `price_close` по монетах і по типах півота:

| | медіана | середнє | n |
| --- | ------- | ------- | - |
| BTC_USDT | −3.0 | −4.3 | 63 |
| ETH_USDT | −4.0 | −5.9 | 88 |
| SOL_USDT | −5.0 | −6.3 | 93 |
| XRP_USDT | −5.5 | −6.5 | 80 |
| BNB_USDT | −4.0 | −6.7 | 51 |
| DOGE_USDT | −5.0 | −6.1 | 90 |
| вершина | −5.0 | −6.5 | 230 |
| дно | −4.0 | −5.5 | 235 |

Місце межі **серед подій своєї ноги** — чи це пік у кожній нозі окремо,
а не тільки в середньому:

| якір | квантиль межі в нозі | у топ-10 % ноги | у топ-25 % | нижче середини |
| ---- | -------------------- | --------------- | ---------- | -------------- |
| `none` | 0.763 | 26 % | 51 % | 23 % |
| `open` | 0.873 | 42 % | 72 % | 8 % |
| `close` | **0.910** | **52 %** | **77 %** | **8 %** |
| `oracle` | 0.989 | 92 % | 99 % | 0 % |

Хід кривих на перенесеній межі (якір `close`), нога **вгору**:

| зсув | −10 | −5 | −2 | −1 | 0 | +1 | +2 | +5 | +10 |
| ---- | --- | -- | -- | -- | - | -- | -- | -- | --- |
| власний обʼєм | 0.696 | 0.714 | 0.722 | 0.780 | **0.849** | 0.743 | 0.691 | 0.683 | 0.651 |
| зустрічний обʼєм | 0.639 | 0.699 | 0.688 | 0.722 | 0.792 | **0.806** | 0.743 | 0.710 | 0.691 |
| власний рівень | 0.303 | 0.307 | 0.276 | 0.230 | **0.168** | 0.231 | 0.272 | 0.299 | 0.355 |
| зустрічний рівень | 0.309 | 0.274 | 0.266 | 0.250 | 0.184 | **0.172** | 0.208 | 0.269 | 0.283 |
| ціна | 0.600 | 0.601 | 0.643 | 0.691 | **0.754** | 0.749 | 0.651 | 0.628 | 0.622 |
| підпис `S` | 0.326 | 0.388 | 0.409 | 0.483 | **0.619** | 0.547 | 0.448 | 0.384 | 0.315 |

Нога **вниз** дає ту саму картину з переставленими парами: власний обʼєм
0.830 у точці, зустрічний 0.759, перекид на **+1** — так само, як угору.

1. **Межу ноги треба посунути назад на 4 події** (14 хвилин) — на подію,
   чия `price_close` є екстремумом. Медіана зсуву −4, ліворуч їде 99 %
   меж, і жодна монета з цього не випадає.
2. **Перенос нічого не коштує, а розмах ноги дає більший**: нога
   забирає собі ще +0.17 % руху, тобто фінальний сплеск справді
   опиняється **всередині** ноги, а не за нею.
3. **Профіль стає симетричним**: ліво/право 3.10 → 1.05, центр ваги
   −7.2 → −0.3, пік профілю точно в межі. Це і є перевірка, що межа
   поставлена правильно: підпис розходиться від неї в обидва боки
   однаково.
4. **Розворот — це одна подія, а не зона.** На перенесеній межі підпис
   0.619 у точці проти 0.409 за дві події й 0.326 за десять. Зона
   ±15 подій із дослідження 31 (етап 4) — наслідок того, що межа стояла
   не на місці.
5. **Порядок у точці межі такий:** власний бік ноги дає **останній
   найгучніший поштовх** (0.849 — найвище значення всього профілю),
   рівні стакана обвалюються (0.168), і **наступною подією** зустрічний
   бік переганяє власний (0.806 проти 0.743). Перекид стоїть на **+1**
   події, однаково на ногах угору й униз.
6. Стеля (`oracle`) — 0.843: підпис `close` бере 70 % того, що взагалі
   є у вікні, проти 43 % у півота ема10. Але `oracle` втрачає розмах
   (−0.127 %) — найгучніша подія не збігається з екстремумом ціни.

**Визначення межі ноги, яке з цього виходить:** нога закінчується на
події, чия ціна закриття — екстремум, і на цій самій події власний бік
ноги дає останній сплеск; наступна подія вже належить новій нозі.

**Висновок етапу: межа ноги знайдена — це подія з екстремумом
`price_close`.** Перенос на 4 події назад дає найгучніший підпис
(0.589), симетричний профіль (1.05), пік у 52 % ніг окремо і ще
+0.170 % розмаху ноги; фінальний сплеск власного боку лишається
всередині ноги, зустрічний починає наступну.

## Етап 4. Чи каже клас, у який бік розворот

Статус: **підтверджено**, 2026-09-20.

`B = амплітуда(d_down) − амплітуда(d_up)` на перенесеній межі, AUC
«вершина проти дна». Суперник — **власний рух ціни події**: подія межі
має великий рух, і цей рух лежить у тому самому класі.

| вікно | `B` | `−рух` | `B\|рух` | \|z\| `B\|рух` | шум 95 % |
| ----- | --- | ------ | -------- | -------------- | -------- |
| 0 | 0.268 | **0.002** | 0.735 | 8.6 | 2.0 |
| 1 | 0.402 | 0.199 | 0.541 | 1.5 | 1.9 |
| 2 | 0.469 | 0.262 | 0.543 | 1.6 | 2.1 |
| 3 | 0.494 | 0.285 | 0.547 | 1.8 | 2.2 |
| 5 | 0.554 | 0.336 | 0.593 | 3.5 | 2.0 |
| 8 | 0.585 | 0.376 | 0.605 | 3.9 | 2.1 |

`B|рух` — залишок `B` після регресії на ранг руху ціни та його квадрат.

Чесніший контроль — **подія того самого руху**: для кожного розвороту
беруться 20 подій тіла ноги з найближчим рангом руху ціни, і `B`
порівнюється з їхнім, приведеним до того самого боку:

| монета | різниця `B` |
| ------ | ----------- |
| BTC_USDT | +0.071 |
| ETH_USDT | −0.002 |
| SOL_USDT | +0.006 |
| XRP_USDT | +0.034 |
| BNB_USDT | +0.095 |
| DOGE_USDT | +0.052 |
| **разом** | **+0.036**, t +3.9, вище в 67 % розворотів (n = 446) |

1. **Бік розвороту написаний у ціні, а не в стакані.** Власний рух
   події ділить вершини й дна ідеально (AUC 0.002, тобто 0.998 із
   перевернутим знаком) — і це тавтологія: подія з екстремальним
   закриттям має екстремальний рух.
2. **Сам `B` на межі показує власний бік, а не зустрічний** (AUC 0.268
   замість 0.732) — це те саме, що в етапі 3: у точці межі ще гучніший
   власний бік ноги, зустрічний переганяє його наступною подією.
3. **Понад ціну клас додає мало.** Регресійний залишок дає AUC 0.735,
   але чесніший контроль — подія того самого руху — лишає **+0.036
   рангу** (t +3.9), і на двох монетах із шести (ETH, SOL) від цього
   не лишається нічого.

**Висновок етапу: сказати, у який бік розворот, за цим класом можна, але
тільки тим, що вже видно з ціни події.** Вкладу самих відношень
стакана — 0.036 рангу, і він не тримається на всіх монетах.

## Етап 5. Чи є ознака, яка буває тільки на межі

Статус: **підтверджено**, 2026-09-20.

Підпис `S` у трьох місцях ряду. Корекція — півот вкладеного зігзага
0.5 % усередині ноги, не ближче 40 подій до її країв, перенесена **тим
самим** якорем. Тіло — решта подій ніг.

| якір | межа | корекція | тіло | межа/тіло | корекція/тіло | межа/корекція | z | шум 95 % |
| ---- | ---- | -------- | ---- | --------- | ------------- | ------------- | - | -------- |
| `none` | 0.366 | 0.140 | −0.026 | 0.733 | 0.604 | 0.649 | 10.2 | 1.9 |
| `open` | 0.517 | 0.289 | −0.033 | 0.819 | 0.696 | 0.658 | 10.9 | 1.9 |
| `close` | **0.589** | 0.353 | −0.033 | **0.855** | 0.729 | **0.664** | 11.2 | 1.9 |

465 меж, 2596 корекцій, 276 тис. подій тіла.

Точність верхівки: беруться `N` найгучніших подій ряду за `S`, де `N` —
скільки в цьому ряді меж; рахується, скільки з них потрапило в межу
(±2 події). Контроль — ті самі межі, розкидані по ряду навмання,
200 разів:

| монета | меж | у верхівці | точність | база | приріст | шум (медіана / 95 %) |
| ------ | --- | ---------- | -------- | ---- | ------- | -------------------- |
| BTC_USDT | 63 | 1 | 1.6 % | 0.6 % | ×2.6 | 0 / 2 |
| ETH_USDT | 88 | 3 | 3.4 % | 0.8 % | ×4.4 | 0 / 2 |
| SOL_USDT | 93 | 13 | 14.0 % | 0.9 % | ×16.3 | 0 / 3 |
| XRP_USDT | 80 | 2 | 2.5 % | 0.9 % | ×2.9 | 0 / 2 |
| BNB_USDT | 51 | 5 | 9.8 % | 0.5 % | ×18.9 | 0 / 2 |
| DOGE_USDT | 90 | 13 | 14.4 % | 1.0 % | ×13.9 | 0 / 3 |

Чи знає підпис **розмір** розвороту: беруться повороти зігзагів шести
порогів (0.3 … 2.3 %) на тій самій ема10, розмір повороту — менший із
двох сусідніх рухів:

| розмір розвороту | подій | підпис `S` |
| ---------------- | ----- | ---------- |
| 0.30–0.38 % | 1074 | +0.245 |
| 0.38–0.51 % | 1075 | +0.257 |
| 0.51–0.71 % | 1076 | +0.302 |
| 0.71–1.26 % | 1076 | +0.375 |
| 1.26–11.73 % | 1075 | **+0.533** |

Спірмен(розмір, `S`) = **+0.236** на 5370 поворотах.

1. **Унікальної ознаки півота немає.** Той самий підпис стоїть на
   корекції 0.5 %: 0.353 проти 0.589 на межі. Відрізнити межу від
   корекції можна (AUC 0.664, z 11.2 проти шумових 1.9), але це
   **різниця в силі**, а не ознака, яка є в одного й немає в іншого.
2. **Перенесення межі підсилює все**: межа/тіло 0.733 → 0.855,
   межа/корекція 0.649 → 0.664. Порівнювати місця можна тільки після
   того, як усі точки поставлені одним правилом.
3. **Верхівка ряду межі не збирає.** Найгучніші події ряду — це межі в
   1.6–14.4 % випадків. Шум дає 0–3 влучання, тобто приріст справжній
   (×2.6 … ×18.9), але навіть найкраща монета лишає 86 % верхівки
   чужим подіям.
4. **Підпис міряє розмір розвороту, а не його статус**: `S` монотонно
   росте від 0.245 на поворотах 0.3 % до 0.533 на поворотах понад
   1.26 %. Тобто клас каже «тут розворот такої сили», і поріг 2.3 %
   для нього — довільна межа зовні.

**Висновок етапу: унікальної ознаки межі немає — клас міряє силу
розвороту, а не його статус.** Межу від корекції відрізняє лише рівень
підпису (0.589 проти 0.353, AUC 0.664), верхівка ряду лишає 86 % місць
чужим подіям, а `S` росте разом із розміром повороту (Спірмен +0.236)
незалежно від порога 2.3 %.

## Етап 6. Чим корекція відрізняється від межі

Статус: **підтверджено**, 2026-09-20.

Етап 5 показав, що підпис стоїть і на корекції, тільки слабший. Тут
розбирається, **чим саме** різняться ці два місця. Обидва перенесені
якорем `close`, обидва міряються в одній дзеркальній рамці: власний
бік — той, чий обʼєм вів рух у точку, зустрічний — протилежний.
458 меж, 2577 корекцій.

Рівень кожної величини в точці:

| величина | межа | корекція | тіло | AUC межа/корекція | z |
| -------- | ---- | -------- | ---- | ----------------- | - |
| власний обʼєм | 0.839 | 0.761 | 0.490 | 0.616 | +7.8 |
| зустрічний обʼєм | 0.775 | 0.649 | 0.490 | 0.638 | +9.3 |
| власний рівень | 0.176 | 0.298 | 0.510 | 0.347 | -10.4 |
| зустрічний рівень | 0.203 | 0.358 | 0.510 | 0.331 | -11.4 |
| власний баланс | 0.206 | 0.312 | 0.508 | 0.373 | -8.6 |
| зустрічний баланс | 0.259 | 0.400 | 0.508 | 0.358 | -9.6 |
| ціна | 0.754 | 0.697 | 0.492 | 0.575 | +5.1 |
| підпис S | 0.589 | 0.353 | -0.033 | 0.664 | +11.2 |

Шум перебору на перемішаній мітці — |z| до 1.9.

Хід навколо точки, зсуви від −10 до +10:

| зсув | −10 | −5 | −2 | −1 | 0 | +1 | +2 | +5 | +10 |
| ---- | --- | -- | -- | -- | - | -- | -- | -- | --- |
| межа, власний обʼєм | 0.668 | 0.662 | 0.718 | 0.760 | 0.839 | 0.731 | 0.664 | 0.647 | 0.617 |
| межа, зустрічний обʼєм | 0.630 | 0.668 | 0.686 | 0.711 | 0.775 | 0.781 | 0.719 | 0.689 | 0.646 |
| корекція, власний обʼєм | 0.574 | 0.580 | 0.628 | 0.662 | 0.761 | 0.618 | 0.560 | 0.525 | 0.522 |
| корекція, зустрічний обʼєм | 0.549 | 0.554 | 0.573 | 0.595 | 0.649 | 0.689 | 0.620 | 0.582 | 0.560 |
| межа, підпис `S` | 0.290 | 0.321 | 0.388 | 0.453 | 0.589 | 0.514 | 0.402 | 0.331 | 0.255 |
| корекція, підпис `S` | 0.108 | 0.115 | 0.179 | 0.228 | 0.353 | 0.288 | 0.173 | 0.099 | 0.068 |

| форма | перекид | пік `S` | ліво/право | підмурівок | сплеск над ним |
| ----- | ------- | ------- | ---------- | ---------- | -------------- |
| межа | +1 | 0 | 1.03 | 0.316 | +0.273 |
| корекція | +1 | 0 | 1.25 | 0.101 | +0.252 |

**Підмурівок** — середній `S` на зсувах |3|…|10|,
тобто околиця без самої точки.

| що порівнюється | межа | корекція | AUC |
| --------------- | ---- | -------- | --- |
| сама точка | 0.589 | 0.353 | 0.664 |
| околиця без точки | 0.317 | 0.098 | **0.670** (z 11.6) |
| сплеск точки над околицею | +0.272 | +0.255 | **0.509** |

Околиця ±10 бере й події **після** точки, а вони належать уже
наступній нозі. Для розмітки годиться лише ліва половина — хвіст ноги,
що закінчується. Вікно обрізається межами своєї ноги, точка в нього не
входить:

| вікно до точки | межа | корекція | AUC | z | разом із точкою | те саме вікно після точки |
| -------------- | ---- | -------- | --- | - | --------------- | ------------------------- |
| −10…−3 | 0.331 | 0.120 | 0.658 | 10.8 | 0.674 | 0.665 |
| −20…−3 | 0.299 | 0.114 | 0.647 | 9.9 | 0.667 | 0.657 |
| −40…−3 | 0.250 | 0.115 | 0.613 | 7.3 | 0.651 | 0.644 |
| −20…−11 | 0.258 | 0.093 | 0.626 | 8.6 | 0.660 | 0.641 |
| −40…−21 | 0.193 | 0.101 | 0.573 | 4.8 | 0.632 | 0.616 |

1. **Чужа нога не потрібна.** Хвіст на зсувах −10…−3 дає AUC 0.658
   проти 0.665 у дзеркального вікна після точки — різниця в третьому
   знаку. Разом із самою точкою хвіст дає 0.674, тобто більше за
   двосторонню околицю (0.670), і при цьому **не заглядає в наступну
   ногу**.
2. **Працює саме останній десяток подій.** Розтягнути вікно до −20
   коштує −0.011, до −40 — −0.045. Далекий хвіст сам по собі
   (−40…−21) лишає 0.573 (z 4.8) — ще не шум, але вже мало.
3. **Нога розганяється до свого кінця, корекція — ні.** Рівень хвоста
   межі падає з відстанню (0.331 → 0.193), а хвіст корекції стоїть
   майже рівно (0.120 → 0.101).

Розмір повороту — менший із двох сусідніх рухів; для межі це рухи
сусідніх ніг, для корекції — сусідні коліна вкладеного зігзага:

| | медіана | від | до | `S` | n |
| --- | ------- | --- | -- | --- | - |
| межа | 3.26 % | 0.52 % | 11.40 % | 0.589 | 458 |
| корекція | 0.78 % | 0.50 % | 8.13 % | 0.353 | 2575 |

Три способи зрівняти розмір:

| спосіб | межа | корекція | різниця | AUC / t |
| ------ | ---- | -------- | ------- | ------- |
| спільна смуга 0.52–8.13 % | 0.587 | 0.360 | +0.227 | AUC 0.658 |
| залишок кривої `S`(розмір) | -0.074 | -0.000 | -0.074 | AUC 0.431 (z -4.7) |
| пари рівного розміру (91 пар, калібр 0.10) | 0.543 | 0.552 | **-0.009** | t -0.2 |

У парах середній розмір 2.45 % проти
2.27 %; 367 меж пари собі
не знайшли — таких великих корекцій у ряді просто немає.

Тривалість переваги зустрічного боку після точки, 20 подій:

| | зустрічний зверху | власний повертається через |
| --- | ----------------- | -------------------------- |
| межа | 58 % | 2 події |
| корекція | 56 % | 2 події |

1. **Механізм той самий.** Корекція повторює межу поворот у поворот:
   власний обʼєм пікує в точці, рівні стакана обвалюються там же,
   зустрічний бік переганяє власний на **+1** — той самий зсув, що й на
   межі. Профіль так само симетричний, власний бік так само
   повертається через 2 події. Це не два різні явища, а одне.
2. **Найкраще розрізняють рівні, а не обʼєми.** Глибина обвалу рівнів
   дає AUC 0.669 (зустрічний) і
   0.653 (власний) проти
   0.616 і
   0.638 в обʼємів: на межі стакан
   вимітається глибше (0.176 проти
   0.298), а не тільки голоснішає.
3. **Різниця лежить не в точці, а в її околиці — і ця околиця своя.**
   Хвіст ноги перед точкою розрізняє місця так само, як двостороннє
   вікно (0.658 проти 0.665), а разом із точкою дає 0.674 — усе це
   всередині ноги, що закінчується. Сплеск над власним
   фоном однаковий (+0.273 проти
   +0.252, AUC 0.509 —
   це нуль). Відрізняється **підмурівок**: навколо межі ряд уже гучний
   (0.317), навколо корекції — тихий
   (0.098), і сама околиця розрізняє їх краще
   (0.670), ніж точка (0.664).
4. **При рівному розмірі різниці немає.** Пари однакового розміру дають
   -0.009 рангу (t -0.2) — нуль. Смуга й
   регресія тягнуть у різні боки (0.658 і 0.431)
   саме тому, що розміри майже не перетинаються: медіана межі
   3.26 % проти
   0.78 %, і пару знайшли лише
   91 меж із 458.

**Висновок етапу: корекція — це та сама межа, тільки меншого розміру.**
Окремої ознаки в межі немає: механізм, форма й зсув перекиду збігаються,
рівні глибші рівно настільки, наскільки більший поворот, а при
зрівняному розмірі різниця зникає повністю. Те, що їх усе ж розрізняє,
лежить не в точці, а в **хвості ноги перед нею**, і читається без жодної
події з наступної ноги. Поріг 2.3 % ділить один неперервний ряд
поворотів, а не два різні явища.

## Стандарт розмітки, що з цього вийшов

Підтверджено 2026-09-20, записано в
[`rules/02-markup.md`](../../rules/02-markup.md) → Точка кінця ноги.

Зігзаг **будь-якого** порогу будується у два кроки, другий обовʼязковий:

```
ема10(price_open) -> півоти зігзага свого порогу
                  -> кожен півот на екстремум price_close у вікні ±25 подій
```

- Назва зігзага — просто поріг: «зігзаг 2.3», «зігзаг 0.8». Ема10 і
  точний пошук кінця ноги входять у поняття й окремо не називаються.
- Реалізація — [`rules/scripts/zigzag.py`](../../rules/scripts/zigzag.py)
  → `snap`, `SNAP_SPAN = 25`; тести
  [`tests/test_zigzag.py`](../../tests/test_zigzag.py) → `TestSnap`.
- Дослідження 01–33 розмічені до стандарту; їхні числа переміряються
  при потребі, самі файли не міняються.

## Висновки

1. **Клас дзеркальний** — з точністю 0.02–0.05 рангу при ефекті
   0.15–0.25. Вершини гучніші за дна на ті самі 0.02–0.05. Ноги росту й
   падіння міряються однією лінійкою з переставленими парами фіч.
2. **Універсальне визначення межі ноги знайдено, і воно не там, де
   стояв півот.** Межа — подія, чия `price_close` є екстремумом у вікні
   ±25 подій; вона їде на 4 події назад від півота ема10 (99 % меж),
   додає нозі +0.17 % розмаху, робить профіль підпису симетричним
   (ліво/право 1.05) і ставить межу в топ-10 % подій **своєї** ноги в
   52 % ніг проти 26 % у півота ема10.
3. **Підозра користувача підтвердилась, але порядок інший.** У точці
   межі найгучніший **власний** бік ноги — останній поштовх покупців на
   вершині (0.849) і продавців на дні (0.830). Зустрічний бік переганяє
   його **наступною подією** (перекид на +1, однаково вгору й униз).
   Отже кінець ноги треба ставити так, щоб фінальний сплеск власного
   боку лежав усередині ноги, а перша подія зустрічного вже належала
   новій нозі — саме це й дає якір `close`.
4. **Розворот — одна подія, а не зона.** Підпис 0.619 у точці проти
   0.409 за дві події. Зона ±15 подій із дослідження 31 — це розмитість
   старої розмітки.
5. **Унікальної ознаки немає.** Корекція 0.5 % має той самий підпис,
   слабший: межа/корекція 0.664. Підпис читається як **сила
   розвороту** (Спірмен із розміром +0.236), а не як «нога скінчилась».
6. **Напрямок розвороту клас бере з ціни.** Понад власний рух події
   стакан додає +0.036 рангу (t +3.9), і на ETH та SOL не додає нічого.
7. **Корекція — це межа меншого розміру.** Механізм той самий: власний
   обʼєм пікує в точці, рівні обвалюються, зустрічний переганяє на +1.
   Різниця тримається на околиці (підмурівок 0.317 проти 0.098, AUC
   0.670), а не на самому сплеску (AUC 0.509), і при зрівняному розмірі
   повороту зникає повністю (91 пара, різниця −0.009, t −0.2).

## Етап 7. Бік межі й бік розвороту однією мірою

Статус: **підтверджено**, 2026-09-29.

**Ціль.** Етапи 1–6 питали, де межа і чим вона відрізняється від
корекції. Тут на одній вибірці подій краю, однією моделлю і однією
мірою ставляться два різні питання:

| Модель | Мітка 0 | Мітка 1 | Рамка |
| ------ | ------- | ------- | ----- |
| **бік межі** | подія хвоста ноги, що кінчається (зсув −9 … 0) | подія голови тієї, що почалась (зсув +1 … +10) | дзеркальна |
| **бік розвороту** | межа поруч — дно | межа поруч — вершина | звичайна |

Зсув `0` — сама межа, і вона належить нозі, що кінчається: так каже
стандарт розмітки.

Рамки різні, і інакше бути не може. «Бік межі» читається **дзеркалом**:
власний бік ноги, що кінчається, проти зустрічного, нога вниз лягає на
ногу вгору. Для «боку розвороту» дзеркало **і є відповіддю**, тому там
величини беруться як є.

Дослідження 28 (етап 5) питало перше з двох на голих півотах ема10 і
дало AUC 0.877. Тут точка розвороту береться за стандартом
(`price_close` ±25), а голий півот стоїть поруч як контроль.

### Метод

| # | Крок | Як саме |
| - | ---- | ------- |
| 1 | **Стики** | 465 суцільних стиків шести монет; на кожному 20 подій — по 10 з боку, разом 9300 |
| 2 | **Межа** | якір `close` — екстремум `price_close` у вікні ±25; якір `none` — голий півот ема10, як у дослідженнях 01–33 |
| 3 | **Набір `клас`** | 42 величини події (7 фіч × 6 параметрів) у двох кривих — ранг і розмах, 84 стовпці |
| 4 | **Набір `ціна`** | причинне вікно **39 попередніх** подій: рух, розкид, шлях, підйом, просадка, прямота, нахили, нахил ема10 — 14 стовпців |
| 5 | **Набір `ціна−ема`** | те саме без нахилу ема10 — контроль на тавтологію: півот при якорі `none` стоїть на екстремумі ема10 |
| 6 | **Набір `разом`** | клас і ціна поруч, 98 стовпців |
| 7 | **Модель** | `HistGradientBoosting`, 300 дерев, 31 листок, `seed 17` — та сама, що в дослідженні 28 |
| 8 | **Розбиття** | за датою (навчання до 2026-08-14) і відкладеною монетою — шість прогонів |
| 9 | **Підлога** | та сама модель на перемішаній мітці |

```bash
python3 research/34-pivot-signature/scripts/border_side.py
python3 research/34-pivot-signature/scripts/border_side.py --tasks belong
python3 research/34-pivot-signature/scripts/border_series.py
```

### Бік межі

9300 подій краю, база `0.500`, підлога **0.520**.

| Якір | Набір | Стовпців | AUC за датою | Точність | AUC відкладена монета |
| ---- | ----- | -------: | -----------: | -------: | --------------------: |
| **close** | клас | 84 | **0.721** | 0.669 | 0.712 |
| **close** | ціна | 14 | 0.760 | 0.695 | 0.806 |
| **close** | ціна−ема | 13 | **0.768** | 0.705 | 0.793 |
| **close** | разом | 98 | **0.768** | 0.711 | **0.811** |
| none | клас | 84 | 0.586 | 0.557 | 0.615 |
| none | ціна | 14 | **0.940** | 0.868 | 0.951 |
| none | ціна−ема | 13 | 0.935 | 0.853 | 0.954 |
| none | разом | 98 | 0.940 | 0.858 | 0.951 |

Точність за відстанню від межі — якір `close`, набір `разом`, по 75
подій val у клітинці, таблиця читається як у дослідженні 28:

| Подій від межі | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| -------------- | -: | -: | -: | -: | -: | -: | -: | -: | -: | -: |
| подія **після** межі | 0.653 | 0.667 | 0.600 | 0.640 | 0.760 | 0.773 | 0.787 | 0.920 | 0.840 | 0.893 |
| подія **до** межі | 0.973 | 0.827 | 0.707 | 0.733 | 0.667 | 0.600 | 0.573 | 0.560 | 0.547 | 0.507 |

Дві криві розходяться від межі в різні боки, і кожна — по своїй
причині:

- **Ліворуч точність падає з відстанню** (0.973 на самій межі, 0.827
  за одну подію до неї, 0.507 за девʼять). Пізнається не «хвіст ноги»,
  а **фінальний поштовх**: подія за одну-дві до межі має найбільший
  власний рух, а за девʼять — рух звичайний, від тіла ноги не
  відрізнити.
- **Праворуч точність росте з відстанню** (0.653 на першій події проти
  0.893 на десятій): свідчення накопичується — що більше подій нової
  ноги у вікні, то ясніше, що напрямок змінився.
- **Найгірше — відразу після межі** (0.60 … 0.67 на +1 … +4). Це та
  сама точка, де етап 6 бачив перекид зустрічного боку: перехід займає
  одну подію, і на ній самій розрізнити нічого.
- **0.973 на самій межі** частково є визначенням якоря: подія, чия
  `price_close` найбільша у вікні ±25, має характерне вікно.

По монетах (якір `close`, набір `разом`, розбиття за датою): BTC 0.826,
BNB 0.808, SOL 0.805, XRP 0.799, ETH 0.771, DOGE 0.697. На відкладеній
монеті розкид вужчий — **0.778 … 0.832**.

Найсильніші величини поодинці: `v_last` 0.260, `price·mean·rank` 0.262,
`price·peak·rank` 0.354, `v_slope` 0.367, `straight` 0.389. Перші пʼять
— ціна, і всі **інвертовані**: що більший власний рух, то певніше це
подія своєї ноги. Клас заходить у список шостим, на рівні 0.58
(`own_bal·last·amp`, `own_vol·last·rank`).

### Бік розвороту

Та сама вибірка, база `0.495`, підлога **0.502**.

| Якір | Набір | AUC за датою | Точність | AUC відкладена монета |
| ---- | ----- | -----------: | -------: | --------------------: |
| **close** | клас | **0.566** | 0.551 | 0.599 |
| **close** | ціна | 0.981 | 0.931 | 0.982 |
| **close** | ціна−ема | 0.966 | 0.893 | 0.977 |
| **close** | разом | 0.982 | 0.936 | 0.988 |
| none | клас | 0.538 | 0.522 | 0.625 |
| none | разом | 0.988 | 0.957 | 0.968 |

| Подій від межі | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| -------------- | -: | -: | -: | -: | -: | -: | -: | -: | -: | -: |
| подія **після** межі | 0.933 | 0.920 | 0.960 | 0.947 | 0.973 | 1.000 | 0.987 | 0.960 | 0.973 | 0.947 |
| подія **до** межі | 0.973 | 0.920 | 0.920 | 0.920 | 0.907 | 0.907 | 0.893 | 0.893 | 0.893 | 0.893 |

Крива рівна: сказати, вершина це чи дно, однаково легко за одну подію
від межі й за десять. І це **не досягнення, а тавтологія** — межа
поставлена по екстремуму `price_close`, отже напрямок ходу поруч із нею
й називає бік. Найсильніші величини це й показують: `straight` 0.969,
`ema_slope` 0.962, `v_mean` 0.959 — усе це сам хід ціни.

Читати тут треба **тільки набір `клас`**: 0.566 при підлозі 0.502.
Це той самий висновок етапу 4 іншою дорогою — понад ціну стакан додає
крихти.

### Ряд val: обидві видачі під ціною

`border_series.py` пускає обидві моделі по **всьому** ряду val, а не
лише по подіях краю. Рамка «боку межі» дзеркальна, тому ліній дві:
«якщо нога йде вгору» і «якщо вниз» — живий ряд не знає, яка правильна.

Обидві моделі — **не мережі, а дерева**: `HistGradientBoostingClassifier`,
300 дерев, 31 листок, крок 0.05, `min_samples_leaf` 50, L2 1.0, `seed 17`
(константа `KNOBS` у скрипті — `rules/03-models.md` вимагає, щоб
гіперпараметри жили не тільки в коді). Голів у них немає: **один вихід,
одне число**.

| | бік межі (`belong`) | бік розвороту (`updown`) |
| --- | --- | --- |
| Отримує | 98 чисел події: 84 класу (7 фіч × 6 параметрів × ранг і розмах) плюс 14 з причинного вікна 39 попередніх подій | те саме |
| Рамка входу | дзеркальна | звичайна |
| Видає | ймовірність 0…1, що подія вже в новій нозі | ймовірність 0…1, що межа поруч — вершина |
| Ліній на ряді | дві — по одній на припущення про напрямок | одна |
| Вчена на | 7 800 подій краю шести монет до 2026-08-14, база 0.500 | ті самі 7 800, база 0.497 |

Стандарти: **метод** — дослідження 28, етап 5 (`event_edges.py` →
`sides`), узятий один в один, щоб числа читались поруч із його 0.877;
**розмітка** — дослідження 34, точка кінця ноги
([`rules/02-markup.md`](../../rules/02-markup.md)); **клас** —
дослідження 21; **дзеркало** — дослідження 34, етап 1; **навчання** —
[`rules/03-models.md`](../../rules/03-models.md).

Компоновка — [`rules/05-visualization.md`](../../rules/05-visualization.md):
опис зверху, ціна із зігзагом 2.3 по перенесених межах, під нею два
вікна підвалу на **спільній осі X** зі спільними зумом і зсувом, легенда
знизу. **Усі три видачі — числа 0…1, і це висота лінії, а не її колір.**
Колір у всіх трьох вікнах означає одне: зелене — вершина, червоне — дно.
Точка межі стоїть на своїй `price_close`. У «боці межі» колір каже, яке
припущення рахує лінія, у «боці розвороту» — яку відповідь вона дає.

BTC_USDT, val — 9412 подій, 8 меж ніг, моделі навчені на подіях краю
шести монет **до** 2026-08-14:

| Видача | Медіана | Понад 0.5 |
| ------ | ------: | --------: |
| бік межі, рамка «нога вгору» | 0.292 | 33.5 % |
| бік межі, рамка «нога вниз» | 0.306 | 34.3 % |
| бік розвороту | 0.203 | 46.7 % |
| `B` (етап 4, без навчання) | −0.009 | 4.9 % |

Меж у ряді 8 на 9412 подій — це 0.08 %. Видача «боку межі» стоїть вище
половини на **третині ряду**. Тобто модель, поставлена за межі своєї
вибірки, каже «це вже нова нога» в чотириста разів частіше, ніж нові
ноги трапляються. Це й є ціна того, що вона вчилась тільки на краях:
про тіло ноги її ніхто не питав.

### Висновок етапу

1. **Бік межі читається**: 0.768 за датою і **0.811** на відкладеній
   монеті при підлозі 0.520 і базі 0.500.
2. **Читає це ціна, а не клас.** Набір `ціна` дає 0.760, клас 0.721,
   разом 0.768 — клас додає 0.008. Сам по собі він не порожній, але
   нового до ходу ціни не несе.
3. **Клас від точної межі виграє, ціна — ні.** Клас: 0.586 → 0.721 при
   переносі межі. Це найпряміший замір користі стандарту розмітки з
   усіх, що в дослідженні є.
4. **Число дослідження 28 (0.877) завищене зсувом межі.** На голому
   півоті той самий замір дає 0.940: пізній півот відсуває групу
   «після» на чотири події далі від розвороту, і питання стає легшим.
   На точній межі — 0.768.
5. **Нахил ема10 мітки не визначає.** Підозра на тавтологію не
   підтвердилась: сам по собі він дає 0.543 на `close` і 0.523 на
   `none`, а набір без нього втрачає 0.005.
6. **Бік розвороту з класу майже не читається** — 0.566 при підлозі
   0.502, тоді як ціна дає 0.982. Це етап 4 іншою дорогою.
7. **На всьому ряді обидві видачі гудуть.** Третина подій val вище
   половини при 0.08 % справжніх меж: модель краю про тіло ноги нічого
   не знає, бо її про нього не питали.
8. **Замір умовний і в живий сигнал не перетворюється.** Модель питають
   лише на подіях краю; знайти край у ряді — інша задача, і вона
   розвʼязана погано (дослідження 28: 15 % влучань на верхівці 5 %).
   Сильна друга ланка слабкої першої не рятує.

## Що з цього виходить далі

- Перерахувати розмітку ніг усіх монет з якорем `close` і **переміряти
  на ній** ключові заміри досліджень 29–33: усі вони стоять на півоті
  ема10, тобто на межі, зсунутій на 4 події.
- Перевірити, чи причинно видно межу: `close`-екстремум відомий заднім
  числом, але **лаг відомий** — 4 події медіаною. Питання, скільки
  подій треба, щоб підтвердити екстремум, і чи росте від цього точність
  сигналу дослідження 33.
- Поріг 2.3 % підпис не бачить. Замість «нога скінчилась / не
  скінчилась» можна вчити **силу розвороту** — ціль, яку клас справді
  містить (Спірмен +0.236 сирою фічею), і яка робить корекцію не
  помилкою, а слабшою відповіддю.
- Друга ланка є, першої немає: бік межі читається на 0.81 (етап 7), а
  **знайти** край у ряді — ні. Наступний крок тут не сильніша модель
  боку, а драбина підтверджень дослідження 23, перевірена на val
  (дослідження 24, етап 1 досі не прогнаний).
- Вхід моделі має бути **ширшим за подію**: межу від корекції
  відрізняє околиця, а не сама точка (AUC 0.509 на самому сплеску).
  Брати її треба **до** точки: останні 10 подій ноги разом із нею дають
  0.674 — більше за двосторонню околицю і без жодної події наступної
  ноги; 20 подій коштують −0.011, 40 — −0.045.

## Вкладка [`/border`](http://localhost:8080/border)

Компоновка — [`rules/05-visualization.md`](../../rules/05-visualization.md):
опис зверху, далі розділи етапів у тому самому порядку, що у файлі.

| Розділ | Що показує | Ендпоінт |
| ------ | ---------- | -------- |
| опис | клас, монети, ноги, що таке власний і зустрічний бік | `/api/border/signature` |
| стандарт розмітки | два кроки побудови зігзага, що дає перенос півота, посилання на правило й скрипт | `/api/border/anchors` |
| дзеркальність | вершина проти дна з переставленими парами, 14 рядків | `/api/border/signature` |
| хід по зсувах | два полотна — нога вгору й нога вниз, пʼять кривих кожне, перемикач точки розвороту (`none`, `open`, `close`) | `/api/border/signature` |
| якорі | чотири якорі: підпис, пік профілю, ліво/право, зсув, розмах, місце межі в нозі; зсув по монетах і типах півота | `/api/border/anchors` |
| бік розвороту | `B`, `−рух`, `B\|рух` по вікнах і контроль подією того самого руху | `/api/border/side` |
| унікальність | межа проти корекції й тіла, верхівка ряду з шумом, розмір розвороту, контроль якоря | `/api/border/unique` |
| корекція проти межі | рівень восьми величин у трьох місцях, хід навколо обох точок, підмурівок і сплеск, хвіст ноги перед точкою пʼятьма вікнами, три способи зрівняти розмір | `/api/border/inner` |
| бік межі й бік розвороту | дві моделі на одній вибірці: набори входів на двох якорях, таблиця «подія до / після межі», монети, величини поодинці й підлога | `/api/border/belong` |
| ряд val | ціна із зігзагом 2.3 по перенесених межах, обидві видачі в підвалі на спільній осі X, зум і перехрестя | `/api/border/series` |
| висновки | сім висновків дослідження числами з результатів і що з цього далі | `/api/border/unique` + `/api/border/inner` |

Кожен розділ вантажиться окремо: немає файлу — порожній розділ із
командою, якою він робиться, решта вкладки працює.

Розмітка — `dashboard/static/index.html` → `id="tab-border"`,
завантажувач — `dashboard/static/app.js` → `LOADERS.border`, ендпоінти —
`dashboard/app.py` → `border_payload`.

## Тести

[`tests/test_pivot_signature.py`](../../tests/test_pivot_signature.py) —
53 тести кроків: формули шести параметрів події, ранги й AUC зі звʼязками,
дзеркальна таблиця (перестановка, покриття всіх фіч, інволюція), якір
(вершина, дно, `none`, вікно пошуку, край ряду, розбіжність `open` і
`close`), власний і зустрічний бік, склад підпису, а також кроки етапу 6:
бік повороту за знаком, розмір повороту з двох сусідніх рухів, розрив
стику, вікно підмурівка без самої точки, початок пошуку перекиду,
калібр парування, вікна хвоста ноги, межі ноги для кожної події, а також
кроки етапу 7: причинність вікна ціни (перших подій немає, майбутнє на
рядок не впливає), його дзеркало, перестановка власного і зустрічного
боку в класі, правило мітки зі зсувом 0 на боці своєї ноги, рівність
боків, набір без нахилу ема10, мітка другої задачі, відмова на
невідомій задачі, звичайна рамка проти дзеркальної і поділ ходу на
дві сторони.

[`tests/test_dashboard.py`](../../tests/test_dashboard.py) →
`TestBorderTab`, `TestBorderMarkup` — 46 тестів вкладки: реєстрація,
картка, ендпоінти всіх розділів, ім'я монети в ряді замість шляху,
відмова на невідомому імені, порожні відповіді й розмітка кожного
розділу, включно зі стандартом розмітки, обома моделями етапу 7, рядом
val і висновками, які стоять і без результатів.

[`tests/test_zigzag.py`](../../tests/test_zigzag.py) → `TestSnap` —
точка кінця ноги в базовому скрипті: вершина на максимум, дно на
мінімум, вікно пошуку, нульове вікно, збереження порядку й чергування,
відмова на відʼємному вікні, порожній ряд, будь-який поріг.

```bash
python3 -m unittest discover -s tests -t tests -k pivot_signature
python3 -m unittest discover -s tests -t tests -k Border
```

## Файл дослідження

[`research/34-pivot-signature/34-pivot-signature.md`](34-pivot-signature.md)
