Математика больших чисел: из игры с нулевой суммой в игру с растущей суммой

от автора

Исходный код, разобранный в статье, опубликован в этом репозитории.

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

luxalgo.com

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

Игра с конечной суммой

Любая эффективная quant-стратегия — это эксплойт неэффективности рынка. Как только эксплойтом пользуются все — неэффективность исчезает, потому что её ровно и создавало то, что её никто не арбитражил. Рынок приходит в равновесие. А равновесие для участника означает простую вещь: математическое ожидание сделки становится нулём минус комиссия биржи. Не «маленькая прибыль», а строго отрицательное число.

Побег в игру с растущей суммой

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

Едем в рай на чужом горбу

Ранее я разбирал stop hunting паттерн по сбору ликвидности: участникам рынка публикуют пост с паническими настроениями для массовой распродажи, как следствие актив можно единовременно выкупить дешевле. Но заработать так же можно и на эйфории.

Metric

Value

Total trades

22

Wins / Losses

15 / 7

Winrate

68%

Mean trade PNL

+2.374%

Std dev per trade

7.676%

Sharpe Ratio (per-trade)

+0.302

Телеграм-канал публикует сигналы, они удачные в 68% случаев. Рядовой вкладчик не будет смотреть дальше. А это ловушка: риск-менеджмент вовсе не страхует от сценария чёрного лебедя.

Риски:

  1. Высокая волатильность относительно средней прибыли

    Средняя сделка +2.37%, но стандартное отклонение ±7.86%. Один-два сильных убытка легко съедают прибыль десятка мелких выигрышей, а winrate при этом остаётся «красивым».

  2. Низкий Sharpe = слабая компенсация риска

    Sharpe 0.3 говорит о том, что прибыль недостаточно велика по сравнению с принимаемым риском. Хороший трейдинг стремится к Sharpe > 1.0.

Это другой паттерн использования ликвидности толпы: pump and dump. Проверим гипотезу, выбрав только те сигналы, когда цена актива за предыдущие N часов уже росла.

Metric

Value

Total trades

11

Wins / Losses

11 / 0

Winrate

100%

Mean trade PNL

+6.972%

Std dev per trade

8.642%

Sharpe Ratio (per-trade)

+0.807

Что улучшилось:

  1. Sharpe Ratio вырос в 2.67 раза (0.302 → 0.807)

    Теперь прибыль гораздо лучше компенсирует принимаемый риск.

  2. Средняя сделка стала почти в 3 раза прибыльнее (+2.37% → +6.97%)

    Ушли просадки портфеля: меньше убыточных сделкок

Рост цены за последние N часов это эмпирический критерий. Я знал куда смотреть заранее, но анализ матрицы постов рекомендательного характера я не делал. Если взять топ 100 каналов, используя время публикации и направление рекомендации можно вычислить одного автора за несколькими анонимными аккаунтами. Далее, с привязкой к однуму автору, можно узнать, сколько еще каналов он потенциально способен использовать для продолжения пампа

Как на этом заработать

Используя self enforcement runtime, парсер и высокопроизводительный бектест можно актуализировать эмпирические критерии входа автоматически. Парсер канала вытаскивает из текста направление, зону входа, цели и стоп простыми regex-правилами:

const SIGNAL_FORMAT: ParseFormat<SignalFields> = {    symbol: {        pattern: /#([A-Z0-9]+)\/USDT/,        group: 1,    },    direction: {        pattern: /(ШОРТ|ЛОНГ)/i,        transform: (raw) => (raw.toUpperCase() === "ШОРТ" ? "short" : "long"),    },    entry: {        pattern: /зоне\s+\$?([\d.,]+)\s*[-–—]\s*(?:\$?[\d.,]+\s*[-–—]\s*)?\$?([\d.,]+)(?=\s)/i,        transform: (_, m) => ({ from: num(m[1]), to: num(m[2]) }),    },    targets: {        pattern: /Закрыть(?:\s+ордер)?\s+по(?:\s+цене)?\s+\$?([\d.,]+)/gi,        transform: (_, m) => num(m[1]),        multi: true,    },    stoploss: {        pattern: /СТОП-?ЛОСС:\s*\$?([\d.,]+)/i,        transform: (_, m) => num(m[1]),    },};

Высокопроизводительный бектест высчитывает метрики по pre-publication данным

const PRE_CANDLES_LIMIT = 1440; // 24h 1m свечей для baseline// окно getCandles(.., 1440) покрывает ровно сутки ДО публикации сигналаconst preCandles = await getCandles(symbol, "1m", PRE_CANDLES_LIMIT);// momentum24h — общее изменение цены за 24h до публикации.// Положительный = памп уже идёт; отрицательный = рынок падает.const momentum24hPct =  ((preCandles[preCandles.length - 1].close - preCandles[0].open) /    preCandles[0].open) * 100;Logger.log("pre-publication data", { momentum24hPct })

ИИ-агент программирует фильтры, меняя их как код на каждую актуализацию.

const SHORT_MIN_AVG_RANGE_PCT = 0.07;const LONG_MIN_MOMENTUM_24H_PCT = -1;// Фильтр 1: SHORT на "спящем" активе (avgRange < 0.07% за сутки, как TRX) —// тонкая ликвидность, идеальная мишень для stop-hunt. Это случай liquidity// harvesting: следовать сигналу нельзя.if (signal.direction === "short" && avgRangePct < SHORT_MIN_AVG_RANGE_PCT) {  return null;}// Фильтр 2: LONG, когда цена за сутки упала больше чем на 1% — "ловля ножей".// Притока капитала нет, есть падение; подписчиков заводят против тренда.if (signal.direction === "long" && momentum24hPct < LONG_MIN_MOMENTUM_24H_PCT) {  return null;}

Фильтр 1 ловит скам-режим liquidity harvesting (нулевой приток, манипуляция стопами) и говорит «не входи». Фильтр 2 ловит отсутствие фундаментального притока (рынок падает, никакого пампа нет) и тоже говорит «не входи». Остаётся ровно то, ради чего всё затевалось: сигналы, под которыми реальный приток капитала.

Итог

Памп через Telegram — это не баг рынка, который арбитрируется и исчезнет. Это поведение толпы, которое воспроизводится каждый раз, когда у автора есть аудитория. Пока есть подписчики — есть и приток. А значит, есть и фундаментальный фактор, к которому неприменима арифметика равновесия: это игра с растущей суммой.

Спасибо за внимание

ссылка на оригинал статьи https://habr.com/ru/articles/1041898/