DiffQuant: прямая оптимизация коэффициента Шарпа через дифференцируемый торговый симулятор

DiffQuant: прямая оптимизация коэффициента Шарпа через дифференцируемый торговый симулятор

Что будет, если убрать proxy-цель из трейдингового ML-пайплайна и оптимизировать напрямую то, что реально важно в торговле?

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

Но в ней есть структурная проблема.

На обучении модель минимизирует MSE (среднеквадратичную ошибку) или кросс-энтропию. В реальной торговле стратегию оценивают по коэффициенту Шарпа, просадке и издержкам. Эти пространства слабо связаны. Высокая точность предсказания следующего бара не гарантирует прибыльную торговлю — особенно вне обучающей выборки, где мелкие колебания рынка принципиально непредсказуемы.

Именно этот разрыв — между тем, что оптимизируется, и тем, по чему оценивается — лёг в основу проекта DiffQuant.

Ключевая идея: весь путь от рыночных признаков до итоговой торговой метрики — это единый дифференцируемый вычислительный граф. Обратное распространение loss.backward() обновляет веса не через промежуточную цель, а напрямую через торговую механику: mark-to-market PnL, транзакционные издержки и коэффициент Шарпа.

Код открыт на GitHub. Данные доступны на HuggingFace. Все результаты из статьи можно воспроизвести.

Проблема proxy-цели

Классическая схема: на обучении — MSE, на оценке — Sharpe. Этот архитектурный разрыв вызывает три ключевые проблемы.

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

Проблема 2: отсутствие сигнала о размере позиции. MSE-модель учится угадывать направление, но не знает, насколько агрессивно входить. Размер позиции задаётся внешними эвристиками, не участвующими в обучении.

Проблема 3: издержки вне графа. Комиссии и проскальзывания применяются после обучения, на этапе бэктеста. Модель не видит их и не может научиться учитывать.

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

Дифференцируемый торговый симулятор

Можно ли представить торговый результат как последовательность тензорных операций, через которые пройдёт градиент? В случае DiffQuant — да.

На каждом шаге симулятор вычисляет:

  • Позицию модели;
  • Прибыль и убыток (PnL);
  • Транзакционные издержки;
  • Коэффициент Шарпа.

Все операции реализованы как тензорные вычисления в PyTorch. Градиент проходит от Шарпа обратно через PnL, позицию и backbone модели.

Ключевая сложность — транзакционные издержки, зависящие от модуля изменения позиции. Обычный модуль |x| недифференцируем в нуле — именно там, где модель часто находится в начале обучения. Чтобы сохранить дифференцируемость, используется сглаженная аппроксимация.

Она совпадает с |x| при больших значениях и остаётся гладкой вблизи нуля. Это устраняет разрывы в субградиенте и снижает риск численных нестабильностей на ранних эпохах.

Архитектура политики

iTransformer: внимание по каналам, а не по времени

В качестве backbone используется iTransformer (Liu et al., ICLR 2024). В отличие от классического Transformer, где токены — временные шаги, iTransformer рассматривает токенами признаковые каналы. Весь временной ряд по каждому признаку кодируется в один токен, а внимание работает между каналами.

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

Текущая конфигурация: d_model=32, n_layers=4, n_heads=2, d_ff=64. Общее число параметров — 52 354.

Direction × Gate: торговать и торговать ли вообще

Выход policy head — произведение двух независимых сигналов:

  • Direction — альфа-сигнал, указывает направление;
  • Gate — сигнал, определяющий, стоит ли входить в позицию.

Когда уверенность модели низка, gate стремится к нулю, и итоговая экспозиция близка к нулю — независимо от направления. Это дифференцируемый аналог action masking из RL.

Gate-смещение инициализируется значением −1.0. В начале обучения модель стартует в near-flat режиме. Позиции открываются только при достаточной уверенности. Это стабилизирует ранние эпохи и предотвращает переобучение на шуме.

Скользящий rollout без look-ahead

На каждом шаге модель видит только прошлое — контекстное окно. Нормализация признаков пересчитывается на каждом шаге только по этому окну.

Так исключается утечка будущей информации, которая часто скрывается в нормализации.

Гибридный loss: почему одного Шарпа недостаточно

Прямая оптимизация Шарпа приводит к патологическим режимам:

  • Модель перебалансируется каждый бар, съедая результат комиссиями (churning);
  • Flat collapse — модель уходит в постоянный кэш, Sharpe формально конечен;
  • На бычьем датасете — buy-and-hold;
  • Terminal exposure — весь риск переносится в конец горизонта;
  • Drawdown blindness — высокая доходность ценой неприемлемой просадки.

Гибридный loss включает компоненты, подавляющие эти эффекты:

  • −Sharpe — основная цель;
  • Штраф за оборот — борьба с churning;
  • Контроль просадки внутри эпизода;
  • Штраф за открытую позицию в конце горизонта;
  • Мягкое удержание доли flat-состояния;
  • Штраф за систематический long/short bias.

Последний компонент оказался критически важным. Без него модель, обученная на бычьем BTC (2024–2025), устойчиво дрейфовала в long-only поведение. Штраф за bias не позволяет модели принимать рыночный тренд за универсальный закон.

Просадка считается в лог-пространстве для числовой устойчивости. Доля flat-состояния аппроксимируется дифференцируемо через сигмоиду.

Mirror augmentation: симметричное обучение на асимметричных данных

Обучающий период (январь 2024 – март 2025) для BTC преимущественно бычий. Без дополнительных мер модель учится просто держать LONG.

Чтобы устранить это смещение, в train loop включена mirror augmentation: на части батчей ценовые каналы и траектория цены инвертируются. Растущий рынок становится падающим, и наоборот.

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

Результат: при полностью бычьем train-режиме модель демонстрирует ненулевую short-экспозицию:

  • Test (июль–сентябрь 2025): short fraction = 17.3%
  • Backtest (октябрь–декабрь 2025): short fraction = 20.9%

Без аугментации short_fraction был близок к нулю.

Эксперимент: данные, сплиты, конфигурация

Инструмент: BTCUSDT Binance Futures (USDⓈ-M perpetual)

Исходное разрешение: 1-минутные бары, close-time convention

Период: 2021-01-01 – 2025-12-31

Агрегация: до 30-минутного таймфрейма с origin="epoch". Итого: 87 648 баров. После нарезки на неперекрывающиеся эпизоды со stride=24 — 3 647 sample-эпизодов.

Временные сплиты

  • Train: 2024-01-01 → 2025-03-31 (градиентные обновления)
  • Val: 2025-04-01 → 2025-06-30 (отбор checkpoint)
  • Test: 2025-07-01 → 2025-09-30 (out-of-sample оценка)
  • Backtest: 2025-10-01 → 2025-12-31 (финальная hold-out оценка)

Обучающее окно намеренно ограничено 15 месяцами, чтобы минимизировать distribution shift. Расширение на более ранние данные — первый рекомендованный ablation.

Конфигурация основного эксперимента

910 train-эпизодов — намеренно малая выборка. При stride=horizon_len=24 каждый sample покрывает отдельное 12-часовое окно. Модель с 52K параметрами на 910 независимых эпизодах — capacity-constrained. Такая архитектура хуже подходит для запоминания шумной микроструктуры рынка.

Динамика обучения

Обучение проходит через три фазы:

Фаза 1 (эпоха 2): гиперактивность. Turnover/bar = 0.0335, flat = 1.6%. Модель торгует почти каждый бар. Комиссии съедают весь результат. Val Sharpe = −6.49.

Фаза 2 (эпоха 8): flat collapse. Модель уходит в кэш: flat fraction = 77.5%, turnover ≈ 0. Безопасно, но бесполезно.

Фаза 3 (эпоха 12+): рабочий компромисс. Flat_target-регуляризация не даёт оставаться в кэше. Val Sharpe переходит в положительную зону и продолжает расти.

К лучшему checkpoint (эпоха 30) val Sharpe достиг +1.254. Обучение ещё не сошлось — потенциал для дополнительных эпох остаётся.

Walk-forward оценка: test и backtest

Оценка использует единый непрерывный walk-forward протокол — как при live-торговле. Нет сбросов, нет отдельной логики.

Test: июль–сентябрь 2025 (3 месяца)

Sharpe (ann.) = +1.73, Return = +8.22%, MaxDD = 6.10%

Распределение позиций: Long 66.9%, Short 17.3%, Flat 15.8%

Mean |position| = 0.125 — модель работает с частичной экспозицией.

Backtest: октябрь–декабрь 2025

Sharpe (ann.) = +1.15, Return = +6.91%, MaxDD = 7.91%

Распределение позиций: Long 53.3%, Short 20.9%, Flat 25.8%

Mean |position| = 0.123. Рост доли flat — реакция на более сложный рынок. Short-экспозиция сохраняется.

Что именно показывают результаты

9.1 Оба held-out периода — положительные

Test (+1.73) и backtest (+1.15) показали положительный Sharpe и доходность после всех издержек. Один квартал может быть случайностью. Два последовательных — уже сигнал. Не доказательство, но основание для продолжения исследований.

9.2 Direction accuracy ≈ 50% — не слабость

Точность направления: 50.65% (test), 50.56% (backtest). Это не случайность, а признак правильно поставленной задачи.

Ключевое — асимметрия возвратов:

  • Correct avg ret — высокий;
  • Incorrect avg ret — низкий по модулю.

Модель не угадывает бары. Она управляет экспозицией: открывается, когда ожидаемая доходность превышает издержки. Gate-механизм фильтрует слабые сигналы, повышая качество исполненных сделок.

9.3 Осторожный режим во втором периоде

Снижение активности (flat fraction с 15.8% до 25.8%) совпадает с более сложным рынком. Стратегия не увеличивает риск — наоборот, gate снижает экспозицию в неопределённости.

9.4 Asymmetric learning работает

На бычьем train-периоде модель выучила симметричное поведение: short-фракция 17–21% в обоих evaluation-кварталах. Без mirror augmentation она стремилась к нулю.

9.5 Gate остаётся низким

Mean gate ≈ 0.12–0.13. Модель никогда не работает с полной экспозицией. Большинство позиций — частичные. Это соответствует консервативному профилю риска.

Ограничения

Один инструмент. Все результаты — только на BTCUSDT. Переносимость на другие активы не проверена.

Упрощённая модель издержек. Комиссии и проскальзывания — равномерные. Для крупных позиций требуется учёт market impact (реализован, но не задействован).

Чувствительность к гиперпараметрам. Веса loss, длина окна, признаки и параметры обучения взаимодействуют нелинейно. Это не plug-and-play, а исследовательская постановка.

Малая статистическая база. Два квартала — сигнал, но недостаточно для сильных выводов о стабильности.

Нет live execution layer. Проект — исследовательский фреймворк, не production-ready. Подключение к брокеру требует дополнительной инженерии.

Архитектура проекта и дальнейшее развитие

DiffQuant — открытая исследовательская лаборатория, а не разовый эксперимент. Код позволяет быстро проверить гипотезы и воспроизвести результаты.

Приоритетные направления

  • Мультиактивный портфель. Текущая архитектура — под один актив. Расширение потребует cross-asset attention и портфельного Sharpe.
  • Более сложные целевые функции. Перспективны Calmar-ориентированные цели, conditional drawdown penalties и режимно-зависимое взвешивание.
  • Дополнительные backbones. Реализованы LSTM, PatchTST, Mamba. Планируются benchmarks в идентичной постановке.
  • Online data pipeline. Запланирован сбор данных через Binance WebSocket для paper trading и live-мониторинга.

Связанные работы

Buehler et al. (2019). Deep Hedging. Основа для обучения политик через дифференцируемую финансовую цель. DiffQuant адаптирует подход от хеджирования к альфа-генерации.

Liu et al. (2024). iTransformer. Backbone модели. Внимание по признаковым каналам.

Moody & Saffell (2001). Learning to Trade via Direct Reinforcement. Первая формулировка прямой оптимизации PnL. DiffQuant расширяет её до end-to-end дифференцируемого пайплайна.

Khubiev et al. (2026). Finance-Grounded Optimization For Algorithmic Trading. Близкая работа: использует Sharpe, PnL и MaxDD как loss. Отличие — в DiffQuant градиент проходит через торговую механику, а не только через голову предсказания.

Заключение

DiffQuant — попытка устранить структурный разрыв между предсказанием и торговлей.

Вместо схемы «предсказание → отдельная торговля» — единый дифференцируемый граф: признаки → позиция → симулятор → метрика → градиент.

Эксперимент показал:

  • End-to-end дифференцируемый пайплайн реализуем на PyTorch;
  • Гибридный loss выводит модель из патологий — гиперактивности и flat collapse;
  • Mirror augmentation обеспечивает симметричное long/short поведение даже на бычьем train;
  • Два последовательных held-out квартала дали положительный результат после всех издержек.

Это не готовая торговая система. Но это основание утверждать, что подход заслуживает серьёзного изучения.

Ценность проекта — не в «готовой кнопке», а в открытой, воспроизводимой платформе для исследования: что происходит, когда торговая цель становится частью градиента.

P.S. — для тех, кто дочитал до конца

DiffQuant — не продукт, не сигнал, не торговый робот. Это экспериментальная исследовательская платформа с одной целью: что будет, если убрать proxy-цель и поставить торговую механику прямо в градиент?

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

Всё это — не оговорка, а принципиальная часть статьи.

Зачем публиковать? Чтобы сообщество увидело и улучшило. Если вы получили другой результат — это ценно. Если нашли слабое место — ещё ценнее. Если улучшили loss или backbone — я хочу об этом знать.

Код открыт. Данные открыты. Протокол воспроизводим.

Это приглашение к исследованию, а не обещание прибыли.

Читать оригинал