Вкладка Арбитраж → Бэктест прогоняет робота по истории из базы: те же настройки, те же правила входа и выхода, что в торговле, только вместо живых котировок — сохранённые котировки, сделки или минутные свечи. Так можно оценить, сколько робот заработал бы на корзине за прошедшие дни, и подобрать параметры, прежде чем запускать его даже в PAPER.
Бэктест работает в двух режимах:
- одиночный прогон — робот с текущими настройками за выбранный период: отчёт, сделки, график и эквити;
- оптимизация — перебор выбранных параметров по сетке значений: каждая комбинация прогоняется по тому же периоду, результаты собираются в таблицу, лучшие подсвечиваются, а параметры понравившейся комбинации переносятся в настройки робота одной кнопкой.

Быстрый старт #
- На вкладке Трейдинг настройте робота: корзину, модель, уровни или дельту, тейк-профит и стоп-лосс. Робота не обязательно запускать — бэктест берёт только его настройки. Открыть их можно и прямо с вкладки «Бэктест», кнопкой … рядом с выбором робота.
- Откройте вкладку Бэктест, выберите робота, период и источник данных.
- Не отмечая параметров в таблице справа, нажмите Запустить — это одиночный прогон. По окончании откроется вкладка Эквити, подробности — на соседних вкладках.
- Для подбора параметров отметьте флажок Оптимизация у нужных параметров, задайте Мин, Макс и Шаг и снова нажмите Запустить. Сколько получится комбинаций, видно в группе «Оптимизация».
- Щелчок по строке результатов — детальный прогон этой комбинации. Если она устраивает, кнопка В настройки робота… перенесёт её параметры в робота.
Что моделирует бэктест #
Ядро бэктеста — облегчённая копия робота по правилам принятия решений. Работают те же настройки робота:
- модель и уровни — фиксированный спред или «Опора + Дельта», порог входа, учёт издержек, макс. уход за уровень, разрешённые направления Long и Short;
- опора — скользящее среднее с периодом и прогревом из настроек робота, наблюдения — на сетке 0,1 с, как такты живого робота; перезапуск опоры после смены сессии; опора от уровня на старте;
- выход — тейк-профит, стоп-лосс (при широком спреде — по середине цены), уровень выхода фиксированного спреда, закрытие в конце сессии;
- паузы и ограничения — пауза между сигналами, макс. сигналов в минуту, пауза после стоп-лосса, окно торговли, выходные;
- набор позиции — объём на сигнал, макс. позиция, паузы между доборами и разгрузками;
- остановки — дневной лимит убытка и неудачи подряд. Робот после остановки ждёт оператора; бэктест считает, что оператор снимает остановку к следующему дню;
- качество данных — актуальность котировок ног по правилу робота, макс. спред ноги, проверка глубины;
- режим исполнения — тейкер-тейкер или мейкер-тейкер с удержанием, отступом и ожиданием котировки, агрессивный или пассивный выход, запас цены тейкера.
Издержки считаются по текущим ставкам комиссии и проскальзыванию из настроек — одинаковыми на весь период. Результаты в рублях — через текущую стоимость пункта корзины.
Исполнение тейкером. Решение принимается по ценам снимка, а сделка — через задержку исполнения по последним ценам на этот момент: по последней котировке, сделке или минутке не позже него. Если за время задержки цена ушла дальше «Запаса цены тейкера», вход не состоялся — это неудача входа, как у робота.
Исполнение котировкой. Котировка в «Мейкер-тейкере» ведётся по правилам робота: встаёт по лучшей цене своей стороны, переставляется за ней, отодвигается и снимается по выгоде, продлевается по ожиданию. Исполняется, когда встречная сторона ноги дошла до её цены или сделки прошли сквозь неё, — как PAPER робота без ленты. Остальные ноги хеджируются по рынку через задержку. На минутках котирование не моделируется: робот прогоняется как тейкер, о чём сказано в отчёте.
Глубина известна только в режиме «Котировки» и только на лучших ценах. Если корзин на лучших ценах меньше объёма входа, недостающее считается взятым на шаг цены хуже по каждой ноге; если «Макс. потеря на глубине» меньше шага, вход отклоняется.
Что не моделируется: гарантийное обеспечение, сбои хеджа и таймауты ног, очередь заявок в стакане, лимит заявок в минуту, сверка с терминалом. Доборы и разгрузки идут тейкером.
Источники данных #
Данные берутся из базы PostgreSQL, с которой работает программа, — из тех же таблиц, куда пишутся котировки и сделки.
- Котировки — лучшие Bid и Ask ног с объёмами из таблицы параметров. Самый точный режим: есть спред и глубина на лучших ценах. Снимки пишутся не на каждое изменение, а примерно раз в 15 секунд; пробелы длиннее минуты заполняются тиками;
- Тики — обезличенные сделки: покупка по рынку даёт Ask, продажа — Bid. Точное время сделок, но спред известен только по сторонам последних сделок;
- Минутки — цены закрытия минутных свечей, Bid и Ask строятся как close минус и плюс полуспред в шагах цены. Ноги внутри минуты не синхронны, поэтому результат грубый — режим для длинных периодов и первой прикидки.
Тикеры ищутся в базе без учёта регистра: SiZ6 и SIZ6 — один инструмент.
Склейка фьючерсов — вместо указанного в корзине контракта берётся фронтальный, по признаку активного контракта в базе. Нужна для периодов длиннее жизни одного контракта. В момент смены контракта позиция закрывается по последним ценам прежнего, опора набирается заново. Для календарного спреда — двух ног одного фьючерса — склейка невозможна.
Актуальность котировок. Каждая нога проверяется по правилу робота из его настроек: котировка устарела, если её возраст больше K × типичный интервал обновления ноги — не меньше пола и не больше потолка. Дополнительно бэктест требует, чтобы ноги обновились не дальше макс. рассинхрона ног друг от друга: в истории нога может записываться реже, чем обновляется на рынке, и без этого условия корзина видит ложное отклонение — одна нога уже сдвинулась, а другая ещё стоит. Снимки с устаревшей ногой, рассинхроном или спредом ноги шире «Макс. спреда ноги» робота — например, на аукционе открытия — не дают входов, не закрывают позицию по тейку и стопу и не копят опору. Закрытие в конце сессии от этого не зависит.

Настройки бэктеста #
Данные:
- Робот — чьи настройки и корзину проверяем; кнопка … открывает настройки робота, изменения применяются к нему сразу;
- Период — первый и последний день прогона;
- Данные — котировки, тики или минутки;
- Склейка фьючерсов — фронтальный контракт вместо указанного в корзине.
Исполнение:
- Задержка, мс — через сколько после решения исполняются заявки. Ставьте время, за которое брокер подтверждает исполнение;
- Макс. рассинхрон ног, с — ноги должны обновиться не дальше этого друг от друга; 0 — не проверять. На минутках условие не мешает: ноги в одной минуте;
- Полуспред минуток, шагов — только для минуток: типичный полуспред ноги.
Оптимизация:
- Потоков — сколько комбинаций считать одновременно; по умолчанию — по числу ядер процессора. Меньше — если во время оптимизации нужен отзывчивый терминал;
- Проверка, % дней — отложенный период в конце выбранного периода (см. ниже); 0 — без проверки;
- Мин. сделок в таблице — комбинации с меньшим числом сделок в таблицу не попадают: на паре сделок любой результат — случайность;
- Лучшие по — признак, по которому выбираются лучшие комбинации.
Кнопки справа: Запустить, Остановить — прервать прогон или оптимизацию (результат — по обработанным дням или посчитанным комбинациям), В настройки робота… и Очистить кэш….
Настройки вкладки, высота таблицы результатов, порядок и ширина её колонок сохраняются между запусками программы.
Оптимизация #
Справа — таблица Параметры оптимизации. В ней параметры, которые имеет смысл перебирать для модели робота:
- Фиксированный спред — уровень покупки, уровень продажи, тейк-профит, стоп-лосс, макс. уход за уровень, пауза после стопа, пауза между входами;
- Опора + Дельта — дельта в пунктах, дельта в долях СКО, порог входа, тейк-профит, стоп-лосс, макс. уход за уровень, пауза после стопа, пауза между входами.
Колонка Сейчас — значение из настроек робота. У перебираемого параметра отметьте флажок Оптимизация и задайте Мин, Макс и Шаг прямо в таблице; Значений — сколько значений даст диапазон. Неотмеченные параметры берутся как в настройках робота. Число комбинаций — произведение значений всех отмеченных параметров; больше 100 000 — программа спросит подтверждение, больше 2 000 000 — откажет.
Данные загружаются из базы один раз, опора считается один раз, затем комбинации считаются параллельно. Бессмысленные комбинации — например, уровень покупки не ниже уровня продажи — пропускаются.
Таблица результатов заполняется по ходу оптимизации. Колонки — номер комбинации, значения перебираемых параметров и метрики:
- Сделок, Итог, пт, Итог, руб, Средняя, пт — число сделок, результат на базовый объём и средняя сделка, после издержек;
- PF — профит-фактор, прибыль сделок к убыткам; Приб., % — доля прибыльных сделок;
- Просадка, пт — максимальная просадка по закрытым сделкам; Итог/просадка — сколько заработано на пункт худшей просадки;
- Убыт. подряд, Пропущено, Убыт. дней, Ср. время, мин — серия убытков, несостоявшиеся входы, убыточные дни и среднее время в позиции;
- Пров. сделок, Пров. итог, пт, Пров. PF, Пров. просадка — то же на отложенном периоде, если он задан.
Щелчок по заголовку сортирует таблицу, повторный — в обратную сторону. Колонки можно перетаскивать мышью. Лучшие 15 комбинаций по выбранному критерию выделены зелёным и закреплены сверху при любой сортировке. Критерии:
- Итог — результат за период подбора;
- Итог / просадка — предпочитает ровную эквити;
- Профит-фактор;
- Средняя сделка — запас на проскальзывание и издержки;
- Итог на проверке — результат на отложенном периоде, которого подбор не видел.
В строке состояния над таблицей — сколько комбинаций в таблице и сколько скрыто фильтром по числу сделок. Все комбинации, включая скрытые, сохраняются в файл CSV в папке ArbBt\results рядом с программой; итоги и лучшие 15 — в отчёте оптимизации.
Отложенный период. «Проверка, % дней» отрезает столько дней в конце периода: подбор их не видит, а каждая комбинация считается на них отдельно — колонки «Пров.». Хорошая комбинация держится и на проверке; сильное падение — признак подгонки параметров под историю. В детальном прогоне считается весь период, а проверка видна на эквити своим цветом и отдельной строкой в отчёте.

Результаты прогона #
Щелчок по строке результатов запускает детальный прогон комбинации; одиночный прогон — детальный сразу. Его результаты — на вкладках внизу:
- Отчёт — текстовый итог;
- Сделки — сделки корзины: номер позиции, время входа и выхода, сторона, корзин, цена сигнала, цены входа и выхода, итог в пунктах и в рублях, нарастающий итог, время в позиции, причина выхода. Пометка «(м)» — вход котированием, «часть» — разгрузка чанка;
- Сделки по ногам — каждое исполнение каждой ноги по времени: номер позиции, нога, покупка или продажа, вход, добор, выход или разгрузка, лотов, цена, по рынку или котировкой;
- График — цена корзины, уровни входа, опора, сделки и графики ног, как на графике робота;
- Эквити — результат нарастающим итогом по закрытым сделкам и просадка от максимума на отдельной шкале снизу.
Двойной щелчок по сделке показывает её на графике, по исполнению ноги — момент исполнения.
Цены ног в сделках берутся по тому же снимку, что и цена корзины: покупаемая нога — по Ask, продаваемая — по Bid, котируемая — по цене котировки, при нехватке глубины — на шаг хуже. Номер позиции общий для обеих таблиц: разгрузки чанков идут под номером своей позиции.
Отчёт состоит из разделов:
- Данные — сколько дней и снимков, сколько дней взято из базы и сколько из кэша, сколько строк по каждой ноге и как часто они пишутся. Если по ноге база не вернула ни строки, здесь же — запрос, который ушёл в базу, и частые причины;
- Актуальность котировок — порог актуальности каждой ноги, доля годных снимков и сколько сигналов и выходов не принято из-за негодных данных;
- Параметры — модель, уровни, опора, тейк, стоп, задержка, издержки, режим исполнения, набор позиции и остановки, с которыми шёл прогон;
- Результат — сделки, итог, средняя, просадка, дни, статистика котирования, глубины и остановок, результат на отложенном периоде;
- Допущения — что бэктест не моделирует.
Сделки и сделки по ногам сохраняются в файлы CSV в папке ArbBt\results — для сверки с журналом PAPER.

Перенос параметров в робота #
Выберите строку в таблице результатов и нажмите В настройки робота…. Откроется список изменений: каждый перебиравшийся параметр — текущее значение и новое. После подтверждения меняются только перебиравшиеся параметры, остальные настройки робота остаются как есть, а колонка «Сейчас» в таблице параметров обновляется.
Кэш данных #
Загруженные из базы дни сохраняются в папке ArbBt\cache — отдельно по каждой ноге, дню и источнику данных, и повторный прогон по ним в базу не ходит. Кэш сохраняется между запусками программы; в отчёте видно, сколько дней взято из базы и сколько из кэша.
- Сегодняшний день не кэшируется: база ещё дописывается.
- Пустой день — без данных по ноге — кэшируется, только когда ему не меньше трёх суток: данные за последние дни могут дозагрузиться в базу позже.
- Перед каждым прогоном удаляются файлы, не использованные дольше срока, и самые давно не нужные, если кэш больше лимита. Срок и лимит задаются в файле ArbBacktest.ini в папке программы, ключи MaxUnusedDays и MaxSizeMB.
- Кэш становится недействительным сам, если изменились шаблоны запросов или формат данных.
- Очистить кэш… удаляет кэш целиком.
Шаблоны запросов к базе — в разделе [SQL] файла ArbBacktest.ini в папке программы: их правят, если таблицы называются иначе.
Как пользоваться результатами #
- Начинайте с котировок. Тики и особенно минутки грубее: на них спред ног и синхронность моделируются приближённо. Минутки годятся для первой прикидки на длинном периоде.
- Задавайте отложенный период. Лучшая комбинация на подборе почти всегда лучше, чем будет в торговле. Смотрите, держится ли она на проверке, и выбирайте по «Итогу на проверке» или «Итогу / просадке» среди устойчивых.
- Не верьте комбинациям с парой сделок. Держите «Мин. сделок в таблице» достаточным для периода.
- Ищите плато, а не пик. Если соседние значения параметра дают резко худший результат, найденный пик — скорее случайность.
- Сверяйте с PAPER. Перед переводом в LIVE прогоните робота в PAPER и сравните его сделки с бэктестом за те же дни.