Перебор параметров: оси, прочитанные из скрипта, и потолок комбинаций

Перебор параметров — это блок «Параметры для перебора» в автоматическом бэктесте на экране реплея. Каждая ось — это ключ параметра со списком значений через запятую; движок разворачивает их в декартово произведение с потолком в 400 комбинаций, а walk-forward выбирает лучшую конфигурацию для каждого среза.

Senzoukria · Документация · Обновлено: сентябрь 2026


Где найти

Где
Реплей → «Автоматический бэктест» → «Walk-forward — найти лучшую конфигурацию» → «Параметры для перебора»
Оси по умолчанию
lookback 10, 20, 40 · stopTicks 20, 40, 80 · targetTicks 40, 80, 160 (27 комбинаций), пока скрипт не прочитан
Жёсткий потолок
400 комбинаций (MAX_COMBOS); сверх него прогон отклоняется, а не обрезается
Критерий отбора
По умолчанию SQN; также профит-фактор, матожидание на сделку или Sharpe на сделку

Что это делает

Перебор превращает одну стратегию в сетку конфигураций. Каждая ось — это ключ параметра и список значений, набранный как «10, 20, 40». Движок строит декартово произведение всех осей поверх базовых параметров стратегии (expandSweep), затем последовательно прогоняет по одному бэктесту на комбинацию на тех же барах, чтобы интерфейс оставался пригодным для работы во время прогона.

Внутри walk-forward сетка переоценивается на обучающей части каждого среза; конфигурация с лучшим баллом затем тестируется на той части среза, которая в выборе не участвовала. Счётчик под осями читается как «{n} комбинаций × {folds} срезов — около {duration}», чтобы вы знали цену до нажатия «Запустить».

Оси предлагаются по самому скрипту. Статический разборщик (parametresLus) ищет в исходнике params.get("key", default), params["key"], params.key ?? default, а также однострочные лямбда- и стрелочные псевдонимы, оборачивающие params. Скрипты на C++ в ABI v1 параметров не раскрывают, поэтому для них ничего не предлагается. Для ключа, который скрипт никогда не читает, показывается предупреждение «Этот скрипт никогда не читает «{key}»: его перебор вернёт одинаковые результаты».

Настройки

Элементы блока «Параметры для перебора» и строки walk-forward над ним
НастройкаПо умолчаниюЧто меняет
Срезы4 (ввод 2–12)Число последовательных непересекающихся фолдов; каждый обучается на своём начале и тестируется на конце
Доля обучения0,7 (0,5–0,9, шаг 0,05)Доля каждого среза, по которой выбирается конфигурация; остальное — тест вне выборки
Критерий отбораSQNБалл для ранжирования комбинаций: SQN, профит-фактор, матожидание на сделку или Sharpe на сделку. Валовой P&L намеренно отсутствует
Ключ и значения осиlookback, stopTicks, targetTicks по три значенияПо строке на параметр; пустые и нечисловые записи молча отбрасываются
Добавить параметрДобавляет следующий читаемый скриптом параметр, который ещё не занят ни одной осью, с предложенными значениями; иначе пустую строку
Исследовать каждый читаемый параметр (n)Заменяет оси на до пяти параметров, прочитанных из скрипта, со значениями вокруг их умолчаний
Удалить этот параметрУдаляет строку оси
Минимум сделок10 (константа движка)Конфигурация с меньшим числом сделок получает −∞ и не может быть выбрана

Как строятся предлагаемые значения

  • Целое значение по умолчанию ≥ 2 считается окном или счётчиком: предлагаются половина, само значение и двойное (20 → 10, 20, 40).
  • Значение в диапазоне ]0, 1] считается долей: ±0,1, строго в пределах от 0 до 1.
  • Любое другое число считается коэффициентом: ±25 %, с округлением до двух знаков.
  • qty, color и colour не предлагаются никогда: количество умножает результат, не меняя решения. Вписать их вручную по-прежнему можно.
  • По умолчанию предлагаются три оси в том порядке, в каком их читает скрипт; кнопка с молнией расширяет набор до пяти.

Ограничения и подводные камни

Потолок в 400 комбинаций — это не настройка производительности. Панель говорит прямо: каждая лишняя комбинация — это ещё одна попытка на тех же данных, и за этой чертой вы измеряете везение переобучения, а не стратегию. Сузьте диапазон или переберите меньше параметров за раз.

Разборщик статический. Он не видит ключа, собранного во время выполнения (params.get("hmm" + suffix)), и цикла по словарю; такие параметры нужно вписывать вручную. И наоборот, оси перестают следовать за скриптом, как только вы их отредактировали; действие «перечитать скрипт» возвращает управление ему.

В дефлированный Sharpe передаётся число комбинаций, а не произведение комбинаций на срезы: чистая проверка вам в минус не идёт. Как этот счётчик питает PSR, DSR и PBO, описано на странице тестов на переобучение.

Эта страница на других языках

Частые вопросы

Почему мой перебор даёт одинаковые результаты на всех комбинациях?
Перебираемый ключ скриптом не читается. Панель теперь это помечает («Этот скрипт никогда не читает…»); замените его на один из параметров, предложенных по исходнику, либо добавьте вызов params.get в свой скрипт.
Можно ли перебрать больше 400 комбинаций, запустив дважды?
Можно, но каждый прогон — это новый набор попыток на тех же барах, а дефлированный Sharpe знает только попытки текущего прогона. Потолок существует, чтобы поправка оставалась честной; лучше взять меньше осей с более широким шагом.
Выполняется ли перебор параллельно?
Нет. Движок прогоняет комбинации одну за другой и по ходу сообщает прогресс, чтобы панель оставалась читаемой, пока сетка прорабатывается. Оценка рядом со счётчиком комбинаций нужна, чтобы спланировать прогон до его запуска.