Проверка чужого результата на боевом леджере, не свип. Входы заморожены ровно так, как случились; двигается только жёсткий клок выхода. Переоценка идёт по той же ленте и тем же исполнителем, что и живая книга, поэтому руки сравнимы между собой. Окно 25.08 – 07.09.2026 · 15 боевых линий · общая когорта 12 641 позиций · потолок капитала = собственный пик живой книги.
Проверяемое утверждение: «если бы живая книга держала позиции дольше 180 минут, она бы заработала ~$98k вместо $58k». На боевом леджере, с настоящими издержками выхода и под капитальным потолком самой живой книги — утверждение воспроизводится.
Разница между леджером ($57 882) и его же переоценкой ($51 921 на тех же 13 770 позициях) — это систематическое смещение переоценки: -0.79 пп на сделку в среднем, медиана -0.34 пп, корреляция с леджером 0.992. Поэтому руку 600 надо сравнивать не с леджером, а с базисом $51 310: обе величины посчитаны одним кодом на одной ленте, и смещение сокращается. Сравнение с леджером было бы сравнением двух разных измерителей.
Ни одно число здесь не является прогнозом. Это переигровка уже случившихся входов при сдвинутом жёстком клоке: входы заморожены, меняется только момент выхода.
У всех 15 боевых моделей жёсткий горизонт planned_exit_ts − entry_ts постоянен и равен ровно 180 минутам; единственное исключение — C_tmo120__thm1__tp40_q97_ens5_exit5 (линия t26) с 120 минутами. Разброса внутри модели нет: min = max = median. Именно этот клок и двигает аудит.
Восстановленный take-profit — медиана реализованной pnl_pct по фактическим take_profit-выходам самой модели (03_replay_timeouts.py): не ярлык из имени __tp40, а факт леджера. У 2 линий его нет вовсе — значит, в переигровке у них нет и правила take-profit.
| модель — боевая линия | planned_exit, мин | позиций | PnL леджера | take-profit, восстановленный |
|---|---|---|---|---|
optimized_K4__r14_zm05_q97_ens5_exit5 | 180 | 3 374 | $21 238 | 25.7% |
optimized_K4__r13_w01_q97_ens5_exit5 | 180 | 1 903 | $2 087 | 25.3% |
t20__exec967_train950__thm2__tpnone_q97_ens5_exit5 | 180 | 1 473 | $7 322 | — |
optimized_K4__r11_g8_a6_t180_q98_ens5_exit5 | 180 | 1 182 | $5 203 | 40.3% |
F_gap5ea6_q967__thm2__tp40_q97_ens5_exit5 | 180 | 911 | $2 353 | 41.0% |
optimized_K4__r11_g8_a6_t180_q98_ens5_exit5__sp1_ddf9e5e9… | 180 | 868 | −$290 | 39.5% |
C_tmo120__thm1__tp40_q97_ens5_exit5 | 120 | 819 | $5 328 | 40.0% |
C_gap8__thm2__tp40_q97_ens5_exit5 | 180 | 811 | $4 306 | 40.2% |
m033_v3_q98_ens5_exit5 | 180 | 801 | $7 616 | 26.3% |
C_hur15__thm2__tp40_q97_ens5_exit5 | 180 | 733 | $3 382 | 39.9% |
optimized_K4__r14_zm05_q97_ens5_exit5__sp1_9b683ba6… | 180 | 340 | −$614 | 24.2% |
optimized_K4__r11_g8_a6_t180_q98_ens5_exit5__sp1_1244b26c… | 180 | 210 | −$174 | 37.7% |
optimized_K4__r11_g8_a6_t180_q98_ens5_exit5__sp1_5bca6d64… | 180 | 185 | −$124 | 38.5% |
t19__exec979_train977__thp0__tpnone_q98_ens5_exit5 | 180 | 85 | $345 | — |
optimized_K4__r11_g8_a6_t180_q98_ens5_exit5__sp1_21541edb… | 180 | 75 | −$95 | 39.4% |
Куда живая книга девает деньги: −$43 025 на 9 199 тайм-аут-выходах, тогда как take-profit приносит $72 786, а learned exit — $28 338. Тайм-аут — единственная крупная статья с отрицательным знаком, и это ровно те позиции, которых касается удлинение.
| выход | позиций | PnL | на позицию | доля |PnL| |
|---|---|---|---|---|
timeout | 9 199 | −$43 025 | −$4.68 | 29.8% |
unsellable | 2 | −$239 | −$119.63 | 0.2% |
manual | 6 | $23 | $3.78 | 0.0% |
exit_model | 1 709 | $28 338 | $16.58 | 19.6% |
take_profit | 2 854 | $72 786 | $25.50 | 50.4% |
| итого | 13 770 | $57 882 | $4.20 | 100.0% |
Что именно меняет удлинение. В руке 180 мин 4 569 позиций из 13 770 закрылись до клока — по take-profit, по learned exit или вручную. Их удлинение не трогает вообще: они переносятся в любую длинную руку с тем же реализованным PnL (rule = pre_clock_fill). Остальные 9 201 упёрлись в клок, и только для них переигровка продолжает ленту. Внутри продления действует собственный take-profit модели (первое касание побеждает) и новый клок руки; learned exit внутри продления не действует — см. секцию 8.
Общая когорта — 12 641 позиций, которые целиком помещаются в ленту даже на самой длинной руке (720 мин). Это единственное честное сравнение: колонка обрезано показывает, сколько позиций пришлось бы отмечать по последней доступной цене, если бы когорту не фиксировали.
Удлинение не бесплатно. Без потолка PnL растёт в 2.23 раза, но пик открытого ноушенала — с $58 840 до $128 302 (2.2×), а средний занятый капитал — с $9 352 до $24 175 (2.6×). Под потолком самой живой книги рука 600 всё равно даёт $97 197, но уже отказывает 11.6% входов — и это первое место, где «держать дольше» начинает конкурировать само с собой. На 720 мин капитальный потолок уже съедает прирост целиком.
| рука | позиций | PnL, без потолка | Δ к 180 | ×PnL | пик капитала | ×пик | средний капитал | ×средн. | PnL под потолком | отказов | пик под потолком | обрезано в n_all |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 180 мин живой клок | 12 641 | $51 310 | — | 1.00× | $58 840 | 1.00× | $9 352 | 1.00× | $51 312 | 0.0% | $58 667 | 55 |
| 240 мин | 12 641 | $59 467 | +8 157 | 1.16× | $75 429 | 1.28× | $11 847 | 1.27× | $59 105 | 1.6% | $58 837 | 132 |
| 300 мин | 12 641 | $69 988 | +18 678 | 1.36× | $98 944 | 1.68× | $14 185 | 1.52× | $66 159 | 3.8% | $58 839 | 371 |
| 360 мин | 12 641 | $80 621 | +29 311 | 1.57× | $111 580 | 1.90× | $16 397 | 1.75× | $71 645 | 5.5% | $58 840 | 418 |
| 480 мин | 12 641 | $100 779 | +49 469 | 1.96× | $124 165 | 2.11× | $20 499 | 2.19× | $84 818 | 8.7% | $58 839 | 668 |
| 600 мин рука из утверждения | 12 641 | $114 332 | +63 022 | 2.23× | $128 302 | 2.18× | $24 175 | 2.58× | $97 197 | 11.6% | $58 840 | 940 |
| 720 мин | 12 641 | $119 599 | +68 289 | 2.33× | $129 219 | 2.20× | $27 552 | 2.95× | $96 805 | 14.8% | $58 840 | 1 106 |
Форензика вместо разглядывания. Ниже — вывод lib.forensics.read_series на тех же массивах, что нарисованы выше; ни одно утверждение о форме кривой не прочитано с картинки.
TIMEFRAME n=12,641 · 5s spacing (irregular/event-time) · 13.0d span · 2026-08-25 01:32..2026-09-07 01:57 UTC
FINDINGS (4 fired, 12 clean)
[HIGH] REGIME/segment · rate spread 23.7x across segments: +727.5/h (2026-09-05 06:41) -> +30.64/h (2026-08-25 01:32)
verify: forensics.segment_series(t, cum)
[HIGH] STRUCTURE/segment-dominance · one slow_grind segment holds 66.4% of total (2026-08-30 07:18..2026-09-05 06:34, 46.0% of elapsed time)
[MED ] REGIME/sign-flip · 1 of 5 segments net-negative; worst -7,249.32 at 2026-09-06 01:33
[MED ] DD/recovery · recovery took 18.1h vs 5.0h to fall (3.6x slower)
SHAPE slow_grind(5.2d, +30.6$/h) -> slow_grind(6.0d, +238$/h) -> steep_rally(18.5h, +727$/h) -> steep_selloff(3.1h, -2.32e+03$/h) -> slow_grind(21.0h, +341$/h)
CLEAN: top-trade, top-day, drop-top-3, gini, arrival, dd-depth (-7,671), dd-repeat, dd-single-row, ladder, worst_half, sign-consistency, evennessTIMEFRAME n=12,641 · 1min spacing (irregular/event-time) · 13.3d span · 2026-08-25 01:32..2026-09-07 08:56 UTC
FINDINGS (3 fired, 13 clean)
[HIGH] REGIME/segment · rate spread 36.8x across segments: +1,686/h (2026-09-05 07:01) -> +45.81/h (2026-09-06 10:31)
verify: forensics.segment_series(t, cum)
[HIGH] STRUCTURE/segment-dominance · one slow_grind segment holds 58.7% of total (2026-08-25 01:32..2026-09-05 06:35, 84.4% of elapsed time)
[MED ] DD/repeat · second drawdown is 93% as deep as the worst — not a one-off tail event
SHAPE slow_grind(11.2d, +249$/h) -> steep_rally(27.4h, +1.69e+03$/h) -> plateau(22.4h)
CLEAN: top-trade, top-day, drop-top-3, gini, segment-sign, arrival, dd-depth (-4,225), dd-recovery, dd-single-row, ladder, worst_half, sign-consistency, evennessВесь прирост $63 022 несут 2 017 позиций, которые в продлении дошли до take-profit: $73 839. 6 221 позиций снова упёрлись в клок и в сумме теряют −$10 817. Улучшилась при этом лишь 35.1% позиций когорты: распределение односторонне длинное вправо, а не сдвинутое целиком.
Прирост реализован, а не переоценён: в общей когорте на руке 600 обрезанных позиций 0 (05_mtm_split.csv), поэтому uplift_total и uplift_realised совпадают: $63 022.
| правило выхода на 600 мин | позиций | доля когорты | суммарная дельта | медиана дельты | улучшились |
|---|---|---|---|---|---|
take_profitдошли до take-profit внутри продления | 2 017 | 16.0% | $73 839 | $26.49 | 99.9% |
clockснова упёрлись в клок, уже на 600-й минуте | 6 221 | 49.2% | −$10 817 | −$1.67 | 39.0% |
pre_clock_fillзакрылись до 180-й минуты — не тронуты | 4 403 | 34.8% | $0 | $0.00 | 0.0% |
| итого | 12 641 | 100.0% | $63 022 | $0.00 | 35.1% |
FINDINGS (3 fired, 2 clean) [MED ] DIST/skew · skew = +2.35 — mean is not the typical outcome [MED ] DIST/kurtosis · excess kurtosis = 13.1 — fat tails [MED ] DIST/outliers · 2852 values beyond 5x MAD (max 312.9) QUANTILES (value) q value 0.00 -110.267036 0.01 -45.519562 0.05 -20.639890 0.25 -1.510313 0.50 0.000000 0.75 5.952469 0.95 51.693225 0.99 95.147945 1.00 312.894530 CLEAN: tail-mass (10.3%), zero-mass NOTE: n=12,641 · mean +4.986 · median +0 · std 23.3 · total +6.302e+04
Топ-1 токен несёт 30.4% прироста, топ-3 — 52%, топ-10 — 77%. Положительный вклад дают 126 токенов из 264; ещё 108 тянут вниз, поэтому накопленная кривая сначала уходит выше 100% и только потом спускается к итогу.
Но это не одна удачная сделка. В топ-токене 645 позиций, максимальная дельта по одной — $182 (худшая — −$32). То есть эффективная ширина эффекта — десяток токен-эпизодов, а внутри эпизода он размазан по сотням мелких сделок. Позиций на токен: медиана 9, p95 216, максимум 645.
| токен — топ-25 из 06_uplift_by_token.csv | вклад в прирост | доля | накопленным итогом | позиций в когорте |
|---|---|---|---|---|
0x507b6f34…15b220 | $19 131 | 30.4% | 30.4% | 645 |
0x420393b7…f27c27 | $10 503 | 16.7% | 47.0% | 490 |
0x20024e48…0a7777 | $3 132 | 5.0% | 52.0% | 588 |
0xcacb0e9c…8bcb68 | $2 981 | 4.7% | 56.7% | 314 |
0x298348d5…bdc8c7 | $2 671 | 4.2% | 61.0% | 177 |
0x15d36b6a…af5c4d | $2 474 | 3.9% | 64.9% | 100 |
0x0762c170…357506 | $1 938 | 3.1% | 68.0% | 114 |
0x5d6ef090…c61e18 | $1 921 | 3.0% | 71.0% | 105 |
0x000b2164…f164b8 | $1 853 | 2.9% | 73.9% | 29 |
0xfdae23ce…0e8312 | $1 810 | 2.9% | 76.8% | 432 |
0xb9972ca7…073277 | $1 712 | 2.7% | 79.5% | 254 |
0x18e67423…4cff5c | $1 634 | 2.6% | 82.1% | 217 |
0x0ff9072a…8ce2b2 | $1 479 | 2.3% | 84.5% | 239 |
0x862cdccb…447777 | $1 181 | 1.9% | 86.4% | 419 |
0xd2932910…527777 | $1 181 | 1.9% | 88.2% | 189 |
0x3450598e…897777 | $1 171 | 1.9% | 90.1% | 247 |
0x51fb76be…6b4fea | $1 167 | 1.9% | 91.9% | 122 |
0xa934ba4f…e35563 | $1 137 | 1.8% | 93.7% | 266 |
0xae2df3c1…e7cb99 | $1 117 | 1.8% | 95.5% | 129 |
0x1abf16f6…582228 | $1 066 | 1.7% | 97.2% | 121 |
0x2103faa9…1f9bf1 | $891 | 1.4% | 98.6% | 97 |
0x75c8258e…0bcbe2 | $877 | 1.4% | 100.0% | 159 |
0xe6864e46…777712 | $850 | 1.3% | 101.4% | 208 |
0x385b36ff…6471d5 | $741 | 1.2% | 102.5% | 101 |
0x8ecea3d0…3d6878 | $589 | 0.9% | 103.5% | 179 |
FINDINGS (5 fired, 0 clean)
[HIGH] TOKEN/top1 · "0x507b6f349a80114097a67b8b4677367acc15b220" = 30.4% of total (+1.913e+04)
[HIGH] TOKEN/breadth · effective N = 10.2 of 264 token (4%) — the chart is wider than the edge
[MED ] TOKEN/gini · gini = 0.832
[MED ] TOKEN/long-tail · 89% of token contribute <1% each
[MED ] TOKEN/mixed-sign · 108 of 264 token are negative (-1.158e+04 drag)
TOP 5 of 264 token
token value share
0x507b6f349a80114097a67b8b4677367acc15b220 19130.919121 0.303558
0x420393b70a34d6aef855ef56e87d4d4161f27c27 10503.197710 0.166659
0x20024e485c0b22b42855589700721b28320a7777 3131.687338 0.049692
0xcacb0e9caccee63ec4d82952e561a291c68bcb68 2980.761102 0.047297
0x298348d5b2e45c774e3ee4f1a0924071dfbdc8c7 2671.217676 0.042385
NOTE: 264 token · total +6.302e+04Прирост существует. Вопрос в том, наш ли он. Контроль: безусловная 420-минутная форвардная доходность (ровно 180 → 600) в тех же пулах в те же дни, снятая по равномерному 10-минутному клоку — 05_regime_control.py.
Вывод: удержание дольше в этом окне — это бета ленты, а не улучшение отбора. Наш условный дрейф не отличим от того, что дало бы удержание чего угодно из торгуемой вселенной те же семь часов. Медиана ниже безусловной, доля положительных — тоже. Отбор входов у нас есть (это видно по PnL книги), но дополнительное время после 180-й минуты не приносит собственного эджа.
Знак ленты гуляет по дням, и это не шум вокруг устойчивого плюса: 29.08 медиана ленты -6.11 пп — семичасовое удержание в тот день было бы систематически убыточным. Наш собственный дрейф отрицателен 01.09, 04.09, 07.09. Одно окно 25 авг – 7 сен — это одна реализация режима, а не выборка режимов.
| день входа | n, наши | медиана, наши | доля +, наши | n, лента | медиана, лента | доля +, лента | эдж по медиане |
|---|---|---|---|---|---|---|---|
| 25.08 · лента отрицательна | 415 | +9.54 | 0.627 | 4 807 | -1.28 | 0.472 | +10.81 |
| 26.08 | 232 | +4.32 | 0.603 | 4 883 | +0.07 | 0.501 | +4.25 |
| 27.08 | 484 | +7.12 | 0.601 | 4 663 | +3.38 | 0.608 | +3.74 |
| 28.08 | 235 | +9.74 | 0.634 | 4 141 | +2.23 | 0.567 | +7.51 |
| 29.08 · лента отрицательна | 369 | +3.62 | 0.528 | 5 157 | -6.11 | 0.365 | +9.73 |
| 30.08 | 493 | +4.49 | 0.535 | 6 712 | +1.64 | 0.531 | +2.86 |
| 31.08 · лента отрицательна | 358 | +4.66 | 0.561 | 5 597 | -0.30 | 0.493 | +4.96 |
| 01.09 · наш дрейф отрицателен | 440 | -3.85 | 0.418 | 5 684 | +5.99 | 0.643 | -9.84 |
| 02.09 | 351 | +3.11 | 0.541 | 5 615 | +0.76 | 0.520 | +2.35 |
| 03.09 | 650 | +2.80 | 0.535 | 5 536 | +0.91 | 0.518 | +1.90 |
| 04.09 · наш дрейф отрицателен | 906 | -2.19 | 0.419 | 4 778 | +8.91 | 0.697 | -11.10 |
| 05.09 | 961 | +10.27 | 0.688 | 5 653 | +1.40 | 0.536 | +8.87 |
| 06.09 | 2 382 | +0.00 | 0.500 | 5 090 | +4.59 | 0.612 | -4.58 |
| 07.09 · наш дрейф отрицателен | 902 | -1.10 | 0.451 | 661 | +3.82 | 0.608 | -4.92 |
05_regime_control.py, — +1.73 пп; сырые сэмплы не сохранены, поэтому страница считает взвешенное по дневным n значение (+1.69 пп). Вывод не меняется ни при одном из них.Контринтуитивное: максимальная просадка у длинных рук меньше. −$7 671 на 180 мин против −$3 910 на 600 мин, и это не ошибка знака. Тайм-аут на 180-й минуте закрывал убыточные позиции ровно на дне — фиксировал просадку, вместо того чтобы дать ей отыграться. Длинная рука того же не делает, поэтому её кривая проседает мельче — но платит за это капиталом (секция 3) и концентрацией (секция 5).
Sharpe в этой таблице не считается сознательно. В общей когорте 14 дневных наблюдений, а lib.metrics.sharpe возвращает NaN ниже 30 — правило репозитория, а не оценка на глаз. Сравнивать руки по риску здесь можно только просадкой, худшим днём и отношением итога к просадке.
Просадки взяты из 08_risk_by_arm.csv (lib.metrics.max_dd). lib.forensics на той же кривой руки 600 ранжирует худшей просадку −$4 225: он строит свой путь внутри совпадающих меток времени, поэтому расходится на пару сотен долларов. Файл главнее.
| рука | итог | макс. просадка | итог / просадка | худший день | дней | Sharpe |
|---|---|---|---|---|---|---|
| 180 мин | $51 310 | −$7 671 | 6.7× | −$1 432 | 14 | не считается |
| 240 мин | $59 467 | −$9 469 | 6.3× | −$1 754 | 14 | не считается |
| 300 мин | $69 988 | −$8 718 | 8.0× | −$1 957 | 14 | не считается |
| 360 мин | $80 621 | −$4 978 | 16.2× | −$1 651 | 14 | не считается |
| 480 мин | $100 779 | −$2 913 | 34.6× | −$1 038 | 14 | не считается |
| 600 мин | $114 332 | −$3 910 | 29.2× | −$726 | 14 | не считается |
| 720 мин | $119 599 | −$4 122 | 29.0× | −$927 | 14 | не считается |
trader_exit_decisions за 180-й минутой не существует ни на какой ленте. В живой книге learned exit заработал $28 338 на 1 709 позициях; длинные руки этой защиты лишены полностью — внутри продления работает только take-profit и новый клок. Это делает оценку консервативной (модельный выход добавил бы денег), но одновременно нереалистичной: боевая система так себя никогда не вела.elapsed_fraction_of_timeout и path_completed_minutes (lib/rh_exit_pair.py), то есть модель выхода знает, какая доля её собственного горизонта истекла. При смене горизонта эти фичи меняют смысл, и модель надо переобучать. Овердей на леджере этого не заменяет ни при каком качестве переигровки.exit_impact так, будто он один в стакане, а выходим мы кучей: на токен приходится медианно 9 позиций, p95 — 216, максимум 645. Смягчающее обстоятельство измеримо: кластеризация выходов у длинной руки почти та же, что у короткой — максимум $3 928 против $3 600 ноушенала в одну минуту, p99 $1 251 против $1 248. Абсолютный уровень PnL этим искажён, дельта между руками — почти нет.Удлинение горизонта нельзя проверить овердеем на леджере. Всё, что показано выше, — это верхняя граница арифметики при замороженных входах и отключённом модельном выходе. Чтобы получить число, на которое можно ставить капитал, нужен свип с LABEL_TIMEOUT_MIN > 180 и переобучением всей цепочки: разметка, вход и выход учатся под новый горизонт вместе.
Любой результат такого свипа обязан пройти два контроля, и оба взяты прямо из этого аудита:
| файл | размер | изменён |
|---|---|---|
results/01_arms_uncapped.csv | 1 КБ | 2026-09-07 11:39 |
results/02_arms_capped.csv | 1 КБ | 2026-09-07 11:40 |
results/03_audit_context.json | 2 КБ | 2026-09-07 11:40 |
results/04_per_day.csv | 1 КБ | 2026-09-07 11:40 |
results/05_mtm_split.csv | 0 КБ | 2026-09-07 11:41 |
results/06_uplift_by_token.csv | 1 КБ | 2026-09-07 11:41 |
results/07_drift_by_day.csv | 0 КБ | 2026-09-07 11:41 |
results/08_risk_by_arm.csv | 0 КБ | 2026-09-07 11:41 |
results/09_unconditional_drift.csv | 0 КБ | 2026-09-07 11:44 |
results/10_regime_edge.csv | 1 КБ | 2026-09-07 11:44 |
artifacts/replayed_arms.parquet | 6 674 КБ | 2026-09-07 11:39 |
artifacts/delta_600_vs_180.parquet | 720 КБ | 2026-09-07 11:40 |
artifacts/parity_actual.parquet | 2 478 КБ | 2026-09-07 11:38 |
Отчёт собран из этих файлов скриптом lib/06_build_audit_report.py; графики нарисованы matplotlib и вшиты как base64-PNG, поэтому страница открывается офлайн одним файлом. Числа в тексте подставлены из тех же файлов, а не набраны руками.