Skip to main content

Architecture

BarForecast TailOnly v2 architecture and training workflow

Architecture: BarForecast TailOnly v2 with separate EAM/P6 and AuxEM/auxP6 training contours, precision class 1 reporting, exclusion of contexts without calculated control targets, and a simplified limited-run workflow without redundant commands

Section Architecture
Updated 25.06.2026

Что изменилось#

BarForecast TailOnly v2 больше не живёт как один общий training-контур.

Схема разделена на два независимых набора:

  • Набор EAM/P6
  • G1: EAM
  • Цель: P6
  • Контур БД: bar_forecast_context_P6 + bar_forecast_tail_bars_P6
  • Набор notebook-ов: CatBoost_5_EAM_on_P6_bump2_s + NN_BarForecast_EAM_P6 + Blend_CatBoost_EAM_P6
  • Набор AuxEM/auxP6
  • G1: EM
  • Цель: auxP6
  • Контур БД: bar_forecast_context_auxP6 + bar_forecast_tail_bars_auxP6
  • Набор notebook-ов: CatBoost_5_AuxEM_on_auxP6_bump2_s + NN_BarForecast_AuxEM_auxP6 + Blend_CatBoost_AuxEM_auxP6

Промежуточные наборы AM/P6, generic auxP6 и legacy TailOnly_v2 notebook-и удалены, чтобы operational-контракт был однозначным.

Общая архитектура#

Внутри каждого набора схема одинаковая:

PHP runtime builder
    ->
context table + tail bars table
    ->
PHP exporter
    ->
CSV snapshot
    ->
Python prefix dataset builder
    ->
prefix_index.parquet + tailnet_prefix_dataset.parquet + tailnet_sequences.npy
    ->
static CatBoost + TailNet
    ->
Blender

Главное архитектурное решение:

  • Prefix-CatBoost полностью удалён;
  • статический CatBoost отвечает только за исходные legacy-признаки модели;
  • вся prefix-динамика живёт только в TailNet;
  • Blender объединяет static score и sequence score.

Роли моделей#

Static CatBoost#

CatBoost:

  • не знает про prefix_len;
  • не читает tail slice;
  • не строит prefix-aware признаки;
  • выдаёт один статический score на уровень model_id.

Это статический prior, который потом используется в blender.

TailNet#

TailNet:

  • работает по bar-by-bar sequence;
  • видит только уже наблюдённый prefix хвоста;
  • строит score для каждого (context_id, prefix_len);
  • ограничивается первым касанием правой целевой точки включительно.

Blender#

Blender получает:

  • catboost_static_oof_score или catboost_static_score;
  • tailnet_oof_score или tailnet_score.

После этого он учится собирать один итоговый stacked score.

Какие таблицы теперь используются#

Контур P6#

Для набора EAM/P6 используются:

  • bar_forecast_context_P6
  • bar_forecast_tail_bars_P6

Этот контур хранит P6-contexts и их хвосты.

На уровне БД в нём могут лежать модели EAM и AM, но текущий рабочий training-набор использует только EAM.

Контур auxP6#

Для набора AuxEM/auxP6 используются:

  • bar_forecast_context_auxP6
  • bar_forecast_tail_bars_auxP6

В этом контуре всё, что раньше было смыслово привязано к CP, переориентировано на auxP6.

Технические поля cp_* в Python prefix-контракте пока сохраняются ради совместимости, но внутри этого контура они означают правую целевую точку auxP6.

Понятное описание основных параметров#

Context-level поля#

  • model_id - идентификатор модели; через него TailNet и CatBoost связываются в blender.
  • context_id - идентификатор конкретного runtime context.
  • aim_name - имя целевой ветки, сейчас это либо P6, либо auxP6.
  • t_end_rel - относительная позиция бара, на котором заканчивается модель и после которого начинается прогнозный хвост.
  • cp_rel - относительная позиция правой целевой точки текущего контура: для EAM/P6 это P6, для AuxEM/auxP6 это auxP6.
  • size_time_controls - длина ключевого контрольного интервала в барах.
  • t_end_close - цена закрытия на t_end, которая используется как якорь нормализации хвоста.

Prefix-level metadata#

Эти поля живут в prefix_index.parquet и tailnet_prefix_dataset.parquet.

  • prefix_len - сколько баров хвоста уже увидено в текущем sample.
  • cp_prefix_len - длина prefix, на последнем баре которого впервые достигнута правая целевая точка текущего контура.
  • cp_reached_in_tail - достигалась ли целевая точка в историческом хвосте вообще.
  • current_tail_bar_id - идентификатор последнего уже увиденного бара prefix.
  • split_name - split строки: train, val или test.
  • seq_len - длина полной последовательности контекста в compact sequence-store.
  • context_sequence_row_idx - индекс строки context в tailnet_sequences.npy.

Helper target-поля#

Builder не считает финальный target_label, а передаёт notebook-слою helper-поля:

  • target_source_col - имя исходной колонки target.
  • target_dev_source_col - имя исходной dev-колонки.
  • target_value_frac_default - нормализованное target-значение.
  • target_dev_frac_default - нормализованное dev-значение.

При этом contexts без рассчитанного target_value_frac_default больше не попадают в offline sequence dataset вообще.

Это важно по двум причинам:

  • такие модели не являются trainable sample-ами для рассматриваемых TailNet-веток;
  • builder не должен materialize-ить по ним prefix-слайсы, чтобы не раздувать prefix_index.parquet, tailnet_prefix_dataset.parquet и tailnet_sequences.npy.

Sequence-каналы TailNet#

Порядок признаков в tailnet_sequences.npy:

  • o_rel - open, нормализованный относительно t_end_close.
  • h_rel - high, нормализованный относительно t_end_close.
  • l_rel - low, нормализованный относительно t_end_close.
  • c_rel - close, нормализованный относительно t_end_close.
  • v_log1p - логарифмированный объём.
  • tail_pos_norm - нормализованная позиция бара внутри effective learning window.
  • is_forecast_start - флаг первого бара прогнозного хвоста.
  • is_cp_bar - флаг бара, на котором достигнута правая целевая точка контура.

Правило правой целевой точки#

Sequence-оценка нужна только до первого касания правой целевой точки, включая сам этот бар.

В EAM/P6-контуре этой точкой является P6.

В AuxEM/auxP6-контуре этой точкой является auxP6.

Поэтому offline builder материализует только prefix-и:

1 <= prefix_len <= cp_prefix_len

Это означает:

  • TailNet не учится на хвосте после достижения целевой точки;
  • Blender получает только операционно осмысленные prefix-строки;
  • sequence-часть ограничена реальным окном принятия решения.

Контексты без рассчитанного control-target#

Если у модели отсутствует рассчитанный P6 или auxP6 target, это не трактуется как отрицательный класс.

Смысл такой строки другой:

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

Текущий контракт теперь двухступенчатый:

  • на уровне prefix_builder context без target_value_frac_default исключается ещё до split и до materialize prefix-слайсов;
  • на уровне NN-notebook такой sample повторно не может попасть в train/val/test/OOF, даже если dataset был собран старой версией builder-а.

Практический эффект:

  • offline dataset не раздувается лишними prefix-строками;
  • sequence-обучение не тратит время на нетренируемые модели;
  • отсутствие control-target не маскируется под класс 0.

Итоговые наборы notebook-ов#

Набор EAM/P6#

Основной каталог:

  • BarForecast/notebooks/CatBoost_5_EAM_on_P6_bump2_s.ipynb
  • BarForecast/notebooks/NN_BarForecast_EAM_P6.ipynb
  • BarForecast/notebooks/Blend_CatBoost_EAM_P6.ipynb

Для внешнего запуска:

  • BarForecast/notebooks/transfer/CatBoost_5_EAM_on_P6_bump2_s.ipynb
  • BarForecast/notebooks/transfer/NN_BarForecast_EAM_P6.ipynb
  • BarForecast/notebooks/transfer/Blend_CatBoost_EAM_P6.ipynb

Набор AuxEM/auxP6#

Основной каталог:

  • BarForecast/notebooks/CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynb
  • BarForecast/notebooks/NN_BarForecast_AuxEM_auxP6.ipynb
  • BarForecast/notebooks/Blend_CatBoost_AuxEM_auxP6.ipynb

Для внешнего запуска:

  • BarForecast/notebooks/transfer/CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynb
  • BarForecast/notebooks/transfer/NN_BarForecast_AuxEM_auxP6.ipynb
  • BarForecast/notebooks/transfer/Blend_CatBoost_AuxEM_auxP6.ipynb

Порядок запуска по контурам#

Быстрый список#

  • Контур EAM/P6
  • Build: php .\BarForecast\bar_forecast_build_P6.php --mode=all --dry-run=0
  • Export: php .\BarForecast\bar_forecast_export_P6.php --aim=P6 --g1=EAM
  • Prefix builder: python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\P6_dataset
  • CatBoost: CatBoost_5_EAM_on_P6_bump2_s.ipynb
  • TailNet: NN_BarForecast_EAM_P6.ipynb
  • Blender: Blend_CatBoost_EAM_P6.ipynb
  • Контур AuxEM/auxP6
  • Build: php .\BarForecast\bar_forecast_build_auxP6.php --mode=all --dry-run=0
  • Export: php .\BarForecast\bar_forecast_export_auxP6.php --aim=auxP6 --g1=EM
  • Prefix builder: python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\auxP6_dataset
  • CatBoost: CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynb
  • TailNet: NN_BarForecast_AuxEM_auxP6.ipynb
  • Blender: Blend_CatBoost_AuxEM_auxP6.ipynb

Пошагово для EAM/P6#

cd d:\Domains\sb.marketpawns

Переход в корень проекта, откуда дальше запускаются php и python команды.

php .\BarForecast\bar_forecast_build_P6.php --mode=all --dry-run=0

Заполняет runtime-таблицы P6-контура в БД.

php .\BarForecast\bar_forecast_export_P6.php --aim=P6 --g1=EAM

Выгружает EAM/P6 snapshot из БД в P6_dataset.

python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\P6_dataset

Строит prefix- и sequence-артефакты для NN-ноутбука из уже выгруженного snapshot-а. Для P6_dataset builder автоматически подхватывает contexts_P6.csv и tail_bars_P6.csv.

Затем запускать по порядку:

  • CatBoost_5_EAM_on_P6_bump2_s.ipynb
  • NN_BarForecast_EAM_P6.ipynb
  • Blend_CatBoost_EAM_P6.ipynb

Пошагово для AuxEM/auxP6#

cd d:\Domains\sb.marketpawns

Переход в корень проекта, откуда дальше запускаются php и python команды.

php .\BarForecast\bar_forecast_build_auxP6.php --mode=all --dry-run=0

Заполняет runtime-таблицы auxP6-контура в БД.

php .\BarForecast\bar_forecast_export_auxP6.php --aim=auxP6 --g1=EM

Выгружает AuxEM/auxP6 snapshot из БД в auxP6_dataset.

python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\auxP6_dataset

Строит prefix- и sequence-артефакты для NN-ноутбука из уже выгруженного snapshot-а. Для auxP6_dataset builder автоматически подхватывает contexts_auxP6.csv и tail_bars_auxP6.csv.

Затем запускать по порядку:

  • CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynb
  • NN_BarForecast_AuxEM_auxP6.ipynb
  • Blend_CatBoost_AuxEM_auxP6.ipynb

Ограниченный прогон на 100000#

Ниже приведена practical-цепочка для ограниченного прогона, когда нужно:

  • заполнить runtime-таблицы только по ограниченному числу моделей;
  • собрать ограниченный export snapshot;
  • построить prefix dataset только на этом объёме;
  • затем обучить TailNet на уже ограниченном dataset.

Важно:

  • для build лимит задаётся как --limit по числу моделей в mode=all;
  • для export лимит задаётся как --limit-contexts;
  • active NN-ноутбуки читают канонические каталоги BarForecast/data/P6_dataset и BarForecast/data/auxP6_dataset, поэтому ограниченный export нужно писать именно туда, если цель состоит в реальном CLI-запуске этих notebook-ов без ручной правки кода;
  • prefix_builder в contour-каталогах теперь сам подбирает правильные CSV-имена и не требует ручных --contexts-file / --tail-bars-file;
  • если export уже записал в канонический каталог только ограниченный набор, то обычный prefix_builder и обычный запуск notebook-а автоматически будут работать только на нём;
  • такой прогон временно заменяет содержимое канонического dataset-каталога ограниченной выборкой, поэтому после smoke/mini-run полный dataset нужно пересобрать отдельным полным export + prefix-builder запуском.

Ограниченный прогон EAM/P6#

cd d:\Domains\sb.marketpawns

Переход в корень проекта для ограниченного прогона.

php .\BarForecast\bar_forecast_build_P6.php --mode=all --dry-run=0 --include-g1=EAM --limit=100000

Заполняет P6 runtime-таблицы только для ограниченного EAM-батча.

php .\BarForecast\bar_forecast_export_P6.php --aim=P6 --g1=EAM --limit-contexts=100000 --dir D:\Domains\sb.marketpawns\BarForecast\data\P6_dataset

Выгружает ограниченный EAM/P6 snapshot в канонический P6_dataset.

python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\P6_dataset

Пересобирает prefix dataset уже по ограниченному export-у.

Затем запускать обычный NN_BarForecast_EAM_P6.ipynb, потому что он уже будет читать ограниченный P6_dataset.

Ограниченный прогон AuxEM/auxP6#

cd d:\Domains\sb.marketpawns

Переход в корень проекта для ограниченного прогона.

php .\BarForecast\bar_forecast_build_auxP6.php --mode=all --dry-run=0 --include-g1=EM --limit=100000

Заполняет auxP6 runtime-таблицы только для ограниченного AuxEM-батча.

php .\BarForecast\bar_forecast_export_auxP6.php --aim=auxP6 --g1=EM --limit-contexts=100000 --dir D:\Domains\sb.marketpawns\BarForecast\data\auxP6_dataset

Выгружает ограниченный AuxEM/auxP6 snapshot в канонический auxP6_dataset.

python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\auxP6_dataset

Пересобирает prefix dataset уже по ограниченному export-у.

Затем запускать обычный NN_BarForecast_AuxEM_auxP6.ipynb, потому что он уже будет читать ограниченный auxP6_dataset.

Опциональные safeguard-команды#

Следующие команды не обязательны, если каталог dataset уже гарантированно ограничен свежим export-ом, но могут быть полезны как дополнительная страховка:

  • python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir ... --max-contexts 100000
  • python -m jupyter nbconvert --to notebook --execute ...

Первая команда добавляет второй лимит на уровне prefix_builder, а вторая просто запускает notebook из CLI и сохраняет executed-копию. На сам объём обучения она не влияет, если dataset уже ограничен.

Что ожидать после ограниченного прогона#

  • в contour runtime-таблицах будут только первые 100000 моделей выбранного G1, которые прошли текущий build-фильтр;
  • в каноническом dataset-каталоге будет ограниченный export snapshot и соответствующий prefix dataset;
  • NN-ноутбук при обычном запуске будет обучаться именно на этом ограниченном dataset и сохранит артефакты в artifacts_tailnet_eam_p6 или artifacts_tailnet_auxem_auxp6 рядом с каталогом запуска notebook-а;
  • если после этого нужен полный production-like dataset, ограниченные артефакты нужно перезаписать полным прогоном без --limit и --limit-contexts.

Что должно получиться после каждого шага#

После PHP builder#

  • runtime-таблицы нужного контура заполнены;
  • новые contexts и tail bars видны в соответствующих P6 или auxP6 таблицах.

После PHP exporter#

  • собран CSV snapshot только для нужного G1 и нужной цели;
  • notebook guard-ы смогут проверить, что training запускается на правильном контуре.

После prefix builder#

  • sequence dataset построен;
  • готовы prefix_index.parquet, tailnet_prefix_dataset.parquet, tailnet_sequences.npy, prefix_meta.json.
  • contexts без рассчитанного P6/auxP6 target уже исключены и не занимают место в prefix-слайсах.

После static CatBoost#

  • готов статический bridge по model_id для blender.

После TailNet#

  • готов prefix-aware sequence score для blender.

После blender#

  • получена финальная stacked-модель, которая объединяет статический prior и динамический сигнал хвоста.

Важные operational-замечания#

  • Для EAM/P6 export должен быть именно --g1=EAM, иначе notebook guard остановит запуск.
  • Для AuxEM/auxP6 export должен быть именно --g1=EM, потому что фактическое значение G1 в данных сейчас хранится как EM, хотя набор называется AuxEM.
  • Blender всегда запускается после CatBoost и TailNet, потому что ему нужны уже готовые static и sequence score-файлы.
  • Старые notebook-и TailOnly_v2, AM/P6 и generic auxP6 удалены намеренно, чтобы в каталоге не было двусмысленных точек входа.

Короткий чеклист#

EAM/P6#

cd d:\Domains\sb.marketpawns
php .\BarForecast\bar_forecast_build_P6.php --mode=all --dry-run=0
php .\BarForecast\bar_forecast_export_P6.php --aim=P6 --g1=EAM
python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\P6_dataset
CatBoost_5_EAM_on_P6_bump2_s.ipynb
NN_BarForecast_EAM_P6.ipynb
Blend_CatBoost_EAM_P6.ipynb

AuxEM/auxP6#

cd d:\Domains\sb.marketpawns
php .\BarForecast\bar_forecast_build_auxP6.php --mode=all --dry-run=0
php .\BarForecast\bar_forecast_export_auxP6.php --aim=auxP6 --g1=EM
python .\BarForecast\tools\barforecast_tailonly_v2_prefix_builder.py --data-dir D:\Domains\sb.marketpawns\BarForecast\data\auxP6_dataset
CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynb
NN_BarForecast_AuxEM_auxP6.ipynb
Blend_CatBoost_AuxEM_auxP6.ipynb

Continue Reading

Related Articles