Тестирование торговых стратегий на исторических данных
Достоверный портфельный бэктест. Уровень quant-исследований
hamster-bot/tester - Подвинутый инструмент для проведения тестирования своих торговых систем на исторических данных.
- Прогон сразу нескольких стратегий разных типов на разных таймфреймах одновременно.
- Всё это с общим балансом. Для понимания как стратегии уживаются на одном кошельке в режиме реального времени.
- Поддержка тиковых данных. Симуляция поведения стратегии внутри свечи как на торгах в реальном времени.
- Нет ограничений по входным рыночным данным. Проведение тестирования за любые исторические периоды.
- Тестирование своей сложной логики которую невозможно точно протестировать готовыми сторонними решениями без костылей.
- Бэктесты проходят на том же продакшн коде, на котором работает бот в реальном времени.
Реализовано как отдельный коннектор
к "бирже" (Mock-объект заменяющий биржу). Таким образом можно протестировать
весь ранее написанный код бота. Бот думает, что работает на реальной бирже (ставит ордера, получает баланс и инфу о
позициях). А эта виртуальная биржа заглушка всё считает и генерирует отчет.
Рыночные данные для
тестирования
Криптовалютные биржи публично делятся историческими рыночными данными. Вот примеры:
public.bybit.com, data.binance.vision, public.bitmex.com.
Тестер сам скачивает нужный диапазон данных о торгах и формурует бары для бота. Тестер скачивает до начала теста
несного больше данных чтобы проогрузились все индикаторы ТА для стратегии перед началом периода
тестирования.
Данные сохраняются в
папку tester/data/{exchange}/{symbol}. В эту папку можно подкинуть любые
свои данные в CSV формате.
Есть файлик run_download_data.bat в папке бота. Запускает бота с флагом --download-data и в этом режиме тестер просто скачает все нужные данные.
Реализовано автоматическое скачивание рыночных данных для спота и фьючерсов с бирж: BYBIT, BINANCE ,MEXC.
Биржа определяется в файле настроек: settings.exchange.name = "binance"
Поведение
тестера
С точки зрения бота, тестер - это просто еще одна биржа. Бот подключается к ней и начинает получать бары,
выставлять ордера и т.д. Тестер в это время просто эмулирует поведение реальной биржи.
Баланс общий для всех стратегий. Поведение как на фьючерсах BYBIT/BINANCE с кросс маржой. Бот может
запросить Wallet или Margin баланс. Margin баланс рассчитывается с учетом всех
открытых позиций и unrealized PnL по ним.
Реальное поведение цены. Когда бот запрашивает текущую незавершенную свечу, тестер отдает цену сделки из
тиковых данных (и так пока не закнчатся рыночные данные внутри свечи и перейдет к следующей). Таким образом
стратегии, которые завязаны на цену внутри свечи (например проскальзывание, трейлинг стопы и т.д.) работают
корректно.
Отчёт
По окончании тестирования в
папку tester/report сохраняется подробный HTML отчет.
И добавляется запись в reports_history.csv со сводной информацией по тесту для удобного поиска
лучших комбинаций параметров при оптимизации стратегий.
-
Содержание отчета:
- Общие метрики всей торговой системы:
- Начальный и конечный баланс
- Общая прибыль/убыток в USDT и %
- Максимальная просадка
- Количество сделок
- Процент прибыльных сделок
- Profit Factor
- Отдельные свечные графики по каждой стратегии. С отметками сделок и визуализацией ТА стратегии.

- График Margin баланса (с учетом всех открытых позиций и unrealized PnL) и Wallet баланса.

- График отражающий суммарный размер открытых позиций в USDT (и линия на отдельной оси в % показывающая
отношение суммы открытых позиций к Margin балансу)

- Таблицы со списком всех сделок по каждой стратегии.

- Список настроек стратегий и параметров тестера
- Сводная информация по всем стратегиям. Обьем торгов и уплоченная комиссия.

Параметры
тестера
файл: config_tester.json Можно редактировать файл в текстовом редакторе.
name_comment - комментарий к тесту. Чтобы было удобнее ориентироваться в отчетах.
InitialBalance - начальный баланс для тестирования в USDT
StartDate - дата начала тестирования в формате 2026-02-03T00:00:00
EndDate - дата окончания тестирования в формате 2026-02-13T00:00:00
WarmupDays - количество дней для прогрева перед началом тестирования
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%)
limit_order_volume_check - Проверка обьема для корректного исполнения лимитных ордеров. Тестер на каждом тике проверяет объем и откусывает от ордера пока он не закончится или пока хватает объёма
FundingRate - Размер ставки фандинга (0.00025)
FundingIntervalHours - Интервал обновления ставки фандинга в часах (8)
UpdateData - обновление данных перед тестированием (true/false)
use_logger - использование логгера. Если выкл то ускоряет тестирование (true/false)
max_parallel_runs - количество параллельных прогонов тестера при переборе параметров. Если
производительность компьютера позволяет то получается паралелить процессы без потерь скорости расчета.
файл: config_tester.json/report Настройка содержания отчета:
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_strategy_settings - включение настроек стратегии в отчет (true/false)
Оптимизатор
(перебор параметров)
файл: config_tester.json/parameter_mining Настройка оптимизатора (переборщика
параметров):
По умолчанию это пустой список []. список напоняется значенями
{"name":"имя_параметра_для_перебора", "start": 1, "end": 10, "step": 0.1, "values": ["strng1", "string2"]}
name - имя параметра для перебора. Можно ввести любую настройку бота. Всего у бота 4 вида
конфигов.
1) Настройки стратегии (.json файлы в папке settings_strategy). Тут мы настраиваем: торговую пару,
таймфрейм, работу с депозитом и то какая стратегия и на каких настройках будет работать.
Пример: settings[*].mrs2.ma_long.type - перебор параметра type у открывающего ордера
стратегии mrs2
2) Настройки api ключа (.json файлы в папке settings_accounts). Тут мы настраиваем общий на весь аккаунт
тейк профит по балансу маржи либо ограничитель числа однавременно открытых позиций.
Пример: account[*].close_by_margin.profit - перебор параметра profit опции
close_by_margin
3) Общие настройки программы бота (файл settings_program.json). Тут мы настраиваем общий общий множитель
лота risk_multiplier
Пример: settings_program.risk_multiplier - перебор параметра risk_multiplier
4) Общие настройки тестера (файлы config_tester.json). Тут мы настраиваем параметры тестера. Например
можно прогнать тесты с разными уровнями комиссии.
Пример: config_tester.MakerFee - перебор параметра MakerFee
start - начальное значение параметра
end - конечное значение параметра
step - шаг изменения параметра
values - список значений для перебора (строки). Используется для строковых параметров.
Например, для типа скользящей средней доступны значения:
["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.
Если вы укажете для перебора два параметра например от 1 до 10 с шагом 1, то будет проведено 100! прогонов
(10 вариантов первого параметра * 10 вариантов второго параметра). Результаты всех тестов сохраняются в виде
отдельных html отчетов и в сводной таблице (reports_history.csv). Это позволяет быстро находить лучшие
комбинации параметров для своих стратегий.
Пример 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": []
}
]
Также все стратегии бота доступны в формате PineScript для проведения тестирования на TradingView.