Logo hamster-bot
RU EN PT

Загрузка…


hw98_console_prompt.avif Тестирование торговых стратегий на исторических данных

Достоверный портфельный бэктест. Уровень quant-исследований quant

Первый запуск тестера video первый запуск тестера Обзор обновлений и оптимизатор параметров video обзор обновлений и оптимизатор параметров Перебор и анализ. Построение тепловых карт и 3d Surface video Перебор и анализ. построение тепловых карт и 3d surface Тестер торговых стратегий. Инструкция по проведению тестов. Перебор торговых пар. video инструкция по проведению тестов. перебор торговых пар

hamster-bot/tester - продвинутый инструмент для тестирования своих торговых систем на исторических данных.

Особенности бэктестера:

Реализовано как отдельный коннектор к "бирже" (Mock-объект заменяющий биржу). Таким образом можно протестировать весь ранее написанный код бота. Бот думает, что работает на реальной бирже (ставит ордера, получает баланс и инфу о позициях). А эта виртуальная биржа всё считает и генерирует отчет.

Инструкция по использованию (пошагово)

Ниже — порядок действий от первого запуска до подбора параметров. Подробности по каждому параметру смотрите в разделах ниже.

Что понадобится.
— установленный hamster-bot последней версии (тестер встроен в бота, отдельно ставить ничего не нужно);
— интернет для скачивания исторических данных и параметров инструментов с биржи;
— файлы настроек стратегий в папке settings_strategy и хотя бы один аккаунт в папке settings_accounts.
Тестер не отправляет ордера на реальную биржу: вместо неё бот работает с виртуальной биржей. С биржи берутся только публичные данные — история торгов и параметры инструмента (шаг цены, минимальный лот и т.п.), они кэшируются в tester/data/{exchange}/_markets.

Шаг 1. Подготовьте стратегии.
Каждый файл в settings_strategy — это одна стратегия на одной паре. Проверьте в нём:
— exchange.name — биржа, с которой будут скачаны данные (bybit, binance, mexc, bitmex и др., см. раздел "Рыночные данные");
— exchange.account — должен совпадать с полем name одного из файлов в settings_accounts. Стратегия без подходящего аккаунта в тест не попадёт;
— basic.symbol и basic.time_frame — пара и таймфрейм;
— размер лота и настройки стратегии — как для реальной торговли;
— при необходимости — свой период торговли для этой стратегии внутри общего теста (раздел tester в файле настройки):
"tester": { "StartDate": "2026-02-01T00:00:00", "EndDate": "2026-02-20T00:00:00" }
До StartDate стратегия не торгует, после EndDate тестер один раз снимает её ордера и закрывает позицию по рынку, дальше пара не торгует. Любое из полей можно не указывать — тогда ограничения с этой стороны нет. Удобно, когда пара появилась на бирже позже начала теста, была делистнута или когда нужно проверить портфель, где стратегии подключались в разное время.
При запуске из консоли или кнопкой на вкладке "Файлы" в тест попадают все стратегии из settings_strategy сразу — это портфельный тест на одном общем балансе. Поэтому для экспериментов удобно держать отдельную копию папки бота, где лежат только тестируемые настройки и не трогаются рабочие. Выбрать отдельные стратегии можно в мастере тестера (шаг 3).

Шаг 2. Настройте config_tester.json.
Файл лежит в папке бота. Если его нет, он создаётся со значениями по умолчанию при первом запуске тестера. Редактировать можно в текстовом редакторе или в веб-интерфейсе бота (вкладка "Тестер" → "Файлы" → "Редактировать config_tester.json" — там же есть подсказки к каждому параметру).
Для первого теста достаточно задать:

"name_comment": "first_test",
"InitialBalance": 1000.0,
"StartDate": "2026-01-01T00:00:00",
"EndDate": "2026-03-01T00:00:00",
"WarmupDays": 30,
"MakerFee": 0.00036,
"TakerFee": 0.001,
"UpdateData": true,
"parameter_mining": []

name_comment — имя папки, куда сложатся отчёты: tester/report/first_test. WarmupDays берите не меньше, чем нужно самому длинному индикатору стратегии (например для MA 200 на 1h таймфрейме нужно минимум 9 дней). Комиссии укажите свои, с учётом уровня аккаунта. Остальные параметры можно оставить по умолчанию — их описание в разделе "Параметры тестера".

Шаг 3. Запустите тест. Есть два способа.

А) Через веб-интерфейс бота — вкладка Тестер. Бот при этом продолжает работать в обычном режиме.
Вкладка Таблица — список стратегий, загруженных ботом:
— кнопка Тест в строке стратегии — тест только этой стратегии;
— кнопка Запустить тестер над таблицей — тест нескольких стратегий на общем балансе: отметьте нужные галочками (или Выбрать все).
Откроется окно "Мастер тестера" с параметрами тестера. Поправьте период, баланс и т.д. и нажмите Запустить. Изменения в мастере действуют только на этот запуск и в config_tester.json не сохраняются. Мастер делает один прогон — перебор parameter_mining в нём не выполняется.
Прогресс показывается прямо в таблице. После завершения появится кнопка Результат — в строке стратегии (одиночный тест) или над таблицей (тест нескольких стратегий): краткая сводка (PnL, просадка, сделки, WinRate, комиссии) и кнопка Открыть график — полный HTML отчёт.

Вкладка Файлы:
— Редактировать config_tester.json — редактор параметров тестера (сохраняет в файл);
— Запустить тестер — полный запуск, как из консоли: все стратегии из settings_strategy и перебор parameter_mining, если он задан. Одновременно может идти только один такой запуск;
— статус тестера и списки "Отчёты оптимизатора", "Отчёты", "Наборы данных" — открыть отчёт в браузере (Open), скачать (Download), посмотреть, за какой период уже скачаны данные.

Б) Из консоли — удобно для больших переборов. Запускайте из папки бота:

# Windows
run_tester.bat              или   hb_c.exe --run-tester
run_download_data.bat       или   hb_c.exe --download-data
run_report_optimizer.bat    или   hb_c.exe --run-report-optimizer tester\report\first_test

# macOS
./run_tester_mac.sh         или   ./hb_c --run-tester

# Linux
./hb_c --run-tester
./hb_c --download-data
./hb_c --run-report-optimizer tester/report/first_test

--run-tester — тест, --download-data — только скачать данные, --run-report-optimizer — перестроить сводный отчёт оптимизатора. Если скрипта нет в папке бота, используйте команду из правой колонки.
В этом режиме бот не торгует: он читает настройки, проводит тесты и завершает работу. Если на этом же компьютере уже запущен торгующий бот, запускайте тестер из отдельной копии папки.

Шаг 4. Следите за консолью. Что в ней важно:
— [LoadBars] ..., Загружено N баров для SYMBOL — скачивание и загрузка данных. Первый запуск на новом периоде может занять время, дальше данные берутся с диска;
— [RUN 1/1] start. params: ... — начало прогона (при переборе — с номером прогона и значениями параметров);
— Пропуск бота ... — стратегия исключена из теста (нет данных, ошибка в настройках), причина указана в строке;
— [MINER] Обнаружены невалидные parameter_mining.name — опечатка в пути перебираемого параметра;
— в конце — BACKTEST REPORT с итогами и строка Interactive chart generated: ... с путём к HTML отчёту.

Шаг 5. Изучите результаты. Всё лежит в папке tester/report/{name_comment}:
— HTML отчёт прогона — откройте в браузере (описание в разделе "Отчёт"). Начните со шапки: PnL, Max Drawdown, количество сделок, Profit Factor. Затем кривая эквити, сделки на графиках пар и вкладка Analytics — насколько результат зависит от нескольких удачных сделок или одной пары;
— reports_history.csv — строка с итогами каждого прогона (открывается в Excel / Google Sheets);
— run_snapshot_{name_comment}.json — полный снимок настроек теста. Его можно положить в tester/runs и повторить тест в точности (параметр use_runs).
Подробный лог прогона (при use_logger = true) — в папке logs, файлы TESTER_*.log.

Шаг 6. Подбор параметров (оптимизатор).
1) Добавьте в parameter_mining параметры для перебора (примеры в разделе "Оптимизатор"). Посчитайте число прогонов — это произведение количества значений всех параметров;
2) заранее скачайте данные: run_download_data.bat;
3) для скорости: max_parallel_runs — по числу ядер процессора, report.enable_html_report = false, use_logger = false; при миллионах комбинаций — monte_carlo;
4) запустите run_tester.bat (или "Запустить тестер" на вкладке "Файлы") и проверьте консоль на предупреждения [MINER];
5) после перебора откройте report_optimizer_*.html и отсортируйте reports_history.csv. Выбирайте не одиночный лучший прогон, а устойчивую область, где хороши и соседние значения;
6) сузьте диапазоны вокруг лучшей области и повторите. Итоговые настройки проверьте одиночным тестом с HTML отчётом на другом периоде, который не участвовал в подборе.

Частые проблемы.

Рыночные данные для тестирования

Криптовалютные биржи публично делятся историческими рыночными данными. Тестер сам скачивает нужный диапазон данных о торгах, собирает из них минутные свечи и уже из минуток формирует бары нужного таймфрейма для бота. Никаких ручных действий и регистраций не требуется.
Дополнительно скачивается WarmupDays дней до начала теста, чтобы все индикаторы ТА стратегии успели рассчитаться к StartDate.

Поддерживаемые биржи. Биржа берётся из файла настроек стратегии: settings.exchange.name.

Если указана биржа, для которой нет загрузчика, тестер использует данные BYBIT.

Хранение. Данные сохраняются в папку tester/data/{exchange}/{symbol} — по одному файлу минутных свечей на день (2026-02-03_1m.csv). Скачанные архивы сделок после конвертации удаляются, чтобы не занимать место. Уже скачанные дни повторно не загружаются: при следующих тестах тестер докачивает только недостающие дни (если UpdateData = true). При UpdateData = false тест идёт только на тех данных, что уже лежат в папке.
При запуске теста читаются только дневные файлы за период теста (с учётом прогрева), поэтому накопленная история за годы не замедляет короткие тесты. Файлы без даты в имени (свои данные) читаются всегда.
При параллельном переборе процессы не мешают друг другу: одну и ту же пару одновременно качает только один процесс, остальные ждут и берут уже готовые файлы.

Свои данные. В папку tester/data/{exchange}/{symbol} можно подкинуть любые свои данные в CSV формате. Требования:
— минутные свечи (тестер идёт по истории с шагом 1 минута / опционально можно сделать на каждый тик но будет медленно работать);
— первая строка — заголовок, дальше колонки timestamp,open,high,low,close,volume (остальные колонки игнорируются);
— timestamp в UTC: unix время в секундах, миллисекундах, микросекундах или наносекундах (формат определяется автоматически), либо дата строкой 2026-02-03 00:01:00;
— разделитель колонок — запятая, дробная часть — точка.
Пример:

timestamp,open,high,low,close,volume
1770076800000,97512.5,97540.0,97480.1,97530.2,12.345
1770076860000,97530.2,97561.7,97522.0,97555.0,8.910

Предварительное скачивание. Файл run_download_data.bat в папке бота запускает бота с флагом --download-data. В этом режиме тестер ничего не тестирует, а только скачивает все нужные данные за период теста (+ прогрев) по всем парам из settings_strategy, включая пары из перебора parameter_mining. Удобно запустить заранее перед большим перебором.
Для тиковых данных смотрите параметр save_tick_data в разделе "Параметры тестера".

Поведение тестера

С точки зрения бота, тестер - это просто еще одна биржа. Бот подключается к ней и начинает получать бары, выставлять ордера и т.д. Тестер в это время просто эмулирует поведение реальной биржи.

Время и свечи. Тестер идёт по истории с шагом в 1 минуту, синхронно по всем торговым парам. Из минуток он сам собирает свечи рабочего таймфрейма стратегии (1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 1w) с выравниванием по UTC, как на бирже: 1h свечи начинаются в XX:00, 4h — в 00:00/04:00/08:00…, 1d — в 00:00 UTC, 1w — в понедельник 00:00 UTC.
Стратегия вызывается каждую минуту, а не только на закрытии свечи — для 1h таймфрейма это ~60 вызовов на свечу. Бот получает закрытые бары и текущую формирующуюся свечу, OHLC которой обновляется каждую минуту. Поэтому логика, завязанная на цену внутри свечи (трейлинг стопы, перестановка ордеров, выход по текущей цене и т.д.), работает так же как в реальной торговле.
Бары периода прогрева (WarmupDays) используются только для расчёта индикаторов — торговля начинается с StartDate. Если в данных пропущена минута (не было сделок), тестер подставляет "пустую" свечу по последней цене.

Исполнение ордеров. На каждой минутной свече тестер проверяет все ожидающие ордера по её High/Low. Внутри минутки моделируется путь цены: у растущей свечи Open → Low → High → Close, у падающей Open → High → Low → Close. Ордера исполняются в том порядке, в котором цена до них доходит по этому пути, а не в порядке их выставления. Например если в одной минутке задеты и стоп, и тейк-профит, исполнится тот, до которого цена дошла первой, а второй (reduceOnly) будет снят, т.к. позиции уже нет.

Ордера можно изменять (цену, объём, триггер) и отменять — как на бирже.
Поддерживается reduceOnly: такой ордер может только уменьшить позицию и никогда её не перевернёт. Учитываются настройки стратегии use_long/use_short: если направление запрещено, ордер в эту сторону может только закрыть встречную позицию, а "лишний" объём отсекается.

Позиции. Режим One-Way (одна позиция на пару): покупка при шорте сначала закрывает/уменьшает шорт, а излишек открывает лонг (переворот). При добавлении в позицию цена входа усредняется. PnL фиксируется при каждом закрытии или уменьшении позиции.
Спот. Тип рынка тестер берёт из параметров инструмента биржи. На споте шортов нет: продажа может только уменьшить или закрыть лонг, "лишний" объём отсекается. Фандинг на споте не начисляется.

Баланс общий для всех стратегий. Поведение как на фьючерсах BYBIT/BINANCE с кросс маржой. Бот может запросить Wallet или Margin баланс:
— Wallet — реализованный баланс: начальный баланс + зафиксированный PnL − комиссии ± фандинг;
— Margin (equity) — Wallet + нереализованный PnL всех открытых позиций. По нему строится кривая эквити и считается максимальная просадка.
Комиссия списывается с баланса сразу при каждом исполнении ордера.
Если Margin баланс опускается до нуля, тестер останавливает прогон — депозит "слит", дальше тестировать нет смысла. Ликвидация отдельных позиций не моделируется: тест продолжается и на глубокой просадке, чтобы было видно, как система ведёт себя после неё. Остановить тест раньше можно параметрами target_drawdown_open и target_drawdown.

Фандинг. Каждые FundingIntervalHours часов (по UTC, в начале часа) по всем открытым фьючерсным позициям начисляется фандинг: размер позиции × цена × FundingRate. При положительной ставке лонги платят, шорты получают. Итоги видны в отчёте (Funding paid / received / net). Чтобы отключить фандинг, укажите FundingRate = 0.

Логика бота. В тестере работает та же самая логика, что и в реальной торговле: сервис позиций, лимитер одновременно открытых позиций, опции аккаунта (например закрытие по профиту маржи) — всё это общий продакшн код бота.

Отчёт

По окончании тестирования в папку tester/report/{name_comment} сохраняется подробный интерактивный HTML отчет.
И добавляется запись в reports_history.csv со сводной информацией по тесту для удобного поиска лучших комбинаций параметров при оптимизации стратегий.

Отчёт оптимизатора. При переборе параметров (parameter_mining) кроме отчётов по каждому прогону тестер строит ещё один, сводный отчёт report_optimizer_*.html по всем прогонам сразу. В нём результаты перебора показаны тепловыми картами и 3D surface графиками: по осям X и Y — значения перебираемых параметров, по оси Z — метрики (доходность, просадка, Profit Factor и др.). Так сразу видны устойчивые "плато" хороших значений, а не одиночные случайные пики. Отчёт создаётся автоматически при параллельном переборе (max_parallel_runs > 1) или вручную через run_report_optimizer.bat, подробнее — в разделе "Оптимизатор".

Шапка отчета — ключевые показатели:

Графики:

Report Statistics — подробная статистика:

Details — вкладки с детализацией:

Параметры тестера

файл: config_tester.json Можно редактировать файл в текстовом редакторе.
name_comment - комментарий к тесту. Чтобы было удобнее ориентироваться в отчетах. Отчёты сохраняются в отдельную папку tester/report/{name_comment}.
InitialBalance - начальный баланс для тестирования в USDT
StartDate - дата начала тестирования в формате 2026-02-03T00:00:00
EndDate - дата окончания тестирования в формате 2026-02-13T00:00:00
WarmupDays - количество дней для прогрева перед началом тестирования. Данные за эти дни скачиваются дополнительно до StartDate, чтобы индикаторы ТА успели рассчитаться к началу тестирования.
MakerFee - комиссия мейкера (0.0001 = 0.01%) Стандартная на BYBIT: 0.00036 = 0,0360%. (инструкция как значительно уменьшить комиссию)
TakerFee - комиссия тейкера (0.0001 = 0.01%) Стандартная на BYBIT: 0.001 = 0,1000%
SlippagePercent - проскальзывание для маркет ордеров (0.0001 = 0.01%)
LimitOrderVolumeCheck - проверка объёма для корректного исполнения лимитных ордеров (true/false). Лимитный ордер исполняется не больше, чем позволяет объём текущей свечи: тестер "откусывает" от ордера доступный объём, а остаток ждёт следующую свечу (частичное/поэтапное исполнение). Если выкл — лимитка исполняется целиком при касании цены.
order_trigger_fill_worst - реалистичное исполнение стоп ордеров на гэпах (true/false). По умолчанию стоп исполняется по триггерной цене (± проскальзывание). Если включить, стоп исполняется по худшей из цен: триггер или цена открытия минутной свечи. Например стоп на продажу 100, а минутка открылась на 97 — исполнение по 97, а не по 100. Делает тест консервативнее на резких движениях и на парах с низкой ликвидностью.
order_limit_fill_plus_tick - реалистичное исполнение лимитных ордеров с учётом очереди в стакане (true/false). По умолчанию лимитка исполняется при касании цены. На реальной бирже при касании уровня ордер часто не исполняется — перед ним в очереди стоят другие заявки. Если включить, лимитка исполняется только когда цена прошла за её уровень. Например лимитка на покупку 95 исполнится, только если Low минутки ниже 95 — касание ровно 95 не засчитывается. Особенно важно для сеточных и усредняющих стратегий.
order_market_delay - задержка исполнения маркет ордеров (true/false). По умолчанию маркет ордер исполняется мгновенно — по цене закрытия той же минутки, которую только что увидела стратегия. На реальной бирже между решением бота и исполнением проходит время, и цена успевает сдвинуться. Если включить, маркет ордер исполняется по цене открытия следующей минутки (+ проскальзывание). Позиция в этом случае появляется у бота только на следующем шаге, как на бирже. Закрытие позиций в конце теста всегда происходит сразу.
target_drawdown_open - целевая просадка по открытым позициям в % (0 = выключено). Считается как отставание Margin баланса от Wallet баланса, т.е. текущий нереализованный убыток открытых позиций: (Wallet − Margin) / Wallet × 100. Как только она достигает заданного уровня, тест завершается (например 50 — остановка, когда Margin упал на 50% ниже Wallet). Можно использовать как свой уровень "ликвидации" — отсекать прогоны, которые на реальном счёте вы бы не пережили.
target_drawdown - целевая максимальная просадка в % (0 = выключено). Считается так же, как Max Drawdown, % в отчёте: падение Margin баланса от его исторического максимума (high watermark), (Пик Margin − Margin) / Пик Margin × 100. Учитывает и уже зафиксированные убытки, а не только открытые позиции. Как только достигает заданного уровня, тест завершается.
Пример разницы: баланс 100, открыли лонг, Margin вырос до 150, затем упал до 90. target_drawdown_open видит 10% (Margin на 10 ниже Wallet 100), а target_drawdown — 40% (от пика 150).
При остановке по любому из параметров открытые позиции закрываются по текущей цене, отчёт строится по данным до момента остановки. Удобно при переборе параметров: заведомо неудачные прогоны обрываются раньше и не тратят время.
FundingRate - Размер ставки фандинга (0.0001 = 0.01%)
FundingIntervalHours - Интервал между выплатами фандинга в часах (8)
maintenance_margin_rate - ставка поддерживающей маржи, доля от номинала позиции (по умолчанию 0.005 = 0.5%). Используется для линии Liquidation Level на графике баланса, если биржа не отдала тиры риск-лимита (сейчас тиры скачиваются только с Bybit). На ход теста не влияет.
UpdateData - обновление (докачка) рыночных данных перед тестированием (true/false)
save_tick_data - при скачивании данных дополнительно сохранять исходные тиковые данные тестового периода в отдельные файлы {дата}_ticks.csv рядом с минутными данными (true/false). По умолчанию false — файлы тиков занимают много места.
use_logger - использование логгера. Если выкл то ускоряет тестирование (true/false)
max_parallel_runs - количество параллельных прогонов тестера при переборе параметров. Каждый прогон запускается отдельным процессом. Если производительность компьютера позволяет то получается паралелить процессы без потерь скорости расчета. При значении больше 1 после завершения всех прогонов автоматически строится сводный отчёт оптимизатора (тепловые карты / 3D surface).
single_mode - режим раздельного тестирования (true/false). Если включен, то каждый файл настроек из папки settings_strategy тестируется отдельно, а не все вместе на общем балансе. Удобно для оценки каждой стратегии/пары по отдельности за один запуск. Перебор parameter_mining применяется к каждой стратегии.
use_runs - запуск тестов из сохранённых снимков (true/false). Если включен, тестер игнорирует текущие настройки и последовательно выполняет все *.json файлы из папки tester/runs. Каждый файл — это полный снимок (аккаунты, стратегии, настройки программы и тестера). Такие снимки run_snapshot_{name_comment}.json тестер сам сохраняет в папку отчёта после параллельного перебора — их можно скопировать в tester/runs, чтобы повторить или поставить в очередь несколько разных тестов.
shuffle_miner, monte_carlo, monte_carlo_seed - дополнительные режимы оптимизатора, описаны в разделе "Оптимизатор".

файл: config_tester.json/report Настройка содержания отчета:
enable_html_report - создавать HTML отчёт (true/false). Если выкл — HTML не генерируется, в reports_history.csv добавляется только строка со сводными метриками. Сильно ускоряет массовый перебор параметров и экономит место на диске.
chart_ohlc_height - высота графика OHLC в пикселях
chart_balance_height - высота графика баланса в пикселях
chart_position_height - высота графика размера открытых позиций в пикселях
include_chart_ohlc - включение графика OHLC в отчет (true/false)
include_chart_balance - включение графика баланса в отчет (true/false)
include_chart_position - включение графика размера открытых позиций в отчет (true/false)
include_settings - включение настроек стратегий и параметров тестера в отчет (true/false)
include_trades_table - включение таблиц со списком сделок по каждой стратегии (true/false)
include_summary_table - включение сводной таблицы по всем стратегиям: объём торгов, комиссия и т.д. (true/false)
include_monthly_returns_heatmap - включение тепловой карты доходности по месяцам (true/false)
include_position_stats - включение статистики по открытым позициям: средний и максимальный размер открытых позиций в % от Margin баланса (true/false)
include_analytics - включение вкладки Analytics (true/false, по умолчанию true)
analytics_monte_carlo - число итераций Монте-Карло по сделкам на вкладке Analytics (0 = выкл, рекомендуется 1000). Не путать с monte_carlo оптимизатора — тот ограничивает число прогонов перебора. Время расчёта растёт пропорционально итерациям × числу сделок и тратится в каждом прогоне, в том числе при переборе: 1000 итераций на 100 сделок — доли секунды, 10000 итераций на тысячи сделок — заметно дольше
analytics_monte_carlo_seed - начальное значение генератора случайных чисел для Монте-Карло отчёта (по умолчанию 42). С одним и тем же seed результат повторяется
enable_timing_logs - вывод в консоль времени генерации каждого этапа отчета. Нужно для диагностики, если отчёты строятся долго (true/false)

файл: config_tester.json/reports_history Дополнительные столбцы reports_history.csv:
Основные столбцы пишутся всегда. Дополнительные выключены по умолчанию и включаются по одному (true/false). Включённые столбцы можно использовать в z_parameters оптимизатора, например чтобы искать параметры, устойчивые к выбросам.
pnl_without_top5 - столбец PnLWithoutTop5: Total PnL без 5 самых прибыльных сделок
pnl_without_best_pair - столбец PnLWithoutBestPair: Total PnL без самой прибыльной пары (пусто при одной паре)
ulcer_index - столбец UlcerIndex: Ulcer Index по часовым значениям Margin баланса, %
mc_max_dd_p95 - столбец MC_MaxDD_p95: 95-й перцентиль максимальной просадки по бутстрэпу, % (нужен report.analytics_monte_carlo > 0, иначе пусто)
mc_loss_probability - столбец MC_LossProbability: вероятность убытка по бутстрэпу, % (нужен report.analytics_monte_carlo > 0, иначе пусто)
Пример:
"reports_history": { "pnl_without_top5": true, "ulcer_index": true }

Оптимизатор (перебор параметров)

Оптимизатор автоматически прогоняет тест много раз, каждый раз с новой комбинацией значений выбранных параметров. Результат каждого прогона записывается отдельной строкой в сводную таблицу tester/report/{name_comment}/reports_history.csv: метрики теста плюс колонки со значениями перебираемых параметров. По ней удобно сортировкой найти лучшие комбинации.

файл: config_tester.json/parameter_mining Настройка оптимизатора (переборщика параметров):
По умолчанию это пустой список [] — обычный одиночный тест. Список наполняется объектами вида {"name": "имя_параметра", "start": 1, "end": 10, "step": 0.5, "values": []}. Каждый объект — это один перебираемый параметр.

name - путь к параметру для перебора. Можно указать любую настройку бота. Путь начинается с одного из 4 видов конфигов:
1) settings — настройки стратегий (.json файлы в папке settings_strategy). Тут мы настраиваем: торговую пару, таймфрейм, работу с депозитом и то какая стратегия и на каких настройках будет работать.
Пример: settings[*].mrs2.ma_long.type - перебор параметра type у открывающего ордера стратегии mrs2
2) account — настройки api ключа (.json файлы в папке settings_accounts). Тут мы настраиваем общий на весь аккаунт тейк профит по балансу маржи либо ограничитель числа одновременно открытых позиций.
Пример: account[*].close_by_margin.profit - перебор параметра profit опции close_by_margin
3) settings_program — общие настройки программы бота (файл settings_program.json). Тут мы настраиваем общий множитель лота risk_multiplier.
Пример: settings_program.risk_multiplier
4) config_tester — настройки самого тестера (файл config_tester.json). Например можно прогнать тесты с разными уровнями комиссии или проскальзывания.
Пример: config_tester.MakerFee

Выбор конкретной стратегии/аккаунта. В квадратных скобках указывается, к каким файлам применять параметр:
settings[*] — ко всем файлам настроек сразу
settings[0] — только к первому файлу (нумерация с 0, по порядку загрузки)
settings[my_set_btc] — только к файлу, у которого поле name равно my_set_btc
Так же работает для account[...] и для вложенных списков внутри настроек (например [*], [0] у списка ордеров).

start - начальное значение параметра
end - конечное значение параметра (включительно). Можно перебирать и по убыванию, если start > end
step - шаг изменения параметра
values - явный список значений для перебора. Если список не пустой, то start/end/step игнорируются. Значения записываются строками и автоматически приводятся к типу параметра: текст, числа ("5", "10", "25"), true/false (["true", "false"]) и списки вариантов (enum).
Например, для типа скользящей средней доступны значения:
["SMA", "EMA", "GMA", "HARMONIC", "TEMA", "DEMA", "ZLEMA", "WMA", "VWMA", "RMA", "EHMA", "THMA", "HMA", "DMA", "ATR", "H", "L", "SMA_KALMAN", "EMA_KALMAN", "GMA_KALMAN", "HARMONIC_KALMAN", "TEMA_KALMAN", "DEMA_KALMAN", "ZLEMA_KALMAN", "WMA_KALMAN", "VWMA_KALMAN", "RMA_KALMAN", "EHMA_KALMAN", "THMA_KALMAN", "HMA_KALMAN", "DMA_KALMAN", "ATR_KALMAN", "H_KALMAN", "L_KALMAN"]
Для источника цены:
["open", "high", "low", "close", "hl2", "hlc3", "ohlc4", "hlcc4", "oc2"].
Перебор списка торговых пар - смотрите Пример 1.

Проверка имён. Перед запуском тестер проверяет каждый name. Если параметр с таким путём не найден (опечатка, нет такой стратегии и т.п.), в консоль выводится предупреждение [MINER] Обнаружены невалидные parameter_mining.name, и этот параметр не применяется — тесты пройдут с исходным значением. Обязательно смотрите консоль при первом запуске перебора.


Количество прогонов — это произведение количества значений всех параметров. Если вы укажете для перебора два параметра например от 1 до 10 с шагом 1, то будет проведено 100! прогонов (10 вариантов первого параметра × 10 вариантов второго параметра). Результаты всех тестов сохраняются в виде отдельных html отчетов и в сводной таблице reports_history.csv.
Советы для большого перебора:
— выключите HTML отчёты (report.enable_html_report = false) и логгер (use_logger = false) — это сильно ускоряет прогоны и экономит место на диске;
— увеличьте max_parallel_runs под количество ядер процессора;
— если комбинаций слишком много, используйте monte_carlo (см. ниже).

Дополнительные режимы перебора (файл: config_tester.json):
single_mode - каждый файл настроек из settings_strategy тестируется отдельно, и весь перебор parameter_mining выполняется для каждого из них. Например 5 файлов настроек × 20 комбинаций = 100 прогонов. Удобно, когда нужно подобрать параметры для каждой пары независимо, а не для портфеля.
shuffle_miner - перебор торговых пар без повторов между стратегиями (true/false). Работает когда в папке settings_strategy несколько файлов настроек и в parameter_mining есть параметр вида settings[*].... (например settings[*].basic.symbol). Вместо того чтобы давать всем стратегиям одно и то же значение, тестер раздаёт им разные значения из списка и перебирает все уникальные сочетания. Пример: 3 файла настроек и 10 пар в values → C(10,3) = 120 прогонов, в каждом из которых стратегии торгуют разными парами. Позволяет подобрать лучший набор пар для портфеля на общем балансе.
monte_carlo - ограничение числа прогонов случайной выборкой (0 = выкл). Если общее число комбинаций перебора больше этого значения, тестер выбирает случайные monte_carlo комбинаций вместо полного перебора. Полезно, когда комбинаций миллионы: можно быстро "прощупать" пространство параметров, а затем сузить диапазоны вокруг лучших результатов.
monte_carlo_seed - начальное значение генератора случайных чисел для Monte Carlo (по умолчанию 42). С одним и тем же seed выборка повторяется, поменяйте его чтобы получить другую выборку.

файл: config_tester.json/report_optimizer Сводный отчёт оптимизатора:
После параллельного перебора (max_parallel_runs > 1) тестер автоматически строит по reports_history.csv отчёт report_optimizer_*.html. Его можно построить и вручную — например после последовательного перебора или чтобы перестроить с другими z_parameters: файл run_report_optimizer.bat (флаг --run-report-optimizer) берёт папку tester/report/{name_comment}, либо папку, переданную первым аргументом.
— если перебирались 2 и более числовых параметра — тепловые карты и 3D surface графики. По осям X и Y откладываются два числовых параметра с наибольшим количеством значений, по оси Z — выбранные метрики;
— если перебирался 1 числовой параметр — линейные графики зависимости метрик от этого параметра;
— если одновременно перебирались торговые пары — графики строятся отдельно для каждой пары;
— если построить графики не из чего — в отчёт выводится таблица всех результатов.
chart_height - высота графиков оптимизатора в пикселях (550)
z_parameters - список метрик для оси Z. По умолчанию ["TotalPnLPercent", "MaxDrawdownPercent", "ProfitFactor"]. Можно использовать любые числовые колонки из reports_history.csv: TotalPnL, TotalPnLPercent, FinalBalance, TotalTrades, WinRate, Fills, MaxDrawdown, MaxDrawdownPercent, TotalFees, PositionAvgPercent, PositionMaxPercent, ProfitFactor, а также дополнительные столбцы, если они включены в разделе reports_history: PnLWithoutTop5, PnLWithoutBestPair, UlcerIndex, MC_MaxDD_p95, MC_LossProbability.
В reports_history.csv MaxDrawdown - максимальная просадка в USDT, а MaxDrawdownPercent - худшая в % из трёх просадок отчёта: Max Drawdown, %, % от пика у Max Drawdown, USDT и Max Unrealized Drawdown, %.


Пример 1: перебор торговых пар
parameter_mining — это список ([]), в который через запятую добавляются объекты перебора ([{}, {}]).
Для перебора торговых пар используется строковый параметр values, а числовые поля start/end/step выставляются в 1.0 (они игнорируются когда values не пустой).
Параметр settings[*].basic.symbol будет применён ко всем файлам настроек из папки settings_strategy:

"parameter_mining": [
    {
        "name": "settings[*].basic.symbol",
        "start": 1.0,
        "end": 1.0,
        "step": 1.0,
        "values": [
            "1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
            "1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
            "4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
        ]
    }
]

Результат: тестер прогонит тест поочерёдно для каждой из 10 пар.

Пример 2: перебор нескольких параметров одновременно
Добавим к перебору пар ещё перебор значения % тейк-профита — от 0% до 10% с шагом 0.5 (итого 21 значение). Число комбинаций: 10 пар × 21 значение = 210 прогонов.

"parameter_mining": [
    {
        "name": "settings[*].basic.symbol",
        "start": 1.0,
        "end": 1.0,
        "step": 1.0,
        "values": [
            "1000BONKUSDT", "1000FLOKIUSDT", "1000LUNCUSDT",
            "1000NEIROCTOUSDT", "1000PEPEUSDT", "1000TAGUSDT",
            "4USDT", "AAVEUSDT", "ACHUSDT", "ADAUSDT"
        ]
    },
    {
        "name": "settings[*].options.take_profit_long",
        "start": 0,
        "end": 10.0,
        "step": 0.5,
        "values": []
    }
]

Пример 3: Настройка перебора
video Видеодемонстрация

Также все стратегии бота доступны в формате PineScript для проведения тестирования на TradingView.