Что будет, если убрать 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 — я хочу об этом знать.
Код открыт. Данные открыты. Протокол воспроизводим.
Это приглашение к исследованию, а не обещание прибыли.