Пример разложения на биты:
| Бит | Значение 0 | Значение 1 |
|---|---|---|
LevelSel |
LOW | CLOSE |
StrategySel |
LP_R | LP_G |
Dir_bit |
падающий уровень | растущий уровень |
Стратегия содержит несколько независимых решений. Проверять их «как есть» бессмысленно: непонятно, какое звено даёт результат, а какое — шум. Битовая карта позволяет изолировать вклад каждого звена — менять один бит при фиксированных остальных и сравнивать результат.
Штатный оптимизатор TSLab перебирает любые параметры из сетки, включая логические переключатели — если они объявлены как оптимизируемые. Битовая карта делает логические решения явными параметрами, которые можно включить в сетку и прогнать декартовым произведением вместе с остальными.
СтруктураБит задаётся константой ConstGen с двумя значениями, объявленной как оптимизируемый параметр. Константа подаётся в формулу, где она работает как фильтр:
LP_G_mask = LP_G && StrategySel==1 LP_R_mask = LP_R && StrategySel==0
Или через тернарник, если веток больше двух:
Level = LevelSel==0 ? LOW : CLOSE
При добавлении нового уровня (EMA, SMA) меняется только выражение в Level. Все зависимые блоки (false_breakout, green_bar, Level_dir) работают от Level и не требуют правок:
Level = LevelSel==0 ? LOW : (LevelSel==1 ? CLOSE : (LevelSel==2 ? EMA : SMA))
Изменение одного бита не влияет на другие. Это позволяет ставить контролируемые эксперименты: зафиксировать LevelSel и Dir_bit, прогнать StrategySel в двух состояниях, сравнить PnL.
Метод работает в двух режимах: (а) ручной — по одному прогону на бит, для понимания вклада каждого звена; (б) через оптимизатор — декартово произведение по сетке битов, для полного перебора комбинаций. Ниже описан ручной — он полезнее для анализа. Автоматический даёт ту же таблицу, но без пошагового осмысления.
Каждое смысловое решение — отдельный бит. Не «стратегия A против B», а «уровень», «направление», «тип сигнала». Минимальные единицы, которые можно включать и выключать независимо.
Все биты в 0. Прогон. Записать PnL, число сделок, просадку. Это база для сравнения.
Для каждого бита — два прогона: значение 0 и значение 1, остальные фиксированы. Записать результат каждого. Сравнить с базой.
Пример таблицы:
| Прогон | LevelSel | StrategySel | Dir_bit | PnL | Сделок |
|---|---|---|---|---|---|
| База | 0 | 0 | 0 | X | N |
| Тест 1 | 1 | 0 | 0 | X₁ | N₁ |
| Тест 2 | 0 | 1 | 0 | X₂ | N₂ |
| Тест 3 | 0 | 0 | 1 | X₃ | N₃ |
Если X₁ заметно отличается от X — LevelSel влияет. Если нет — звено нейтрально.
Из прогонов выбрать значения битов, давшие лучший результат. Прогнать вместе. Проверить, сохраняется ли суммарный эффект.
| Комбинация | PnL |
|---|---|
| Лучшие по отдельности | X_best |
| Все вместе | X_comb |
Если X_comb сильно хуже X_best — звенья конфликтуют. Нужно найти, какое из них ломает.
Прогнать лучшую комбинацию на других периодах, инструментах, таймфреймах. Если результат сохраняется — звено рабочее. Если разваливается — это подгонка под конкретную историю.
Ограничения методаЧисловые параметры внутри звена. Период EMA, порог стопа, процент прокола — это не биты. Их перебирает штатный оптимизатор. Битовая карта работает на уровень выше — определяет, какие звенья включены.
Совместные эффекты. Два звена по отдельности могут быть нейтральны, а вместе — значимы (или наоборот). Битовая карта это покажет в шаге 4, но не объяснит причину. Для объяснения нужна гипотеза о механизме.
Комбинаторный взрыв. N битов дают 2^N комбинаций: 5 битов — 32 прогона (минуты), 10 — 1024 (часы), 15 — 32768 (сутки). Практический предел — 5–7 битов (32–128 комбинаций). Дальше — либо сокращать биты, либо разбивать исследование на этапы: сначала отобрать рабочие звенья по одному, потом собрать лучшие. Правило: число комбинаций не должно превышать число сделок в 10+ раз, иначе результат — статистический шум.
Практический примерСтратегия «ложный пробой уровня». Три бита:
LevelSel — 0 (LOW) / 1 (CLOSE)
StrategySel — 0 (LP_R) / 1 (LP_G)
Dir_bit — 0 (падающий уровень) / 1 (растущий уровень)
Три бита дают 2³ = 8 комбинаций. Оптимизатор прогоняет их за один запуск, таблица результатов заполняется автоматически. По разнице PnL видно:
какой уровень даёт лучший отклик;
какая стратегия устойчивее;
в каком направлении работает фильтр.
Дальше — тонкая настройка числовых параметров (период EMA, порог стопа) тем же оптимизатором, но уже внутри выбранной комбинации битов.
ИтогБитовая карта — способ декомпозировать стратегию на независимые решения и проверить вклад каждого. Биты объявляются как оптимизируемые параметры, и штатный оптимизатор перебирает все 2^N комбинаций за один запуск — декартовым произведением по сетке. Числовые параметры внутри звеньев (период EMA, порог стопа, процент прокола) перебираются тем же оптимизатором на следующем этапе — уже внутри выбранной комбинации битов.
Метод даёт не «лучшее число», а понимание: какие звенья работают, какие нейтральны, какие конфликтуют. Дальше — тонкая настройка числовых параметров внутри выбранного звена.
Скрипт из видео: t.me/matharanea
Где у метода слабые места (в комментариях автору на это уже намекнули)
1. Ручной режим «меняй по одному от нулевой базы» в статистике называется OFAT (one factor at a time). Он не видит взаимодействий звеньев: вклад бита зависит от того, в каком положении стоят остальные. Раз полный перебор 2^3 стоит всего 8 прогонов, лучше прогнать всё и посчитать главные эффекты и взаимодействия, усредняя по остальным битам. Сравнение с одной базой тут хуже.
2. Выбор лучшей из 8 комбинаций, а потом ещё и чисел под неё, — это подгонка в квадрате. Проверка на других данных у автора стоит только шагом 5 и в ответе в комментариях. На деле она обязательна: walk-forward или хотя бы честный out-of-sample.
3. Критерий «PnL заметно отличается» без порога шума ничего не значит. Биты сильно меняют число сделок, поэтому сравнивать надо доход на сделку, Sharpe и просадку, а значимость разницы проверять, например бутстрепом по сделкам.
4. Двухэтапность «сначала структура, потом числа» тоже теряет взаимодействия. Структура, лучшая при числах по умолчанию, может проиграть после их настройки. Надёжнее смотреть, держится ли преимущество звена на всём диапазоне чисел, то есть есть ли плато, а не пик.
5. LevelSel с четырьмя вариантами уже не бит, а категориальный фактор. Это не мешает, просто «битовая карта» тут скорее название, чем суть.
Итог: хорошая дисциплина декомпозиции, но без полного факторного разбора и out-of-sample это скорее способ навести порядок в экспериментах, чем доказательство, что звено работает.