[TOC]

Polymarket ist ein Prognosemarkt, bei dem jede Frage nur zwei mögliche Ergebnisse hat – ja oder nein, steigend oder fallend, gewinnend oder verlierend. Am Beispiel des 15-Minuten-Preisänderungs-Kontrakts für Bitcoin sieht jede Runde folgendermaßen aus:Up Und DownZwei Verträge, bei denen darauf gewettet wird, ob der Schlusskurs von Bitcoin innerhalb von 15 Minuten höher oder niedriger als der Eröffnungskurs sein wird. Eine richtige Wette bringt 1 US-Dollar ein, eine falsche Wette führt zu keinem Gewinn.

Dieser Markt weist eine ganz besondere Eigenschaft auf:Die Wahrscheinlichkeit für das Eintreten beider Ergebnisse zusammen beträgt 100%, daher sollte die Summe aus dem Preis für „Aufwärts“ und dem Preis für „Abwärts“ theoretisch genau 1 ergeben.
[ \text{Up_price} + \text{Down_price} = 1 \quad \text{(Theoretischer Wert)} ]
Diese Eigenschaft existiert auf normalen Vertragsmärkten nicht und bietet uns daher einen natürlichen Anker der Sicherheit.
Beim quantitativen Handel ging es schon immer um eines: relativ sichere Chancen in einem Markt voller Unsicherheit zu finden.
Die binäre Struktur von Polymarket bietet einen solchen Ankerpunkt:Unabhängig davon, ob der BTC-Kurs in diesen 15 Minuten steigt oder fällt, wird in beiden Fällen unweigerlich eine Auszahlung von 1 US-Dollar erfolgen.Anhand dieses Ankerpunkts müssen wir die Richtung nicht bestimmen; wir müssen lediglich eine Gelegenheit finden, bei der die Gesamtkosten für den Kauf von Up und Down weniger als 1 betragen und der Gewinn garantiert ist.
Das Problem besteht darin, dass die Summe der beiden Preise meist nahe bei 1 liegt, wodurch direkte Arbitragemöglichkeiten schwer zu finden sind. Wo genau liegen also die Möglichkeiten?
Gelegenheiten entstehen durchPreisungleichgewichte aufgrund von Marktüberreaktion。
Stellen Sie sich folgendes Szenario vor: Innerhalb von 15 Minuten stürzt der Bitcoin-Kurs plötzlich rapide ab, was zu Marktpanik und einem massiven Ausverkauf von Up-Kontrakten führt. Der Kurs fällt von 0,5 auf 0,35. Theoretisch sollte Down um denselben Betrag steigen, um den Up fällt, sodass ihre Summe immer 1 ergibt. Der Markt reagiert jedoch unterschiedlich schnell. Up ist bereits stark gefallen, während Down sich noch von 0,5 auf 0,65 bewegt und möglicherweise noch nicht vollständig aufgeholt hat.
In diesem entscheidenden Moment des Übergangs könnte die Summe aus Aufwärts- und Abwärtsbewegung nur 0,93 betragen, was zu einem kurzzeitigen Preisungleichgewicht führen würde.
[ \text{Up}(0.35) + \text{Down}(0.58) = 0.93 < 1 ]
Dies ist das Arbitragefenster: eine Kombination, die beim Kauf 0,93 Dollar kostet und zwangsläufig 1 Dollar auszahlt, wobei der Gewinn zum Zeitpunkt des Kaufs festgelegt wird.
Die ursprüngliche Idee stammt vom Twitter-Nutzer @the_smart_ape und ist sehr prägnant, mit nur vier Parametern:
| Parameter | Bedeutung |
|---|---|
SHARES |
Kaufanteil pro Bein |
SUM_TARGET |
Zielpreis für beide Beine zusammen (Obergrenze) |
MOVE_PCT |
Das Ausmaß des Einsturzes |
WINDOW_MIN |
Überwachungsfensterzeit |
Die Ausführungslogik ist wie folgt: Innerhalb des Überwachungsfensters zu Beginn jeder Runde werden die Preise kontinuierlich überwacht. Sobald ein Kurs in eine bestimmte Richtung stark fällt und den Auslöseschwellenwert überschreitet, wird diese Richtung als erste Position gekauft. Anschließend wird abgewartet, bis der Kurs in die entgegengesetzte Richtung wieder fällt. Wenn der kombinierte Preis beider Positionen unter dem Zielpreis liegt, wird die zweite Position gekauft und die Arbitrage abgeschlossen. Abrechnung und Auszahlung erfolgen innerhalb von 15 Minuten.
Dieser Ansatz ist zwar klar und unkompliziert, doch bei direkter Anwendung im Live-Handel stößt er auf mehrere offensichtliche Probleme.
Die ursprüngliche Idee warPassives WartenKaufen Sie den ersten Teil der Position und beobachten Sie, wann der Kurs in die entgegengesetzte Richtung fällt. Kaufen Sie den zweiten Teil erst, wenn der Gesamtkurs beider Positionen unter dem Zielkurs liegt.
Unsere Herangehensweisen an Verbesserungen sind unterschiedlich.Im Moment eines starken Kursverfalls ist die Wahrscheinlichkeit hoch, dass sich die Aufwärts- und Abwärtsindikatoren unterschiedlich schnell bewegen. Wir handeln während dieser Phase der Asynchronität gleichzeitig:
SUM_TARGET - 第一腿价格Durch die Anwendung eines umgekehrten Preislimits können wir den Preis fixieren, bevor der gegenläufige Trend seinen Höhepunkt erreicht.Werden beide Aufträge gleichzeitig erteilt, ist die Arbitragemöglichkeit im Moment der Auftragserteilung gesichert. Anstatt passiv darauf zu warten, dass der Markt die Bedingungen erfüllt, lassen wir den Markt auf uns zukommen.
Die Kerncode-Implementierung sieht wie folgt aus:
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
}
Die ursprüngliche Idee war, dass der zweite Teil schnell abgeschlossen sein würde, aber in der Realität kommt es häufig vor, dass, nachdem der Aufwärtsteil nach unten gedrückt wurde, der Preis des Abwärtsteils nicht wieder nach unten fällt, die Marktstimmung pessimistisch bleibt und der kombinierte Preis beider Teile das Ziel nie erreicht.
Wenn Sie während dieser Zeit eine einseitige Aufwärtsposition halten, kann der Kurs weiter fallen, bis er sich bei Null einpendelt.Es muss ein Stop-Loss-Auftrag erteilt werden.
Wir haben zwei Parameter hinzugefügt:
FLOOR_PRICE(Mindestpreis)Setzen Sie ein absolutes Tief (z. B. 0,05). Fällt der Kurs auf dieses Niveau, deutet dies darauf hin, dass der Markt von einem wahrscheinlichen Verlusttrend ausgeht. Schließen Sie daher eine Verlustbegrenzung und verlassen Sie den Markt.EARLY_TAKE_PROFIT(Vorläufige Gewinnmitnahmequote)Nach dem Kauf des ersten Teils des Kontrakts und falls der Preis auf das Gewinnziel steigt, verkaufen Sie ihn direkt, um den Gewinn zu realisieren, ohne auf den zweiten Teil zu warten.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)
}
}
Die eine garantiert die untere Grenze, die andere legt die obere Grenze fest und begrenzt damit die ursprünglich unbegrenzte einseitige Position.
Der ursprüngliche Ansatz unterschied nicht zwischen Zeit und anderen Faktoren, doch kurz vor der Abrechnungsphase ändert sich dies grundlegend: Die Abrechnung steht unmittelbar bevor, und selbst wenn der Kurs nicht gefallen ist, bleibt keine Zeit zu verlieren. Je näher die Abrechnung rückt, desto drastischer sind in der Regel die Kursschwankungen.
Wir haben hinzugefügtLAST_MIN_S(Der letzte Zeitschwellenwert kann angepasst werden.) Schaltlogik nach Eintritt in die letzte Phase:
LAST_MIN_STOP_LOSS(Stop-Loss-Prozentsatz am Ende der Handelssitzung), Ausstieg zum Marktpreis, wenn der Positionspreis unter die Stop-Loss-Linie fällt.var isLastMin = (remaining <= LAST_MIN_S)
// BOTH_PENDING 状态下
if (isLastMin) {
Log("⏰ 最后1分钟,撤销未成交挂单")
cancelAllPending("最后1分钟")
}
In der Anfangsphase sollte man eine Preiserholung abwarten; in der späteren Phase sollte man einen Preisverfall auf null vermeiden. Diese beiden Logikansätze widersprechen sich nicht.
Polymarket ist ein On-Chain-Marktplatz, und die Übermittlung von Auftragsstatus- und Positionsinformationen kann mitunter langsam sein; es kann mehrere Sekunden dauern, bis nach der Auftragserteilung eine Bestätigung eingeht. Daher beinhaltet die Strategie einen Mechanismus zur Erkennung von Auftragstimeouts und zur Wiederholung von Versuchen.
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)
// ... 继续轮询确认最终状态
}
Gleichzeitig hinzugefügtSLIPPAGEDer Slippage-Parameter erhöht die Wahrscheinlichkeit, dass eine Kauforder ausgeführt wird. Der tatsächliche Orderpreis beim Kauf entspricht dem Zielpreis zuzüglich Slippage.
Polymarket verfügt über einen einzigartigen Mechanismus: Der ausgezahlte Betrag wird nach Vertragsabwicklung nicht automatisch dem Guthaben wieder gutgeschrieben.Die Freigabe von Geldern ist nur durch einen aktiven Aufruf der Redeem API möglich.Wird dieser Schritt versäumt, ist das Geld auf dem Konto in den bereits abgewickelten Positionen gebunden.
Die Strategie initiiert die Rücknahme in Chargen automatisch bei jedem Wechsel, um eine zeitnahe Rückzahlung der Gelder zu gewährleisten.
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
}

Die Strategie umfasst ein Echtzeit-Dashboard, das Kontostand, aktuellen Status, Kursüberwachung und Positionsgewinn/-verlust tabellarisch anzeigt und Ihnen so ermöglicht, den Fortschritt der Strategie während des Live-Handels einfach zu verfolgen. Das Dashboard enthält vier Tabellen:

Live-Handelsbeispiel:
Eine neue Runde beginnt, und die Strategie wird überwacht. Ein Kursrückgang des Down-Kontrakts um 18,60 % (von 0,43 auf 0,35) wurde festgestellt und löste ein Signal aus. Gleichzeitig wurden zwei Limit-Orders platziert: eine Down-Order bei 0,37 und eine Up-Order bei 0,60, insgesamt 0,97, also unter dem Zielpreis. Beide Orders wurden gleichzeitig übermittelt und anschließend ausgeführt. Tatsächlicher durchschnittlicher Ausführungspreis: erste Order 0,34, zweite Order 0,60, tatsächliche Gesamtkosten.0.94Der Gewinn war höher als erwartet, lag aber unter dem vorgegebenen Schwellenwert von 0,97.
Diese Strategie ist konzeptionell relativ solide und kann bei günstigen Marktbedingungen gute Renditen erzielen. Allerdings gibt es drei Schwächen, die offen angesprochen werden müssen:
Mangel 1: Es ist schwierig, Gelegenheiten zum Eröffnen von Positionen zu finden, wenn der Markt stabil ist.Arbitragemöglichkeiten basieren auf einer Überreaktion des Marktes; in einem stabilen Markt ist die Wahrscheinlichkeit eines starken Kursverfalls sehr gering, und die Strategie funktioniert nur isoliert. Eine Erweiterung des Auslösebereichs kann die Anzahl der Möglichkeiten erhöhen, die Qualität der Einstiege jedoch verringern.
Mangel 2: Die Risiken, die mit dem Festhalten an einer einzigen Position einhergehen, lassen sich nur schwer vollständig vermeiden.Nachdem die erste Kursbewegung abgeschlossen ist und der Kurs weiter fällt, anstatt sich zu erholen, wird die zweite Bewegung nicht abgeschlossen und der Kurs fällt weiter, bis er die Stop-Loss-Linie erreicht und ausgelöst wird. Die Festlegung des Stop-Loss-Schwellenwerts ist ein Dilemma: Ist er zu eng, wird er leicht durch normale Kursschwankungen ausgelöst; ist er zu weit gefasst, fallen die Verluste zu hoch aus, falls der Kurs tatsächlich stark fällt.
Fehler 3: Die Schwelle für den kombinierten Zielpreis beider Beine stellt einen Kompromiss dar.Setzt man die Schwelle zu hoch an, erhöht sich zwar die Chancen, die Gewinne fallen aber jedes Mal geringer aus; setzt man sie zu niedrig an, steigen die Gewinne zwar jedes Mal, aber es kann zu langen Wartezeiten auf eine bedeutende Gelegenheit kommen. Es geht also um die Wahl der Strategie: häufiges, kleines Ansammeln oder Festhalten an einer niedrigen Schwelle und Warten auf die eine oder andere große Gelegenheit.
Diese Strategie ist ein Rahmenkonzept, und es gibt drei Richtungen, die es wert sind, eingehend untersucht zu werden:
Option 1: Externe BTC-Preisdaten einbeziehen.Diese Strategie eignet sich besser für Seitwärtsmärkte; in Trendmärkten werden Stop-Loss-Orders häufiger ausgelöst. Sie lässt sich mit Echtzeit-BTC-Kursen von Börsen integrieren, wodurch Positionen bei der Abgrenzung eines klaren Trends pausiert und somit unnötige Verluste reduziert werden können.
Richtung 2: Mathematische Modellierung.„Up“ und „Down“ sind im Wesentlichen zwei binäre Optionen. Im Optionshandel existieren zahlreiche ausgereifte Preismodelle, die die Wahrscheinlichkeit von Arbitragemöglichkeiten und den optimalen Einstiegszeitpunkt theoretisch genauer modellieren können, anstatt sich auf feste Schwellenwerte für willkürliche Entscheidungen zu stützen.
Option 3: Dynamische Parameteranpassung.Aktuell sind alle Parameter fixiert, die Marktvolatilität jedoch schwankt. Die Verwendung derselben Parameter in Phasen hoher und niedriger Volatilität ist eindeutig ungeeignet. Die automatische Anpassung der Parameter an die Marktbedingungen in Echtzeit erhöht die Anpassungsfähigkeit der Strategie erheblich.
Die Kernlogik dieser Strategie – das Aufspüren von Preisungleichgewichten in Binärmärkten – beschränkt sich nicht auf die BTC-Kontrakte von Polymarket. Jeder Markt mit binärer Struktur und kurzfristigen Preisdifferenzen kann genutzt werden, um mit einem ähnlichen Ansatz Chancen zu entdecken. Wir haben diese Idee lediglich in ein funktionierendes System umgesetzt; der wirklich interessante Teil kommt erst noch.
Quellcode der Strategie: Polymarket BTC 15-Minute Two-Legged Hedging Arbitrage Robot (Two-Way Hedging Version)