ГлавнаяБлогТорговый бот: честный тест показал +4% вместо +127%
Алгоритмы

Торговый бот: честный тест показал +4% вместо +127%

Честный бэктест торгового бота: +4,33% за 3 года против +127% у Bitcoin. Узнайте, как избежать ошибок и проверить свою стратегию. Читайте сейчас!

Al
Редакция Algolitalgolit.ru
8 мин чтения21 августа 2026 г.

Почему ваш торговый бот может врать

Каждая статья о торговых ботах заканчивается одинаково: зелёная кривая доходности и подозрительное молчание о том, заработал ли он реальные деньги. Эта статья — другая. Я потратил месяцы на создание алгоритмической торговой системы, протестировал её максимально честно, и вот главный результат: моя лучшая стратегия принесла +4,33% за три года вневыборочного тестирования. Если бы вы просто купили Bitcoin и держали, вы бы получили +127,77%. Я публикую эту цифру, потому что путь к цифре, с которой невозможно спорить, оказался и есть весь проект.

Что я построил

TradingAI — это около 4000 строк Python: движок стратегий, бэктестер, инфраструктура walk-forward валидации, живой бот для бумажной торговли с Telegram-уведомлениями, дашборд в реальном времени и более 130 тестов в CI. Бот торгует по простому прозрачному правилу (пробой канала Дончиана: покупка на 20-дневных максимумах, выход по трейлинг-стопу) на реальных биржевых данных через ccxt.

Сама стратегия — это несколько строк логики. Всё остальное существует потому, что первая версия проекта лгала мне, и я перестроил её так, чтобы ложь стала невозможной.

Как бэктесты лгут: полевое руководство

Мой первоначальный бэктестер показал, что стратегия прибыльна. Он ошибался четырьмя разными способами, и все четыре присущи любительским торговым ботам.

Look-ahead смещение (торговля на завтрашней газете)

Старый код вычислял сигнал по свече, а затем «покупал» по цене закрытия этой же свечи. Он действовал на основе информации, которой не существовало до завершения момента. Исправление структурное, а не заплатка:

# engine.py: бар t исполняет решение, принятое на закрытии бара t-1,
# с исполнением по цене открытия бара t. Одна строка политики, применяется везде.
def execute_bar(bar):
    if pending_signal:
        execute_order(bar.open)
        pending_signal = None
    signal = strategy.generate_signal(bar)
    if signal:
        pending_signal = signal

Один движок обеспечивает это для всех стратегий, а тест подаёт намеренно жульническую стратегию (она подглядывает на один бар вперёд) и утверждает, что она не может получить прибыль. Если кто-то добавит утечку позже, CI её поймает.

Комиссии — это босс-файт

Старый бэктестер не взимал комиссий. Комиссия тейкера на Kraken составляет 0,26% за сделку, что звучит ничтожно, но в сумме катастрофично. Когда я перезапустил систему с честными издержками, комиссии написали всю историю:

  • Таймфрейм 1 день: 14 сделок, комиссии 1,3% в год, итог +4,33%
  • Таймфрейм 4 часа: 61 сделка, комиссии 11,4% в год, итог −6,01%
  • Таймфрейм 1 минута: 52 сделки за 45 дней, комиссии 23,5% за 45 дней, итог −25,18%, ноль прибыльных сделок

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

Оценка собственной работы (переобучение)

Если вы настраиваете параметры стратегии на данных 2023 года, а затем тестируете её на данных 2023 года, вы измеряете запоминание, а не мастерство. Честный вариант — walk-forward анализ: оптимизация на обучающем окне, торговля на следующем окне, которое оптимизатор никогда не видел, сдвиг вперёд, повторение. Учитываются только невидимые окна. Мои +4,33% — это именно такая цифра: пять лет данных, оценка только по дням, которые параметры никогда не встречали.

«Это прибыльно» против «это везение»

Даже честный бэктест может быть случайностью. Поэтому инфраструктура запускает пермутационный тест: перемешивает дневные доходности рынка 200 раз (разрушая временную структуру, но сохраняя то же статистическое распределение) и перезапускает стратегию на каждой перемешанной истории. Если она показывает такие же результаты на шуме, значит, у неё нет преимущества. Мой результат превзошёл 97,5% перемешиваний (p = 0,025). Преимущество реально. Но оно маленькое и меньше комиссий.

Эксперименты, которые меня унизили

Три вещи, в которых я был уверен, что они помогут, и все они были выполнены тем же харнессом:

«Добавь больше индикаторов»

Мой оригинальный бот суммировал семь индикаторов в один счёт. При честном тестировании версия с 7 индикаторами показала худший результат (−2,4% против +3,0%). Индикаторы на одном активе — это коррелированные мнения; каждый новый добавляет больше способов запомнить историю, чем способов её прочитать.

«Торгуй быстрее для большей прибыли»

Смотри таблицу выше. Каждый шаг вниз по таймфрейму был строго хуже, полностью из-за комиссий. Математика не торгуется.

«Диверсифицируй по монетам»

Единственная идея с реальными доказательствами: трендовые фонды так делают. Я запустил то же правило на BTC + ETH + SOL, равные доли. Результат: портфельный Sharpe 0,30 против 0,38 для одного BTC. Диверсификация требует некоррелированных активов, а основные криптовалюты оказываются одной макро-волной в трёх размерах. Моя лучшая идея была убита моей же машиной. Я всё равно оставил функцию; тестовый стенд, который щадит идеи автора, бесполезен.

В чём бот хорош

Один защищаемый результат: во время падения Bitcoin на 53% максимальная просадка бота составила 4%. Он проводит около 80% времени вне рынка и только ловит подтверждённые тренды. Это машина для сохранения капитала, а не для обогащения. Стоит ли этот компромисс +4% против +127% — вопрос вашего желудка, а не вашего кода.

Инженерные решения, которыми я горжусь

Один движок для бэктеста и живой торговли: симулятор и живой бот исполняют один и тот же код, поэтому живое поведение не может молча отличаться от протестированного. Тест утверждает, что оба пути сходятся к одинаковому капиталу с точностью до цента.

Слой данных, который отказывается лгать: API Kraken молча игнорирует вашу дату начала и возвращает только последние ~720 свечей. Мой старый бэктестер печатал «тестирование 180 дней», а тестировал 2,5. Новый слой загрузки делает пагинацию на биржах, которые её поддерживают, и громко падает при усечении.

Живой режим, который не может работать без защиты: в старом живом пути функция стоп-лосса была буквально pass. Новый размещает стоп на стороне биржи при входе и немедленно закрывает позицию, если этот ордер не удался.

Режим повтора: живой бот на 4-часовом таймфрейме принимает шесть решений в день, что выглядит как зависшая программа. cli.py replay запускает реальный движок за две минуты на двухлетней истории, а дашборд анимирует каждую сделку. Тот же код, те же цифры, просто визуализировано.

Что я бы сказал себе в прошлом

Построй детектор лжи до стратегии. Без него вы не можете оценивать идеи, а с ним плохие идеи умирают бесплатно, а не дорого.

Комиссии — это не деталь. Они главный герой.

Отрицательный результат, который вы можете защитить, лучше положительного, который не можете.

«Выживет ли это под попытками опровержения?» — единственный стандарт, который имеет значение, в трейдинге и, вероятно, везде.

Практический вывод: что делать прямо сейчас

Весь проект открыт: github.com/nar1-frames/tradingai. Клонируйте, запустите make setup && make doctor, и python cli.py walkforward воспроизведёт каждую цифру из этой статьи на живых биржевых данных. Если найдёте способ обмануть харнесс, откройте issue. Это игра.

Ничто здесь не является финансовой рекомендацией. Измеренный результат буквально говорит, что так торговать не стоит.

#торговый бот#бэктест#walk-forward#комиссии#Python
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →