Тестирование торговых стратегий на исторических данных
Достоверный портфельный бэктест. Уровень quant-исследований
hamster-bot/tester - продвинутый инструмент для тестирования своих торговых систем на исторических данных.
Особенности бэктестера:
- Портфельный тест. Сразу несколько стратегий разных типов на разных парах и таймфреймах — на одном общем балансе с кросс маржой. Видно, как стратегии уживаются на одном кошельке: суммарная загрузка депозита, общая просадка, перекрытие позиций.
- Тот же продакшн код. Бэктест прогоняет тот же код, на котором бот торгует в реальном времени: стратегии, сервис позиций, лимитер позиций, опции аккаунта. Никакого переписывания логики под тестер.
- Честная симуляция внутри свечи. Шаг 1 минута: стратегия вызывается каждую минуту и видит формирующуюся свечу, ордера проверяются по High/Low каждой минутки. Трейлинги, перестановки ордеров и выходы внутри свечи работают как на реальных торгах. (Опционально можно включить более детальную симуляцию с тиковой точностью)
- Реалистичные издержки. Комиссии мейкера/тейкера, проскальзывание маркет и стоп ордеров, фандинг, ограничение исполнения лимиток объёмом свечи.
- Данные скачиваются автоматически. BYBIT, BINANCE, MEXC (спот и фьючерсы) и BITMEX — за любой исторический период. Можно подложить и свои данные в CSV.
- Подробный интерактивный отчёт. Кривая эквити, тепловая карта доходности по месяцам, графики сделок по каждой паре и более 50 метрик: Sharpe, Sortino, Calmar, CAGR, Recovery Factor, серии побед/поражений, загрузка депозита и др.
- Проверка на подгонку. Монте-Карло по сделкам, PnL без лучших сделок и без лучшей пары, топ-5 просадок
с длительностью и временем восстановления, MAE/MFE каждой сделки, результат по часам, дням недели и режимам
рынка, расстояние до ликвидации, VaR/CVaR и доля издержек — отдельная вкладка
Analytics. - Оптимизатор параметров. Перебор любых настроек бота, стратегий, аккаунта и самого тестера. Параллельные прогоны на всех ядрах, Monte Carlo выборка для огромных пространств параметров, подбор портфеля пар без повторов. Результаты — в сводной таблице и на тепловых картах / 3D surface.
- Тестирование своей сложной логики, которую невозможно точно протестировать готовыми сторонними решениями без костылей.
Реализовано как отдельный коннектор
к "бирже" (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
отчётом на другом периоде, который не участвовал в подборе.
Частые проблемы.
- Стратегия не попала в тест. Поле
exchange.accountв настройках стратегии не совпадает сnameни одного аккаунта вsettings_accounts. Пропуск бота ...: нет данных. Пара не торговалась на этой бирже в выбранный период, ошибка в названииbasic.symbol, либоUpdateData = falseи вtester/dataнет файлов за этот период.Market initialization failed. Не удалось получить параметры инструмента: нет связи с биржей и нет кэша, или такой пары на бирже нет.- Тест закончился раньше
EndDate. В консоли есть строкаTester stopped: ...: депозит слит (Equity <= 0) или достигнутаtarget_drawdown/target_drawdown_open. - Сделок нет или очень мало. Мало
WarmupDaysдля индикаторов, слишком короткий период, или лот меньше минимального для пары. Тест уже выполняется. На вкладке "Файлы" полный запуск возможен только один одновременно — дождитесь окончания текущего (статус обновляется автоматически).Compiled executable not found. Скриптrun_*.batзапущен не из папки бота.
Рыночные данные для
тестирования
Криптовалютные биржи публично делятся историческими рыночными данными. Тестер сам скачивает нужный диапазон
данных о торгах, собирает из них минутные свечи и уже из минуток формирует бары нужного таймфрейма для бота.
Никаких ручных действий и регистраций не требуется.
Дополнительно скачивается WarmupDays дней до начала теста, чтобы все индикаторы ТА стратегии успели
рассчитаться к StartDate.
Поддерживаемые биржи. Биржа берётся из файла настроек стратегии: settings.exchange.name.
- BYBIT — фьючерсы (
bybit) и спот (bybit-spot). Архивы всех сделок сpublic.bybit.com. - BINANCE — фьючерсы USDT-M (
binance,binance-papi) и спот (binance-spot). Дневные архивы агрегированных сделок сdata.binance.vision. - MEXC — спот (
mexc) и фьючерсы (mexc-futures). Готовые минутные свечи через публичное API биржи. - BITMEX — (
bitmex). Дневные архивы сделок сpublic.bitmex.com. Один файл содержит сделки сразу по всем парам — тестер скачивает его один раз и раскладывает по папкам пар.
Если указана биржа, для которой нет загрузчика, тестер использует данные 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) будет снят, т.к. позиции уже нет.
market— исполняется сразу по текущей цене с учётом проскальзывания (SlippagePercent): покупка дороже, продажа дешевле. Комиссия тейкера. Приorder_market_delay = true— по цене открытия следующей минутки.limit— исполняется по своей цене, когда цена минутки её достигла (Low ≤ цены для покупки, High ≥ цены для продажи). Комиссия мейкера. ПриLimitOrderVolumeCheck = trueобъём исполнения ограничен объёмом минутной свечи — возможно частичное исполнение, остаток ждёт следующих свечей. Приorder_limit_fill_plus_tick = trueпростого касания мало: цена должна пройти за уровень лимитки.stop/stop_market— срабатывает при касании триггерной цены и исполняется по ней с проскальзыванием. Комиссия тейкера. Приorder_trigger_fill_worst = trueучитываются гэпы: если минутка открылась уже за триггером, стоп исполняется по цене открытия минутки (как на реальной бирже при резком движении).stop_limit— активируется по триггеру и исполняется по лимитной цене, если она тоже достигнута в этой минуте. Комиссия мейкера.take_profit— исполняется по триггерной цене при её достижении. Комиссия тейкера.
Ордера можно изменять (цену, объём, триггер) и отменять — как на бирже.
Поддерживается 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,
подробнее — в разделе "Оптимизатор".
Шапка отчета — ключевые показатели:
Pairs- количество торговых пар (стратегий) в тестеInitial Balance/Final Balance- начальный и конечный баланс в USDTTotal PnL- итоговая прибыль/убыток в USDT и в %Total Trades (Win/Los)- количество полных сделок (от открытия позиции до её полного закрытия), из них прибыльных и убыточных с учётом комиссийWin Rate- процент прибыльных полных сделокMax Drawdown, %- максимальная просадка Margin баланса от пика в % (в скобках - её размер в USDT)Max Drawdown, USDT- максимальная просадка в деньгах (в скобках - её % от пика). Это две независимые величины: при растущем депозите крупнейшая в деньгах просадка обычно поздняя и в % меньше, а крупнейшая в % - ранняя. Например, 4509 USDT (9.83%) при пике 45869 и 1885 USDT (20.42%) при пике 9234Max Unrealized Drawdown, %- максимальный нереализованный убыток открытых позиций в % от Wallet баланса в тот же момент:(Wallet − Margin) / Wallet(в скобках - убыток в USDT). Это самая низкая точка линииUnrealized Drawdown/Profit %на графике баланса; нереализованная прибыль не учитывается. Та же величина, по которой останавливает тестtarget_drawdown_open. В портфеле может быть большеMax Drawdown, %: пока одна пара копит убыток, другие фиксируют прибыль, Wallet растёт, а Margin почти не падает от пикаTotal Fees- сумма уплаченных комиссийPosition avg (max), %- средний (и максимальный) суммарный размер открытых позиций в % от Margin баланса. Показывает, насколько сильно система загружает депозитProfit Factor- отношение валовой прибыли к валовому убыткуDuration (days)- длительность тестового периода в днях
Графики:
Equity Curve- график Margin баланса (с учетом всех открытых позиций и unrealized PnL) и Wallet баланса. ЛинияLiquidation Level(включается в легенде) - уровень ликвидации при кросс-марже, примерно как в UTA Bybit: суммарная поддерживающая маржа открытых фьючерсных позиций в USDT (номинал × ставка MMR тира риск-лимита − mmDeduction + комиссия тейкера на закрытие). Если Margin баланс опускается ниже этой линии, реальная биржа ликвидировала бы позиции. Для Bybit тиры риск-лимита скачиваются с биржи, для остальных бирж берётсяmaintenance_margin_rateизconfig_tester.json. Линия только для графика — тест не останавливает. Когда открытых позиций нет, линия прерываетсяMonthly Returns Heatmap- тепловая карта доходности по месяцам и итог по каждому годуOpen Positions Size- суммарный размер открытых позиций в USDT: общий, отдельно лонги и шорты, а также в разрезе трендовых и контртрендовых стратегийStrategy Charts- отдельные свечные графики по каждой стратегии с отметками сделок и визуализацией ТА стратегииRealized PnL by Symbol- накопленный реализованный PnL по каждой паре и суммарно. Пары включаются и выключаются в легенде, кнопкиSelect all/Deselect all— показать или скрыть все сразу
Report Statistics — подробная статистика:
- Period & Scope (период теста)
Report range- даты начала и конца тестаDays in test- количество дней в тестеMonths in test- количество календарных месяцев, которые захватывает тестMonths with data- количество месяцев, по которым посчитана доходностьPairs count- количество пар (стратегий)
- Balance & Equity (баланс)
Initial balance/Final balance- начальный и конечный балансMin balance/Max balance- минимальное и максимальное значение Margin баланса за весь тест
- Monthly Performance (помесячная доходность)
Average monthly return (geometric), %- средняя месячная доходность с учетом сложного процента (реинвестирования). Наиболее честная оценка "сколько в среднем в месяц"Average monthly return (arithmetic), %- простое среднее арифметическое месячных доходностейBest month, %/Worst month, %- лучший и худший месяц
- PnL, Volume & Fees (прибыль, объем и комиссии)
Total PnL/Total PnL, %- итоговая прибыль/убыток в USDT и %Gross profit- сумма всех прибыльных закрытий (валовая прибыль)Gross loss- сумма всех убыточных закрытий по модулю (валовой убыток)Trading volume (USDT)- суммарный торговый оборотTotal transactions (buy/sell)- общее количество исполнений ордеров (покупок и продаж)Total fees- сумма уплаченных комиссийFunding net- итог по фандингу (получено минус уплачено)Funding accrued (received)- сколько фандинга полученоFunding paid- сколько фандинга уплаченоPnL without top 5 winning trades- Total PnL без 5 самых прибыльных сделок. Если результат уходит в минус — прибыль держится на нескольких удачных выбросахPnL without best pair- Total PnL без вклада самой прибыльной пары (при одной паре — n/a). Показывает, работает ли портфель, или всё тянет одна пара
- Trades (сделки). Сделка — это полная сделка: от открытия позиции до её полного закрытия или
переворота. Усреднения и частичные закрытия внутри одной позиции входят в одну сделку. Результат сделки
считается за вычетом комиссий.
Total Trades/Win Trades/Los Trades- всего сделок, прибыльных и убыточныхWin Rate, %- процент прибыльных сделокExpectancy per trade- математическое ожидание: средний результат одной сделки в USDT за вычетом комиссийAvg win/Avg loss- средняя прибыльная и убыточная сделкаPayoff ratio- средняя прибыльная сделка / средняя убыточная сделка (по полным сделкам, в отличие отRisk/Reward, который считается по исполнениям)Expected Value- ожидаемый результат сделки:WinRate × Avg win − LossRate × |Avg loss|. LossRate — доля убыточных сделок от всех (сделки в ноль убыточными не считаются). Значение больше 0 — у системы есть преимуществоLargest win/Largest loss- самая прибыльная и самая убыточная сделкаAvg fills per trade- сколько исполнений в среднем приходится на одну сделку (1 вход + 1 выход = 2; больше — усреднения и частичные тейки)Avg holding time/Max holding time- среднее и максимальное время удержания позицииMax consecutive wins/Max consecutive losses- максимальная серия прибыльных и убыточных сделок подряд
- Fills (исполнения, которые уменьшили или закрыли позицию — каждый частичный тейк отдельно, PnL до
комиссий)
Fills/Win Fills/Los Fills- количество таких исполнений, прибыльных и убыточныхFill Win Rate, %- процент прибыльных исполненийExpectancy per fill- средний результат одного исполнения до комиссийMax consecutive win / loss fills- максимальная серия прибыльных и убыточных исполнений подряд
- Risk & Exposure (риск и загрузка депозита)
Position avg / max, % of margin balance- средний и максимальный суммарный размер открытых позиций в % от Margin балансаLong / Short Position avg / max, % of margin balance- то же отдельно для лонгов и шортовMax Drawdown, %/Max Drawdown, % — amount- максимальная просадка в % и её размер в USDTMax Drawdown, USDT/Max Drawdown, USDT — %- максимальная просадка в USDT и её % от пикаMax Unrealized Drawdown, % of wallet/— amount/— time (UTC)- максимальный нереализованный убыток в % от Wallet, в USDT и момент, когда он был
- Risk by strategy (загрузка депозита по типу стратегий)
T ...- средний и максимальный размер позиций (общий, лонг, шорт) трендовых стратегий в % от Margin балансаCT ...- то же для контртрендовых стратегий
- Benchmark (Buy & Hold) (сравнение с простой покупкой и удержанием тех же пар)
Strategy return, %- доходность стратегии за период тестаBuy & Hold return (equal weight), %- доходность, если бы на начальный баланс в начале теста купили все пары портфеля равными долями и держали до концаExcess return vs Buy & Hold, %- на сколько стратегия лучше (или хуже) простого удержанияStrategy Max Drawdown, %/Buy & Hold Max Drawdown (daily), %- максимальная просадка стратегии и портфеля Buy & Hold (по дневным закрытиям)
- Risk-Adjusted Ratios (коэффициенты доходность/риск)
Profit Factor- валовая прибыль / валовой убыток. Больше 1 — система прибыльнаRisk/Reward- средняя прибыльная сделка / средняя убыточная сделкаRecovery Factor- Total PnL / Max Drawdown, USDT. Во сколько раз прибыль перекрывает максимальную просадкуSharpe ratio (monthly)- коэффициент Шарпа по месячным доходностям (приведен к годовому). Доходность относительно общей волатильностиSortino ratio (monthly)- коэффициент Сортино. Как Шарп, но учитывает только отрицательную волатильность (падения)CAGR, %- среднегодовой темп роста капитала с учетом сложного процентаCalmar ratio- CAGR / Max Drawdown %. Годовая доходность относительно максимальной просадкиUlcer Index (hourly), %- корень из среднего квадрата просадки от пика по часовым значениям Margin баланса. В отличие от Max Drawdown учитывает и глубину, и длительность всех просадок: долгое "сидение под водой" увеличивает индексMartin ratio- CAGR / Ulcer Index. Доходность относительно "болезненности" просадок
Details — вкладки с детализацией:
Settings- настройки всех стратегий, участвовавших в тестеTrades- таблицы со всеми сделками по каждой паре: время, ордер, стратегия, сторона, действие, размер, цена, комиссия, PnL, баланс, позиция после сделки, стоимость позиции в USDT и в % от Margin балансаMarkets- параметры инструментов: тип инструмента (Type: у Bybitcrypto,stock,ETF,commodity,forexи др.), максимальный размер маркет ордера, максимальное плечо, шаг лота, текущая цена и средний дневной объем торгов за 1, 10 и 100 днейSummary- сводная таблица по каждой паре: количество полных сделок, Win Rate, Profit Factor, PnL, доходность Buy & Hold этой пары за период теста, комиссия, объем торгов, средний и максимальный размер позиции в %Correlation- матрица корреляции дневного PnL пар (реализованный + нереализованный). Высокая положительная корреляция (красный) — пары теряют одновременно, диверсификации нет. Отрицательная (зелёный) — пары страхуют друг друга. Также показана средняя попарная корреляция портфеля. При большом числе пар выводятся 25 пар с наибольшим |PnL|Drawdown- разложение максимальной просадки в % (Max Drawdown, %) по парам: момент пика и дна Margin баланса и насколько изменился вклад каждой пары (PnL реализованный и нереализованный, комиссии, фандинг) за этот период. Сумма вкладов равна размеру этой просадки в USDT. Видно, какие пары "сделали" просадку, а какие в этот момент её смягчали (отрицательная доля)Analytics- расширенная аналитика: насколько результат устойчив и где он зарабатывается. Отключается параметромreport.include_analytics- Robustness (устойчивость: результат реальный или подогнан)
Dependence on outliers- PnL 5 лучших сделок, их доля в Total PnL, PnL без них; лучшая пара и PnL без неёMonte Carlo(включаетсяreport.analytics_monte_carlo). Работает с последовательностью закрытых сделок (PnL за вычетом комиссий, без нереализованного PnL — поэтому просадка здесь обычно меньше Max Drawdown отчёта). Два метода:
перемешивание — те же сделки в случайном порядке. Итог не меняется, меняется путь. Показаны перцентили 5/50/95 максимальной просадки и доля перестановок с просадкой глубже фактической. Если таких 80% и больше — фактический порядок сделок был удачным, в реальной торговле стоит ждать просадку глубже;
бутстрэп — сделки выбираются случайно с повторами. Показаны перцентили 5/50/95 итогового PnL и просадки, вероятность убытка и вероятность обнуления баланса.
Для обоих методов строятся гистограммы с отметкой фактического значения. Нужно минимум 5 сделок
- Drawdowns (просадки)
- число эпизодов просадки, самая долгая просадка (от пика до возврата к пику), % времени под
водой,
Ulcer Index,Martin ratio - таблица топ-5 просадок: начало (пик), дно, дата восстановления (или
not recovered), глубина в USDT и %, время падения, время восстановления и общая длительность. Длительность и время восстановления часто важнее глубины
- число эпизодов просадки, самая долгая просадка (от пика до возврата к пику), % времени под
водой,
- Trade quality (качество полных сделок)
Avg win/Avg loss,Payoff ratio,Expected Value(WR × avg win − LR × |avg loss|), крупнейший выигрыш и убыток с парой и датойMAE / MFE- худший и лучший промежуточный PnL каждой сделки (реализованный − комиссии + нереализованный по Low/High минутных свечей). Средний MAE всех сделок и прибыльных, худший MAE, средний MFE, доля прибыли, которую забрали прибыльные сделки от своего максимума, сколько убыточных сделок успели побывать в плюсе. Графики рассеяния MAE → результат и MFE → результат: глубокий MAE у прибыльных сделок — стоп нельзя ставить ближе; точки далеко под линией PnL = MFE — прибыль отдаётся назад, тейк слишком далеко или выход слишком поздний- таблица
Long / Short / All: количество сделок, Win Rate, Profit Factor, PnL, средняя сделка и среднее время удержания отдельно по сторонам - гистограмма распределения PnL сделок
- When and in which conditions (когда и в каких условиях зарабатывается)
- тепловая карта PnL по часам суток (UTC) и дням недели — изменение Margin баланса за час, с итогами по дням и часам
- график скользящих 30 дней: доходность, % и коэффициент Шарпа (годовой, по дневным доходностям). Падение к концу теста — стратегия "выдыхается". Нужно больше 30 дней данных
- PnL по режимам рынка. Дневной PnL каждой пары относится к режиму её рынка в этот день: Trend — коэффициент эффективности Кауфмана за 14 дней ≥ 0.3, иначе Flat; High vol — ATR(14) в % от цены не ниже медианы этой пары за период, иначе Low vol. Для каждого из 4 сочетаний и итогов по одному признаку: пара-дни, PnL, средний PnL за пара-день, % прибыльных дней, доля в PnL
- Risk and costs (риск и издержки)
Distance to liquidation- минимальное расстояние до ликвидации за тест, когда оно было, и 5 самых близких дней. Считается как Margin баланс / суммарный номинал открытых позиций: на сколько % должны одновременно пойти против вас все позиции, чтобы обнулить баланс. Поддерживающая маржа здесь не учитывается — реальная биржа ликвидирует раньше; с её учётом уровень ликвидации показывает линияLiquidation Levelна графике баланса- дневные
VaR 95%(исторический: убыток, который превышается в 5% дней) иCVaR 95%(средний убыток в эти 5% худших дней), худший и лучший день, асимметрия и эксцесс ("толстые хвосты") дневных доходностей. VaR/CVaR — от 20 дней данных Costs- валовая прибыль, комиссии и уплаченный фандинг в % от валовой прибыли, чистые издержки (комиссии − чистый фандинг), PnL до издержек. Показывает, сколько "съедают" издержки
- Robustness (устойчивость: результат реальный или подогнан)
Tester Config- параметры тестера и значения перебираемых параметров для этого прогона, а также опции аккаунтаclose_by_margin,open_positions_limiterиrisk_multiplier
Параметры
тестера
файл: 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: Настройка перебора
Видеодемонстрация
Также все стратегии бота доступны в формате PineScript для проведения тестирования на TradingView.