Моментум как задача ранжирования: учимся сортировать, а не предсказывать
Суть идеи
Кросс-секционный моментум — это, по сути, задача сортировки: на каждом ребалансе расположи активы от худшего к лучшему, купи топ, продай аутсайдеров. Классика делает это через прокси — 12-месячную доходность. Нейросетевые подходы идут чуть дальше: предсказывают будущую доходность каждого актива, а потом сортируют по предсказанию. Это и есть regress-then-rank: оптимизируешь MSE/MAE по уровню доходности, а ранг получаешь как побочный продукт.
Авторы указывают на принципиальный изъян: ошибка регрессии и ошибка ранжирования — разные вещи. Модель, минимизирующая MSE, не обязана правильно упорядочивать активы — особенно в середине распределения, где доходности кластеризуются. Learning-to-rank (LTR) решает задачу напрямую: функция потерь штрафует за неправильный порядок пар или списков, а не за отклонение предсказанного числа от реального. Классические алгоритмы здесь — RankNet, LambdaRank, ListNet, знакомые по задачам поиска и рекомендаций.
На акционных данных авторы демонстрируют, что LTR-подход даёт более стабильный ранговый порядок и меньше «шумных» перестановок на границах лонг/шорт-корзин. Конкретные числа в аннотации не раскрываются, но тезис понятен: если цель — ранг, оптимизируй ранг.
Применимость к крипте
На крипто-юниверсе идея ложится естественно. BTC, ETH и ликвидные альты уже торгуются как кросс-секционный набор — именно так работают многие CTA-стратегии на Deribit/Binance. Признаки для ранжировщика можно взять шире, чем просто прошлая доходность: funding rate (carry-сигнал), basis (фьючерсная премия), ATM IV (ожидаемая волатильность), GEX (gamma exposure как прокси ликвидности опционного рынка). Всё это наши ряды.
Главная адаптация: крипто-юниверс мал (10–30 ликвидных инструментов против тысяч акций), а LTR-алгоритмы любят большие юниверсы — чем больше пар для сравнения, тем лучше обучается ранжировщик. Это реальное ограничение, которое нельзя игнорировать.
Тестируемо ли
Технически — да. В Python есть lightgbm с objective='lambdarank' и xgboost с rank:pairwise. Наш bt_engine может на каждом ребалансе (еженедельно/ежемесячно) скармливать модели rolling-окно признаков, получать ранги и формировать лонг/шорт-корзины. Rolling z-score по признакам — стандартная нормализация.
Честная оговорка: исторических данных по альтам до 2020 года мало, а walk-forward с LTR требует достаточного числа независимых ребалансов для обучения. На 5-летней истории с месячным ребалансом — около 60 точек, что на грани статистической значимости для сложной модели.
Сомнения
Малый юниверс — главная проблема. LTR на 15 активах с сотнями параметров — это почти гарантированная переподгонка. Классический sort-on-past-return может оказаться сильнее просто потому, что у него нет степеней свободы для переподгонки. Кроме того, крипто-моментум режимно хрупок: в 2022 году он работал в шорт, в 2023–2024 — в лонг, и никакой LTR-модели это не объяснит без явного режимного фильтра. Data-snooping риск высок — авторы тестируют на акциях, и прямой перенос выводов на крипту без OOS-теста некорректен.
Следующий шаг
Поставить walk-forward сравнение: baseline — sort-on-12m-return по топ-15 ликвидным альтам; challenger — LightGBM LambdaRank с признаками (12m return, funding, basis, ATM IV), обучение на 24-месячном окне, тест на следующем месяце. Метрика — Deflated Sharpe и ранговая корреляция предсказанного и реализованного порядка. Если LTR не бьёт baseline по Deflated Sharpe — идея не работает на нашем юниверсе.
Результаты тестов
Проверено на наших данных до публикации (2026-09-05) — повторили конструкцию работы на кросс-секции 30 перпов Binance: те же признаки, тот же портфель «три лучших в лонг, три худших в шорт», четыре ранжировщика плюс случайный, дневная и недельная ребалансировка, 2021–2026. Тезис про порядок подтверждается: ранжировщик, обученный на порядок, ранжирует лучше всех. Тезис автора про рассинхрон NDCG и Sharpe подтверждается ещё сильнее, чем он предупреждал: лучший по порядку — худший по деньгам, а зарабатывает старый добрый MACD-блэнд.
Провенанс. Статья открыта и разбирает SSRN 5255258: LambdaMART против «предсказать и отсортировать» (MLP под MSE), сортировки по прошлой доходности (JT) и MACD-блэнда (Baz) на четырёх классах активов; в акциях дневной Sharpe 3.40 без издержек, недельный 0.54; NDCG@3 0.556 против 0.540 у случайного. LambdaMART у нас в окружении нет, поэтому обучение на порядок реализовано линейным попарным ранжировщиком (логистическая потеря на парах внутри даты, вес ×3 у пар с участием истинных топ-3 и низ-3 — акцент на краях, как у NDCG@3). Это изолирует ровно то, что изолирует работа: одни признаки, одна модель, две цели обучения — ошибка прогноза против порядка. Деревья мы не воспроизводим, и это оговорка.
Стенд и предрегистрация
Дневная панель всех USDT-перпов Binance (только текущие листинги — выживаемость), юниверс на дату — топ-30 по 90-дневному объёму с историей ≥ 300 дней (работа ограничивает ~31). Признаки по букве: сырая доходность за 21 день, вол-нормированные доходности за 1, 3, 5, 10, 21, 63 дня (σ — EWM за 63 дня), нормированные MACD 8/24, 16/48, 32/96. Ранжировщики: JT (сортировка по 252-дневной доходности; плюс крипто-адаптация по 63 дням), Baz (среднее φ(MACD) по трём масштабам), RtR — ridge на вол-нормированную доходность следующего периода с λ по валидации, LTR — попарный ранжировщик, Random — сто случайных порядков на дату. Портфель: топ-3 лонг, низ-3 шорт, равные веса, позиция ×15%/σ, фандинг по знаку, издержки 0 (как в работе) и 5/10 б.п. на единицу оборота. Walk-forward расширяющимся окном, минимум год, рефит каждые полгода. NDCG@3 = среднее по топу и низу с перевёрнутыми метками; экспоненциальный gain по рангу (буква; случайный при N = 30 даёт 0.10), плюс «половинная» шкала, на которой случайный даёт 0.50 (как 0.540 в работе), плюс доля попаданий в истинные топ-3. Решающее правило зафиксировано до прогона.
По порядку выигрывает обучение на порядок
Дневная ребалансировка, 1732 дня вне выборки (ноябрь 2021 — август 2026):
| ранжировщик | NDCG@3, gain по рангу | парный t к случайному / к RtR | NDCG@3, половинная шкала | попадание в топ-3 |
|---|---|---|---|---|
| LTR (обучение на порядок) | 0.175 | +18.2 / +5.1 | 0.529 | 0.162 |
| RtR (ridge под MSE) | 0.147 | +12.6 / — | 0.501 | 0.138 |
| JT, 63 дня | 0.134 | +9.2 / −2.7 | 0.502 | 0.129 |
| Baz, MACD-блэнд | 0.133 | +9.2 / −2.9 | 0.519 | 0.127 |
| JT, 252 дня | 0.120 | +6.1 / −5.5 | 0.511 | 0.118 |
| случайный | 0.099 | 0.500 | 0.100 |
Перевес обучения на порядок над сортировкой прогноза значим (t = 5.1), над сортировкой по доходности — тем более (t = 10.5). Он же тонкий: на половинной шкале 0.529 против 0.500 у случайного, у авторов 0.556 против 0.540. Всё как в работе.
По деньгам — наоборот
| ранжировщик | Sharpe брутто, дневная | нетто при 5 / 10 б.п. | недельная, брутто | недельная, 10 б.п. |
|---|---|---|---|---|
| Baz, MACD-блэнд | +1.05 | +0.97 / +0.90 | +0.63 | +0.54 |
| JT, 63 дня | +0.81 | +0.61 / +0.42 | +0.52 | +0.39 |
| JT, 252 дня | +0.60 | +0.48 / +0.35 | +0.41 | +0.32 |
| случайный | +0.51 | +0.38 | ||
| RtR (ridge под MSE) | +0.21 | −0.70 / −1.61 | +0.09 | −0.19 |
| LTR (обучение на порядок) | −0.49 | −1.16 / −1.82 | −0.31 | −0.58 |
Ранжировщик с лучшим NDCG — последний по Sharpe, с отрывом от случайного в минус целый пункт. Разница LTR − RtR по Sharpe −0.70 (p под ротационным нулём 0.84). Ротационный нуль по меню из пяти: Baz p = 0.01 без поправки и 0.14 с поправкой на меню, JT-63 0.06, LTR 0.85. Автор предупреждал, что «NDCG и Sharpe не ходят вместе» и что случайное ранжирование в валютах обходит LambdaMART; в крипте это не оговорка, а главный результат. NDCG@3 меряет, попали ли крайние имена в крайние слоты; деньги делает величина того, что происходит с этими шестью позициями дальше, и в крипте с её лотерейными хвостами точное попадание в «самых экстремальных» — не то же самое, что заработать на них.
Дневное против недельного, и издержки
Тезис автора о том, что дневная цифра — демонстрация без издержек, воспроизводится: ML-ранжировщики умирают на 5–10 б.п. (RtR с +0.21 до −1.61, LTR с −0.49 до −1.82), потому что перебирают состав каждый день; hand-built Baz с оборотом в разы меньше переживает (1.05 → 0.90). Переход на неделю режет всех: Baz 0.63, JT 0.4–0.5, ML около нуля или ниже. По годам лидер меняется: LTR в минусе 2022–2024, +0.75 в 2025 и −2.51 в 2026; RtR +1.60 в 2022 и минус два следующих года; JT-252 +1.40 и +1.14 в 2025–2026. «Структура ранжирования не универсальна» — не только между классами активов, но и между годами внутри одного.
Санитария
NDCG: идеальный порядок = 1 на всех трёх шкалах, обратный = 0, случайный 0.102 / 0.500; аналитический градиент попарной потери совпал с конечными разностями до 10⁻¹⁰, на синтетике с известным линейным порядком ранжировщик восстанавливает его с корреляцией 1.00; шум в таргетах последней недели не меняет прогноз; портфель одной даты пересчитан руками; оракул со знаком будущей доходности даёт Sharpe 12.5, тот же оракул со сдвигом на дату — обычный 1.06; повторный прогон побитово тот же.
Что не проверено и где копаем дальше
- Деревья. Возможно, LambdaMART с нелинейностями ведёт себя иначе, чем линейный ранжировщик; проверить это в нашем окружении пока нечем. Но линейная версия ставит тот же эксперимент, что и работа, — одинаковые признаки, разная цель, — и рассинхрон порядка с деньгами видит с запасом.
- Что делать с рассинхроном. Если торгуется порядок, а платит величина, то цель обучения должна быть не NDCG и не MSE, а сама доходность портфеля «три на три» — прямое обучение на P&L конструкции. Это следующий стенд.
- Baz на кросс-секции перпов заработал без обучения: 1.05 брутто, 0.90 при 10 б.п., p 0.01 без поправки на меню и 0.14 с ней. Проверяем отдельно вместе с другими кросс-секционными кандидатами и сообщим.
- Читатели, у которых есть свой ранжировщик, — пришлите определение, прогоним на том же стенде с теми же признаками и портфелем и опубликуем с указанием автора.