Backtesting: от гипотезы к проверке

Как я ускорил анализ торговых экспериментов в 18,3 раза, перестроил сложный исследовательский интерфейс и сохранил контроль над настройками, результатами и оптимизацией.

Независимый продукт · Product design и реализация с LLM-инструментами · 2026

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

Я развивал Backtesting как единый инструмент этого цикла. Работа охватила скорость анализа, модель взаимодействия, управление защитными правилами и проверку предлагаемых улучшений. На контрольном журнале анализ ускорился с 79,18 до 4,33 секунды, сохранив результат расчётов.

Замер относится к серверному анализу сохранённого журнала, а не ко всему бэктесту или скорости работы пользователя.

Реализованный интерфейс Backtesting: настройки, результаты и подбор параметров в единой рабочей области.
Текущий интерфейс Backtesting. Все три снимка в статье сделаны в изолированной локальной копии на демонстрационных данных; они не показывают результаты финансовых экспериментов ниже.

Продуктовая задача и моя роль

Backtesting вырос из инструмента проверки собственных торговых правил в приложение с настройками входов и выходов, управлением капиталом, журналом сделок, аналитикой, историей и многочисленными подборами параметров.

Я отвечал за продуктовую модель, структуру и поведение интерфейса, приоритеты изменений и реализацию с LLM-инструментами. Основным исследовательским контекстом была собственная работа с продуктом и разбор сохранённых запусков.

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

1. Сократить ожидание, сохранив результат

В июльском аудите серверный подбор метрик многократно фильтровал полный журнал для каждой комбинации. Это повторяло одну и ту же работу по тысячам вариантов.

В реализованной версии анализ использует битовые маски и объединённый проход статистики. Для тяжёлых запусков появилась общая очередь: один worker выполняет расчёт, остальные получают позицию в очереди. Пользовательский процесс требовал одновременно меньшего ожидания и предсказуемого состояния выполнения.

Метрика До После
Анализ одного и того же журнала 79,18 с 4,33 с
Сделок в журнале 41 839 41 839
Совпадение результатов вариантов Исходный расчёт 3 264 из 3 264
Контрольная сумма полного результата Эталон Совпадает с эталоном

В этом замере время ожидания одного анализа сократилось на 74,85 секунды, или 94,5%. Это производные значения из измеренных длительностей. Для проверки корректности также прошли 12 из 12 Rust unit/differential-тестов.

Принципиальным компромиссом была граница оптимизации: ускорять повторную обработку данных, сохраняя исходную семантику расчёта. Ускорение не должно незаметно менять то, какую гипотезу пользователь проверяет.

2. Организовать интерфейс вокруг исследовательского цикла

Прежние 25 пунктов навигации смешивали редактирование, диагностику и применение изменений. Я собрал их в три направления и 15 групп: 14 тематических и общие инструменты подбора.

Направление Вопрос пользователя Содержимое
Настройка прогона Что я проверяю? Данные, стратегия, вход, капитал и риск, сопровождение, исполнение
Результаты Что произошло? Итог, сделки, закономерности, история
Подбор параметров Что изменить и проверить следующим? Кандидаты для входа, фильтров, риска и сопровождения

Это изменение структуры: число функций не сокращалось. Каждый блок получил основное место, а связанные действия — переход к нужному редактору.

Особенно важным стало разделение трёх состояний: выбранного отчёта, настроек следующего запуска и кандидата оптимизации. При открытом отчёте B восстановление настроек A меняет форму, сохраняя выбранным результатом B. Просмотр кандидата не применяет параметры; обычная навигация не запускает расчёт.

История запусков Backtesting: выбран отчёт B, а в журнале событий зафиксировано восстановление настроек A.
Разные действия с историей сохраняют собственный контекст. На снимке — демонстрационные запуски A/B.

3. Дать непрерывный обзор без лишних обновлений

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

Первая версия этого решения имела техническую цену: изменение депозита вызывало повторный рендер 11 групп и 480 вызовов NumInput. После оптимизации все пять независимых групп настроек пропускают рендер, а группа капитала обновляется. При ручной прокрутке в контрольном сценарии зарегистрирован один рендер меню и ноль рендеров страницы и групп формы.

Эти числа получены в изолированном Chromium с development React. Они сравнивают промежуточную и оптимизированную версии общего списка; рост FPS или сокращение времени пользовательской задачи по ним не рассчитывались.

4. Сделать защитные правила понятными и проверяемыми

В июльском разборе обнаружилась неоднозначность: параметры переноса стопа были сохранены, но правило оставалось выключенным. Явное включение правила в контрольном повторе изменило результат одной сделки с −40,04 до +1,43 USDT.

В интерфейсе появилось состояние «ВКЛ / ВЫКЛ», исполнение получило метку BE-PATH, параметры стали сохраняться в снимке сделки. Поведение покрыли отдельными long/short-регрессиями.

Редактор защитного правила с явным состоянием ВЫКЛ и недоступными полями выключенного правила.
Сохранённые значения и действующее правило — разные состояния. Параметры на снимке демонстрационные.

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

Вариант Сделки Положительные Net PnL Макс. просадка
Исходный 28 57,1% +294,28 USDT 26,88%
Ранний BE-PATH 20/10 38 65,8% −226,92 USDT 43,39%
ATR-стоп + трендовый фильтр 23 78,3% +593,66 USDT 21,05%

Исследование охватывало DOGEUSDT за 2 мая — 31 июля 2026 года. Для третьего варианта изменение Net PnL относительно исходного составило +101,7%, просадка снизилась на 5,83 процентного пункта, profit factor вырос с 1,62 до 2,85. Это расчёт на периоде подбора с небольшой выборкой; независимой проверки этих параметров на новом периоде в данном отчёте нет.

Продуктовый вывод: сравнение должно показывать прибыль, риск и изменившийся состав сделок вместе. Более высокий win rate сам по себе не определяет лучший вариант.

5. Проверить ценность сложной модели относительно простого варианта

В сентябрьском эксперименте модель Jev оценивала максимальную цель выхода. Набор включал 1 394 сделки по 188 монетам; для оценки использованы 1 387 закрытых сделок, семь открытых исключены.

На 1 385 сопоставимых сделках модель дала 457 точных прогнозов против 450 у исторического baseline: около 33,0% против 32,5%, разница примерно 0,5 процентного пункта. Эксперимент потребовал 1 387 запросов, 2 733 038 входных и 68 680 выходных токенов.

Я также проверил, как предложение модели меняет распределение выходов:

Метрика Исходное распределение Схема Jev
Активных входов 1 387 717
Net PnL 7 547,20 USDT 4 308,78 USDT
Profit factor 1,416 1,403
Максимальная просадка 2 980,98 USDT 1 390,62 USDT

Схема уменьшала историческую просадку, но давала на 42,9% меньше Net PnL. Это ретроспективный пересчёт записанных исполнений: изменение комиссий и проскальзывание заново не моделировались. Результат не дал оснований считать схему улучшением.

Так проверка функции стала частью продуктового выбора: учитывать стоимость и сложность модели, дополнительную ценность относительно baseline и влияние на итоговое поведение стратегии.

Результат: изменение всей рабочей системы

Модель настройки, анализа и применения изменений прошла через реализацию, включая совместимость старых настроек и истории. Полноту переноса проверяли по 178 адресам: 175 основным блокам и трём контекстным окнам.

Проверка Зафиксированный результат
Полнота структуры Все 178 адресов имеют своё назначение
Совместимость навигации Сохранены все 25 прежних адресов
Настройки запуска Совпали все 750 проверенных полей на 393 искусственных ключах
Финальная проверка иерархии 218 изолированных браузерных сценариев прошли
Непрерывный просмотр Набор расширен до 225 сценариев; после исправлений 35 затронутых прошли повторно, остальные 190 — в полном прогоне

Проверки интерфейса использовали искусственные API/SSE и конфигурации. Они подтверждают поведение заданных сценариев и совместимость; скорость работы людей и снижение числа пользовательских ошибок отдельно не измерялись.

Мой вклад состоял в связке продуктовых приоритетов, модели состояния, интерфейса и реализации. Ускорение анализа проверялось вместе с сохранением результата; новая структура — вместе с сохранением действий; новые торговые варианты — вместе с риском и ценой ошибки.

Следующий цикл развития Backtesting

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

Дальнейшее развитие внутри Backtesting — фиксировать критерии до подбора параметров, явно отделять исследовательский период от независимой проверки и сохранять решение по каждой версии. Мониторинг условий во время исполнения остаётся отдельным будущим этапом.

Основания для численных результатов

Серверный анализ и 3 264 варианта — аудит производительности от 18 июля 2026 года. Варианты DOGE и защитное правило — отчёт от 31 июля. Jev — отчёт от 24 сентября. Структура, совместимость и профиль обновлений — отчёты внедрения от 15 октября. Проценты сокращения времени, изменения Net PnL и разница просадки рассчитаны из приведённых исходных значений. Финансовые результаты относятся к историческим исследованиям; они не являются измеренным эффектом редизайна или результатами реальных счетов.

← Назад к проектам