Что изменилось#
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-barsequence; - видит только уже наблюдённый 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_P6bar_forecast_tail_bars_P6
Этот контур хранит P6-contexts и их хвосты.
На уровне БД в нём могут лежать модели EAM и AM, но текущий рабочий training-набор использует только EAM.
Контур auxP6#
Для набора AuxEM/auxP6 используются:
bar_forecast_context_auxP6bar_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_buildercontext без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.ipynbBarForecast/notebooks/NN_BarForecast_EAM_P6.ipynbBarForecast/notebooks/Blend_CatBoost_EAM_P6.ipynb
Для внешнего запуска:
BarForecast/notebooks/transfer/CatBoost_5_EAM_on_P6_bump2_s.ipynbBarForecast/notebooks/transfer/NN_BarForecast_EAM_P6.ipynbBarForecast/notebooks/transfer/Blend_CatBoost_EAM_P6.ipynb
Набор AuxEM/auxP6#
Основной каталог:
BarForecast/notebooks/CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynbBarForecast/notebooks/NN_BarForecast_AuxEM_auxP6.ipynbBarForecast/notebooks/Blend_CatBoost_AuxEM_auxP6.ipynb
Для внешнего запуска:
BarForecast/notebooks/transfer/CatBoost_5_AuxEM_on_auxP6_bump2_s.ipynbBarForecast/notebooks/transfer/NN_BarForecast_AuxEM_auxP6.ipynbBarForecast/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.ipynbNN_BarForecast_EAM_P6.ipynbBlend_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.ipynbNN_BarForecast_AuxEM_auxP6.ipynbBlend_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 100000python -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/auxP6target уже исключены и не занимают место в prefix-слайсах.
После static CatBoost#
- готов статический bridge по
model_idдля blender.
После TailNet#
- готов prefix-aware sequence score для blender.
После blender#
- получена финальная stacked-модель, которая объединяет статический prior и динамический сигнал хвоста.
Важные operational-замечания#
- Для
EAM/P6export должен быть именно--g1=EAM, иначе notebook guard остановит запуск. - Для
AuxEM/auxP6export должен быть именно--g1=EM, потому что фактическое значениеG1в данных сейчас хранится какEM, хотя набор называетсяAuxEM. Blenderвсегда запускается послеCatBoostиTailNet, потому что ему нужны уже готовые static и sequence score-файлы.- Старые notebook-и
TailOnly_v2,AM/P6и genericauxP6удалены намеренно, чтобы в каталоге не было двусмысленных точек входа.
Короткий чеклист#
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