[TOC]

Polymarket — это рынок прогнозов, где у каждого вопроса всего два исхода: да или нет, рост или падение, выигрыш или проигрыш. Взяв в качестве примера контракт на изменение цены BTC за 15 минут, каждый раунд имеет…Up и DownДва контракта, ставки на то, будет ли цена закрытия BTC выше или ниже цены открытия в течение 15 минут. За правильную ставку выплачивается 1 доллар, за неправильную — ноль.

Этот рынок обладает очень специфической особенностью:Суммарная вероятность двух исходов составляет 100%, поэтому цена «Вверх» плюс цена «Вниз» теоретически должны равняться ровно 1.
[ \text{Up_price} + \text{Down_price} = 1 \quad \text{(Теоретическое значение)} ]
Данная недвижимость не представлена на обычных рынках договоров, что дает нам естественную гарантию надежности.
Количественная торговля всегда сводилась к одному: поиску относительно надежных возможностей на рынке, полном неопределенности.
Бинарная структура Polymarket обеспечивает такую опору:Независимо от того, вырастет или упадет BTC за эти 15 минут, в любом случае, независимо от того, вырастет цена или упадет, игрок неизбежно получит 1 доллар.Используя эту опорную точку, нам не нужно определять направление; нам нужно лишь найти возможность, где общая стоимость покупки вверх и вниз меньше 1, а прибыль гарантирована.
Проблема в том, что в большинстве случаев сумма двух цен близка к 1, что затрудняет поиск прямых арбитражных возможностей. Так где же именно находятся эти возможности?
Возможность возникает изЦеновые дисбалансы, вызванные чрезмерной реакцией рынка.。
Представьте себе такую ситуацию: за 15 минут цена BTC внезапно резко падает, вызывая панику на рынке и массовую распродажу контрактов Up, при этом цена падает с 0,5 до 0,35. Теоретически, независимо от того, насколько сильно упадет Up, цена Down должна вырасти на ту же величину, их сумма всегда равна 1. Однако рынок реагирует с разной скоростью. Up уже быстро упал, в то время как Down все еще движется от 0,5 до 0,65 и, возможно, еще не догнал его полностью.
В этот решающий момент перехода сумма значений Up и Down может составлять всего 0,93, что приведет к кратковременному ценовому дисбалансу.
[ \text{Up}(0.35) + \text{Down}(0.58) = 0.93 < 1 ]
Это арбитражное окно: комбинация, покупка которой стоит 0,93 доллара, но которая неизбежно принесет 1 доллар прибыли, причем размер прибыли определяется в момент покупки.
Оригинальная идея принадлежит пользователю Twitter @the_smart_ape, и она очень лаконична, содержит всего четыре параметра:
| параметр | значение |
|---|---|
SHARES |
Покупка акций по каждой ветке |
SUM_TARGET |
Целевая цена для обеих частей вместе взятых (верхний предел) |
MOVE_PCT |
Величина падения |
WINDOW_MIN |
Мониторинг временного окна |
Логика исполнения следующая: в течение периода мониторинга в начале каждого раунда цены непрерывно отслеживаются. Как только в определенном направлении происходит резкое падение, превышающее пороговое значение, в этом направлении совершается покупка в качестве первого шага. Затем ожидается снижение цены в противоположном направлении. Когда суммарная цена двух шагов оказывается ниже целевой цены, совершается покупка второго шага, и арбитраж закрывается. Расчеты и погашение завершаются в течение 15 минут.
Этот подход прост и понятен, но при непосредственном применении к реальной торговле он столкнется с рядом очевидных проблем.
Первоначальная идея заключалась в следующем:Пассивное ожиданиеПокупайте первую часть, затем наблюдайте, когда цена в противоположном направлении снова упадет. Покупайте вторую часть только тогда, когда суммарная цена обеих частей окажется ниже целевой цены.
Наши подходы к совершенствованию различны.В момент резкого падения существует высокая вероятность того, что индикаторы «Вверх» и «Вниз» будут двигаться с разной скоростью. В этот период асинхронности мы действуем одновременно:
SUM_TARGET - 第一腿价格Применив обратный ценовой лимит, мы можем зафиксировать цену до того, как противоположный тренд достигнет своего пика.Когда оба ордера подаются одновременно, арбитражная возможность фиксируется в момент размещения ордера. Вместо пассивного ожидания, пока рынок выполнит условия, мы позволяем рынку самому к нам прийти.
Основной код реализован следующим образом:
function executeBothLegs(symbols, dumpSide, dumpAsk) {
var leg1Symbol = (dumpSide === "Up") ? symbols.up : symbols.down
var leg2Symbol = (dumpSide === "Up") ? symbols.down : symbols.up
leg1Price = _N(dumpAsk + SLIPPAGE, 4)
// 第二腿限价:SUM_TARGET - leg1Price,确保两腿合计 <= SUM_TARGET 即有利润
leg2Price = _N(SUM_TARGET - leg1Price, 4)
// 并发提交两个限价单
var goLeg1 = exchange.Go("CreateOrder", leg1Symbol, "buy", leg1Price, SHARES)
var goLeg2 = exchange.Go("CreateOrder", leg2Symbol, "buy", leg2Price, SHARES)
var id1 = goLeg1.wait()
var id2 = goLeg2.wait()
leg1OrderId = id1
leg2OrderId = id2
state = STATE.BOTH_PENDING
}
Первоначальная идея заключалась в том, что второй этап будет завершен быстро, но в реальности часто случается так, что после того, как восходящий этап смещается вниз, цена нисходящего этапа не падает обратно, рыночные настроения остаются пессимистичными, и суммарная цена обоих этапов никогда не достигает целевого уровня.
В течение этого периода, если вы удерживаете позицию с односторонним ростом, цена может продолжать падать, пока не стабилизируется на нулевом уровне.Необходимо разместить ордер стоп-лосс.
Мы добавили два параметра:
FLOOR_PRICE(Минимальная цена)Установите абсолютный минимум (например, 0,05). Если цена актива упадет до этого уровня, это означает, что рынок определил, что это направление, вероятно, будет неблагоприятным, поэтому зафиксируйте убыток и выйдите из рынка.EARLY_TAKE_PROFIT(Предварительное соотношение фиксации прибыли)После покупки первой части контракта, если цена поднимется до целевого уровня прибыли, продайте ее напрямую, чтобы получить прибыль, не дожидаясь второй части.function handleLeg1OnlyRisk(symbols, upBid, downBid, isLastMin) {
var holdBid = (leg1Side === "Up") ? upBid : downBid
var profitLine = leg1EntryAsk * (1 + EARLY_TAKE_PROFIT)
var stopLine = leg1EntryAsk * (1 - LAST_MIN_STOP_LOSS)
var needClose = false
var reason = ""
if (holdBid <= FLOOR_PRICE) {
needClose = true; reason = "止损(保底)"
} else if (!isLastMin && holdBid >= profitLine) {
needClose = true; reason = "前期止盈"
} else if (isLastMin && holdBid <= stopLine) {
needClose = true; reason = "末段止损"
}
if (needClose) {
// 先撤对侧挂单,再平仓
cancelAndConfirmUntilClear(leg2OrderId)
closePosition(holdSymbol, holdBid, reason)
}
}
Один гарантирует нижний предел, а другой фиксирует верхний предел, тем самым устанавливая границу для изначально неограниченной односторонней позиции.
Первоначальный подход не учитывал временной аспект, но ситуация кардинально меняется, когда приближается этап расчетов: расчеты наступают скоро, и ждать уже некогда, даже если цена еще не упала. Более того, чем ближе к расчетам, тем резче, как правило, становятся колебания цен.
Мы добавилиLAST_MIN_S(Пороговое значение времени можно скорректировать.) Логика переключения после перехода к заключительному этапу:
LAST_MIN_STOP_LOSS(Процент стоп-лосса в конце торговой сессии) Если цена упадет ниже уровня стоп-лосса, выход по рыночной цене.var isLastMin = (remaining <= LAST_MIN_S)
// BOTH_PENDING 状态下
if (isLastMin) {
Log("⏰ 最后1分钟,撤销未成交挂单")
cancelAllPending("最后1分钟")
}
На начальных этапах следует дождаться восстановления цен; на более поздних этапах — избегать падения цен до нуля. Эти два подхода не противоречат друг другу.
Polymarket — это онлайн-рынок, и получение информации о статусе и позиции ордера иногда может быть медленным; подтверждение после размещения ордера может занять несколько секунд. Поэтому стратегия включает механизм обнаружения таймаута ордера и повторной попытки его размещения.
function placeOrderAndConfirm(symbol, side, price, amount) {
var orderId = exchange.CreateOrder(symbol, side, orderPrice, amount)
var deadline = Date.now() + ORDER_TIMEOUT_S * 1000
while (Date.now() < deadline) {
var order = exchange.GetOrder(orderId)
if (order && order.Status === 1) {
return { orderId: orderId, avgPrice: order.AvgPrice } // 成交
}
if (order && (order.Status === 2 || order.Status === 4)) {
return { orderId: orderId, avgPrice: null } // 已撤销
}
Sleep(1000)
}
// 超时后执行撤单
exchange.CancelOrder(orderId)
// ... 继续轮询确认最终状态
}
Одновременно добавилSLIPPAGEПараметр «проскальзывание» увеличивает вероятность исполнения ордера на покупку. Фактическая цена ордера при покупке равна целевой цене плюс проскальзывание.
Polymarket использует уникальный механизм: выплаченная сумма не возвращается автоматически на баланс после расчёта по контракту.Средства могут быть разблокированы только путем активного вызова API Redeem.Если этот шаг будет пропущен, средства на счете будут заблокированы в уже закрытых позициях.
Стратегия автоматически инициирует вывод средств партиями при каждом переключении, чтобы обеспечить своевременный возврат средств.
function doRedeem() {
var positions = exchange.GetPositions()
for (var i = 0; i < positions.length; i++) {
var pos = positions[i]
if (pos.Info && pos.Info.redeemable) {
var result = exchange.IO("redeem", pos.Symbol, true)
Log("Redeem 结果:", result)
}
}
}
// 每轮结算前(840s 后)自动触发
if (!redeemDone && elapsed >= 840) {
doRedeem()
redeemDone = true
}

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

Пример реальной торговли:
Начинается новый раунд, и стратегия находится под наблюдением. Зафиксировано падение контракта Down на 18,60%, с 0,43 до 0,35, что вызвало сигнал. Одновременно были размещены два лимитных ордера: первый ордер Down на уровне 0,37, и второй ордер Up на уровне 0,60, в сумме 0,97, ниже целевой цены. Оба ордера были поданы одновременно и впоследствии исполнены. Фактическая средняя цена исполнения: первая часть 0,34, вторая часть 0,60, истинная общая стоимость.0.94Прибыль оказалась выше ожидаемой, но ниже установленного порога в 0,97.
Эта стратегия относительно обоснована по своей концепции и может принести хорошую прибыль при благоприятных рыночных условиях. Однако следует откровенно признать три недостатка:
Недостаток 1: В условиях стабильного рынка сложно найти возможности для открытия позиций.Арбитражные возможности основаны на чрезмерной реакции рынка; когда рынок стабилен, вероятность резкого падения очень низка, и стратегия может работать только изолированно. Расширение диапазона срабатывания может увеличить возможности, но качество точек входа снизится.
Недостаток 2: Риски, связанные с удержанием одной позиции, трудно полностью избежать.После исполнения первого стоп-лосса, если цена продолжит падать вместо восстановления, второй стоп-лосс никогда не будет исполнен и будет продолжать падать до тех пор, пока не достигнет линии стоп-лосса и не сработает. Установка порогового значения стоп-лосса — это дилемма: слишком узкий порог приведет к легкому срабатыванию стоп-лосса при обычных колебаниях; слишком свободный — к слишком большим убыткам, если цена действительно пойдет не так.
Недостаток 3: Пороговое значение для совокупной целевой цены обеих составляющих представляет собой компромисс.Слишком высокая установка порогового значения увеличивает возможности, но каждый раз приносит меньшую прибыль; слишком низкая установка увеличивает прибыль каждый раз, но может привести к длительному ожиданию значимой возможности. Это выбор стратегии: частое накопление небольших сумм или удержание низкого порогового значения и ожидание случайных крупных возможностей.
Эта стратегия представляет собой общую концепцию, и есть три направления, которые заслуживают более подробного изучения:
Вариант 1: Использовать внешние данные о цене BTC.Эта стратегия лучше подходит для рынков с ограниченным диапазоном движения цен; на трендовых рынках стоп-лосс ордера будут срабатывать часто. Она может быть интегрирована с ценами BTC в реальном времени с бирж, что позволяет приостанавливать открытие позиций при появлении четкого тренда, тем самым снижая ненужные потери.
Направление 2: Математическое моделирование.«Вверх» и «Вниз» — это, по сути, два бинарных варианта. В сфере опционов существует множество зрелых моделей ценообразования, которые теоретически могут более точно моделировать вероятность арбитражных окон и оптимальную точку входа, чем полагаться на фиксированные пороговые значения для принятия произвольных решений.
Вариант 3: Динамическая настройка параметров.В настоящее время все параметры фиксированы, но волатильность рынка меняется. Использование одного и того же набора параметров в периоды высокой и низкой волатильности явно нецелесообразно. Автоматическая корректировка параметров на основе рыночных условий в реальном времени значительно повышает адаптивность стратегии.
Основная логика этой стратегии — поиск моментов ценового дисбаланса на бинарных рынках — не ограничивается контрактами BTC от Polymarket. Любой рынок с бинарной структурой и краткосрочными ценовыми расхождениями может быть использован для выявления возможностей с помощью аналогичного подхода. Мы просто преобразовали эту идею в работающую модель; самое интересное еще впереди.
Исходный код стратегии: Робот для хеджирования и арбитража BTC Polymarket с 15-минутной разверткой и двусторонним управлением (версия для двустороннего хеджирования)