Привет, Хабр!
Меня зовут Андрей Счастливый. Пишу на Python. Месяц назад разбираясь с одним пакетом для бэктестинга торговых стратегий на C был очень разочарован в низкой скорости. А ведь в пакете для бэктестинга самое главное скорость и вообще возможность массово пакетами тестировать торговые стратегии. Решил написать на Python свой бэктестер с GPU.
За месяц написал пакет и вот ближе к делу, хочу рассказать о нём. Тянуть не буду сразу в лоб, цифры в факты.
WarpTrade — высокопроизводительный GPU-бэктестинг торговых стратегий, написанный на Python с использованием Taichi. Проект построен на модульной архитектуре с универсальным движком, способным запускать любые торговые стратегии через систему регистрации ядер. В основе лежит алгоритм собственной разработки.
Писал и тестировал пакет на следующем железе, цифры будут относиться к тестам на данном железе: рабочая станция Lenovo P15, процессор Xeon W-10885M 8/16 ядер, 64 Gb ram, видео Nvidia Quadro RTX5000 с 16 Gb видеопамяти.
Тестирование производилось на наборах данных для тикеров MOEX: RTS, Si, BR, NG и для каждого тикера наборы данных по 152-155 тыс баров по 1 минуте, это 9 месяцев торгового времени, с начала 2025 года. Торговля только внутри дня, чтобы Гэпы не ловить.
Факты, цифры:
используется фреймворк Taichi;
асинхронная загрузка файлов с многопоточностью;
просчёт ведётся в GPU параллельно на 12 тысячах CUDA ядер;
пакетная обработка всех подгруженных тикеров и таймфреймов. Можно сразу в очередь поставить 5 тикеров и для каждого 2-3 таймфрейма;
просчёт стратегий по диапазонам значений сразу для 10 параметров;
адаптивные диапазоны значений просчитываемых параметров для разных тикеров и если надо таймфреймов;
обработка стратегий батчами по 150 тыс стратегий в батче;
средняя стабильная скорость при долгих просчётах 150 тыс стратегий в 1 секунду;
по итогу для каждого тикера пакет отбирает ТОП-500 самых прибыльных торговых стратегий, рассчитывает для каждой 33 метрики и выгружает всё в excel таблицы для удобного анализа;
корректный расчёт прибыли в рублях и USD по методологии MOEX (учёт комиссий, ГО, стоимости шага и т.д.);
возможность подключать разные ядра с торговой логикой;
анализ частоты попадания значений просчитываемых параметров в список топ стратегий;
А под подъехал и пример вывода рабочего просчёта за 1 заход на 4 тикера 1,47 млрд стратегий за 2 часа:
Загрузка файлов завершена
Комбинаций к просчёту:
RTS - 308,689,920
Si - 255,011,328
BR - 325,061,100
NG - 258,552,000
Всего комбинаций: 1,147,314,348
Расчётное время просчёта: 2ч 7м 28с
Расчётное время окончания: 15ч 12м 22с
[Taichi] Starting on arch=cuda
Загрузка файлов завершена
Направление сделок: all, Режим торговли: Интрадей, Файлов: 4
✅ Зарегистрированы ядра: SMA_RSI
Файл 1: Min1\BR.txt, Баров: 153,020, Период: 06.01.25-12.09.25
ГО на 20.09.25: 10,000 rub. Объём торговли: x1. Депозит: 120 usd
? Запуск стратегии SMA_RSI
? Первый проход: вычисление прибыли для 325,061,100 стратегий
Выполнение первого прохода: 41м 28с | Стратегий/сек: 130,637
? Отобрано: 500 лучших стратегий по прибыли
? Второй проход: показатели для 500 лучших стратегий
Файл 2: Min1\RTS.txt, Баров: 151,548, Период: 06.01.25-12.09.25
ГО на 20.09.25: 27,000 rub. Объём торговли: x1. Депозит: 33,000 rub
? Запуск стратегии SMA_RSI
? Первый проход: вычисление прибыли для 308,689,920 стратегий
Выполнение первого прохода: 29м 33с | Стратегий/сек: 174,063
? Отобрано: 500 лучших стратегий по прибыли
? Второй проход: показатели для 500 лучших стратегий
Файл 3: Min1\Si.txt, Баров: 151,598, Период: 06.01.25-12.09.25
ГО на 20.09.25: 7,500 rub. Объём торговли: x1. Депозит: 9,000 rub
? Запуск стратегии SMA_RSI
? Первый проход: вычисление прибыли для 255,011,328 стратегий
Выполнение первого прохода: 29м 25с | Стратегий/сек: 144,402
? Отобрано: 500 лучших стратегий по прибыли
? Второй проход: показатели для 500 лучших стратегий
Файл 4: Min1\NG.txt, Баров: 154,812, Период: 06.01.25-12.09.25
ГО на 20.09.25: 8,500 rub. Объём торговли: x1. Депозит: 100 usd
? Запуск стратегии SMA_RSI
? Первый проход: вычисление прибыли для 258,552,000 стратегий
Выполнение первого прохода: 25м 1с | Стратегий/сек: 172,178
? Отобрано: 500 лучших стратегий по прибыли
? Второй проход: показатели для 500 лучших стратегий
Всего для 4 файлов просчитано стратегий: 1,147,314,348
Общее время выполнения: 2ч 5м 37с | Стратегий/сек: 152,212
✓ Ресурсы Taichi очищены
[+] Сохранение pickle-файла с данными статистики топ стратегий: data\stats\stats.pkl
[+] Отчет с ТОП-500 стратегиями сохранен в: data\output\intraday_top_strategies.xlsx
[+] Созданы графики частоты попадания значений в список топ стратегий
[+] Данные для графиков сохранены в файл: data\stats\dict_for_plot.pkl
Пробежимся по остальным деталям. Оптимальная полная загрузка видео карты:

Вывод метрик ТОП-500 стратегий в excel для удобного дальнейшего анализа:

Таблица со сделками выбранной топ стратегии:

Интерактивный график с показом сделок и отдельно графика прибыли с разделением на short и long для выбранной топ стратегии:

Мультиграфик для одновременного анализа графиков прибыли до 20 стратегий:

Ну собственно и всё)) Дальше в пакет буду добавлять ядра с разной логикой торговых стратегий. Если пост наберёт 50 голосов, то запишу и выложу видео с работой пакета.
Кому интрадей стратегий со средней доходностью на протяжении 9 месяцев в 50% в месяц к депозиту?))
Комментарии (44)

Speculator
01.10.2025 11:20Цифра впечатляет "на 4 тикера 1,47 млрд стратегий", видимо, имеется в виду количество вариаций одной стратегии, а не стратегий. От таких вычислений очень сильно веет переоптимизацией. На мой взгляд, ставить деньги на такие системы опасно.

Athenix Автор
01.10.2025 11:20Да, всё верно. Ядро пока одно. Это кол-во комбинаций значений параметров, оптимизация. По деньгам считает точно, расхождение в изменении курса usd. Я в ручную пересчитывал математику закрытия сделок. Переоптимизации нет. Был момент, когда я подошёл к скорости в 1 млн комбинаций в секунду, тогда да, расчёты посыпались. Откатился на 150 тыс.

amirkhonov
01.10.2025 11:20Кому интрадей стратегий со средней доходностью на протяжении 9 месяцев в 50% в месяц к депозиту?))
мне

axweye
01.10.2025 11:20Не очень понятно что с такой доходностью (50% в месяц ) вы на Хабре делаете. Если взять начальный депозит 10000 usd (не такая уж большая сумма), используя формулу сложного процента, то через 3 года у вас на счету будет примерно 227 млн usd. Можно начинать подыскивать остров для покупки

venanen
01.10.2025 11:20На самом деле, даже если вам удастся получить стратегию на 50% в месяц, то есть буквально бесконечные деньги - бесконечными они не будут. После определенной суммы сделки на большую сумму будут исполняться так долго и влиять на рынок так сильно, что полностью потеряют доходность.
А вообще тут как-будто бы типичный пример оверфитта обычной нейронной сети, только автор сделал необычный подход - место градиентного спуска взял просто огромное количество комбинаций весов и прогнал их последовательно и выбрал те, которые ближе всего к нужному результату. Я так могу любую доходность показать. По хорошему нужно подбирать стратегию на X_train, а потом выбранную запускать уже на X_test, и вот если там будет 50% в месяц - я поздравлю ещё одного миллиардера, но это, увы, не сработает.

Athenix Автор
01.10.2025 11:20Я этот пакет только написал. Предстоит написать торговый бот и делать тест со стратегиями с этого пакета.

axweye
01.10.2025 11:20Я бы, прежде чем писать бота, сделал бы следующее:
Как уже написали выше, разбить весь набор данных на две части - Train and Test. Обучать на Train, тестировать на Test
Попытаться найти ошибку "заглядывания в будущее". Самый простой пример такой ошибки: логика ваших алгоритмов использует цены Close, а открываете или закрываете сделку вы по ценам Open или High или Low той же свечи, Close которой используется в логике алгоритма

Athenix Автор
01.10.2025 11:20Я этот пакет только написал. Предстоит написать торговый бот и делать тест со стратегиями с этого пакета.

Athenix Автор
01.10.2025 11:20Я этот пакет только написал. Предстоит написать торговый бот и делать тест со стратегиями с этого пакета. P.s. - в хабре комменты глючат.

sergeym69
01.10.2025 11:20Не будет, это так не работает, для исполнения вашей фантазии, на бирже должна быть бесконечная ликвидность по торгуемому активу, чего не бывает.

axweye
01.10.2025 11:20Крупные ETF и акции на американском фондовом рынке этот объем, если его ещё и между инструментами разбить, даже и не заметят

yaroslavp
01.10.2025 11:20Но это же подгонка под исторические данные. Вот если поделить тестируемый отрезок пополам, на первом вычислить оптимальные параметры, с ними прогнать на втором. Тогда посмотрим скока там процентов в месяц выходит. Такими картинками весь трейдинг вью завален

Athenix Автор
01.10.2025 11:20Вы полностью правы. Этот момент частично проработан и также будет дорабатываться.

alhor
01.10.2025 11:20Как технический кейс - ок. Реально это не сработает, о чем тут уже подробно написали. Возьмите данные за другие 9 месяцев и все сразу станет понятно. А вот из сравнения таких периодов (лучше 3-4, с таким подходом это тоже быстро) можно выбирать наилучшие стратегии. Конечно, там не будет и 50% за год, но и 10% в валюте тоже очень неплохо. Удачи!

sergeym69
01.10.2025 11:20Если вы будете использовать так называемый "классический" подход - где берем и используем лучшую стратегию то работает не очень, а может и не работать. А вот если полученные данные по тестированию стратегий правильно обработать и создать на их основе "правильную" стратегию, то все таки очень неплохо работает, в том числе и на другом периоде, на котором НЕ проводили тестирование. НЕ грааль конечно, но работает неплохо и устойчиво. Как это делать писать конечно не буду, потому что хоть и не грааль, но вполне неплохо и конкуренты таки никому не нужны.

Athenix Автор
01.10.2025 11:20Я точь в точ понимаю о чём вы говорити) так и делаю. В данном пакете топ статегии выбираются не по прибыли, а по кастомной метрике, которая опираеться на 4 других метрики со своими весами. Акцент на стабильность и быстрое восполнение после просадки. Так и получается по 50%. А если тупо по прибыли, то там есть стратегии и по 65% в среднем в месяц, вот они более рисковые.

sergeym69
01.10.2025 11:20Тож решил попробовать Taichi, что то я забыл про него, больше numba использовал. Запустил новый Claude Sonnet 4.5 и с помощью него навайбкодил простой тестер стратегий за 30 минут. И вроде все работает, надо будет тоже потестировать насколько быстрее чем с numba выходит.

vasil1994
01.10.2025 11:20Кому интрадей стратегий со средней доходностью на протяжении 9 месяцев в 50% в месяц к депозиту?))
мне тоже

Format-X22
01.10.2025 11:20А ведь в пакете для бэктестинга самое главное скорость
Нет. Самое главное - реалистичность стратегии. А скорость нужна для поиска коллизий, которые идеально покажут вам прошлое и умрут в будущем. Я 9 лет подобным занимался в разных вариациях. Найти коллизию не сложно, а вот заработать - невозможно.

Athenix Автор
01.10.2025 11:20А я 15 лет). Понимаю о чём вы говорите, для меня это всё по умолчанию.

Format-X22
01.10.2025 11:20А зачем тогда всё оно?

Athenix Автор
01.10.2025 11:20Открыл в себе, что люблю такие вещи собирать. Раньше всё руками, да чужим ПО. А тут изучил Python и понял, что могу многое.

unicorn_style
01.10.2025 11:20Судя по вашим ответам не очень понимаете. Тут нет влияния сколько лет вы этим занимаетесь, 9-15…хоть сто.
Вы ниже пишите в ответе, что валидация частично решена. Что значит частично? Валидация данных либо проходит, либо не проходит.
ПС: больше похоже на то что вы вдруг научились обучать сеть на данных, и она обучилась. Вы так обрадовались что решили этим поделится, но валидацию не сделали. А я уверен что валидация покажет куда хуже результаты, более того на реальном рынке они спустят бабло. Вообщем вы поспешили…

j-b
01.10.2025 11:20Вот бы ещё увидеть реальный торговый счёт на этой системе... А то картинки это красиво, а вот цифры на счету говорят сами за себя.

unicorn_style
01.10.2025 11:20учёт комиссий
Как там учет комиссии сделан, тейкер/мейкер? Чтобы узнать кем вы были нужен стакан, а я вижу минутные свечи как дата-сет. Разница там огромная

Evlampy
01.10.2025 11:20Подбираем параметры на 24 годе и ранее, тестируем на 25. Смотрим как по всем стратегиям наступает плато. Накидать 15 индикаторов и чтобы параметров для подгонки было не менее 500, вот и весь секрет успеха. Надо ещё добавить в стратегии манименеджмент, мартингейл в самый раз. Автор к какой яхте уже прицениваешься?))

i-aztec
01.10.2025 11:20Нет, это ещё только начало. Дальше нужно ещё делать перебор, генетическую оптимизацию всевозможных комбинаций, условий, решающих правил, на основе различных индикаторов с разными параметрами. Чтобы софт сам искал оптимальную торговую стратегию. Вот где настоящий Грааль. Просто оптимизацией параметров N количества индикаторов вы таких красивых (на трейне) кривых доходности не получите ;)

i-aztec
01.10.2025 11:20Подбираем параметры на 24 годе и ранее, тестируем на 25. Смотрим как по всем стратегиям наступает плато.
Если тестировать по 150 тыс. стратегий в секунду, то и в 25-м году 1/3 из них вверх тоже пойдет. А треть от той трети и в 26-м. Так что все эти тестирования да валидации на отложенных выборках - не панацея ))

Evlampy
01.10.2025 11:20Пришлось покопаться в недрах памяти, ибо давно это было)
Да плато наступает не сразу)
Для начала выяснится что-то 2/3 отложенных лимитированных ордеров во время не срабатывают, срабатывают только как рыночные и не там как прогнозировалось в стратегии.
Задрачивать параметры я умел) Генетические алгоритмы наше всё) Кривая доходности на бумаге была покруче чем у Курта Сакаеды в реале, был в те времена такой деятель на фьючерсных рынках.

sturex
01.10.2025 11:20На барах/свечах тестировать не имеет смысла. И скорость совершенно не важна в бэктестах. И у вас подгонка под историю. На слепом тесте всё сломается.

Evlampy
01.10.2025 11:20на графиках нулевая информация. помню в amibroker можно было в будущее смотреть, если криво код на писать. ноль инфы какое проскальзывание на отложенных ордерах, какая комиссия. на любых данных будет так или иначе подгонка, тип данных не имеет значения.

leadraven
01.10.2025 11:20Как упражнение по программированию - хорошо, молодцом.
А над очередным ломателем финансовой системы могу только угрюмо усмехнуться.
DooKoo2
Мне интересно! Выкладывай:)
Можешь рассказать по следубщим пунктам:
Как синхронизировал батчи по варпам?
При копировании данных с GPU с хоста, в какую памчть трамбовал данные? Shared/global?
Была ли задействована constant память для каких-то данных?
Сколько потоков запускал?
Тестил ли на register pressure наборы данных, чтобы gpu не подтормаживала?
Вижу вывод с винды, GPU немного недозагружена, но возможно это кривое отображение задействованных ресурсов GPU, так все-таки, пробовал ли на 100% ее загрузить?
Считалось на CUDA или тензоры тоже подключались для каких-то действий?
Не упирался в троттлинг по памяти/кристаллу?
Спасибо за ответы заранее:)
Athenix Автор
У меня нет времени отвечать на все вопросы, извини. Главный совет: профилируй под своё железо и код. Я недели 2 профилировал. Поднял скорость с сотен стратегий до 150-160 тыс стратегий в секунду. В конце упёрся в скорость возврата просчитанных данных с gpu. Далее уже только железо другое нужно.