[TOC]

ポリマーケットは、各質問に「はい」か「いいえ」、「上昇」か「下落」か、「勝ち」か「負け」の2つの結果しか出ない予測市場です。BTCの15分価格変動契約を例に挙げると、各ラウンドは…Up そして Down2つの契約で、BTCの終値が15分以内に始値より高くなるか低くなるかを賭けます。正しく賭ければ1ドル、間違って賭ければ0ドルが支払われます。

この市場には非常に特別な特徴があります:2 つの結果が組み合わされる確率は 100% なので、Up の価格と Down の価格を足すと、理論上はちょうど 1 になるはずです。
[ \text{Up_price} + \text{Down_price} = 1 \quad \text{(理論値)} ]
この特性は通常の契約市場には存在せず、確実性の自然な基盤を与えてくれます。
定量取引の目的は常に 1 つ、不確実性に満ちた市場において比較的確実な機会を見つけることです。
Polymarket のバイナリ構造は、このようなアンカーを提供します。この 15 分間に BTC が上がるか下がるかに関係なく、上昇または下降のどちらかで必ず 1 ドルが支払われます。このアンカー ポイントを使用すると、方向を決定する必要はなく、Up と Down の購入コストの合計が 1 未満で、利益が保証される機会を見つけるだけで済みます。
問題は、ほとんどの場合、2つの価格の合計が1に近づくため、直接的な裁定機会を見つけるのが難しいことです。では、具体的にどこに裁定機会があるのでしょうか?
チャンスは市場の過剰反応による価格の不均衡。
次のようなシナリオを想像してみてください。15分の間にBTC価格が急落し、市場はパニックに陥り、アップ契約の大量売却が発生し、価格は0.5から0.35に下落しました。理論上は、アップがどれだけ下落してもダウンは同額上昇し、両者の合計は常に1になるはずです。しかし、市場の反応速度は異なります。アップはすでに急速に下落していますが、ダウンは0.5から0.65への下落の途中で、完全には追いついていない可能性があります。
この重要な移行の瞬間に、上昇と下降の合計はわずか 0.93 になり、一時的な価格の不均衡が生じる可能性があります。
[ \text{Up}(0.35) + \text{Down}(0.58) = 0.93 < 1 ]
これは裁定取引ウィンドウです。購入コストが 0.93 ドルで、必然的に 1 ドルが支払われ、利益は購入時に決定される組み合わせです。
元のアイデアは Twitter ユーザー @the_smart_ape が考案したもので、非常に簡潔で、パラメータは 4 つだけです。
| パラメータ | 意味 |
|---|---|
SHARES |
レッグごとに株式を購入 |
SUM_TARGET |
両レグの合計目標価格(上限) |
MOVE_PCT |
急落の大きさ |
WINDOW_MIN |
監視ウィンドウ時間 |
執行ロジックは以下のとおりです。各ラウンドの開始時に設定されたモニタリングウィンドウ内で、価格が継続的に監視されます。特定の方向の注文がトリガー閾値を超える急落を示すと、その方向の注文が最初のレッグとして買われます。その後、反対方向の価格が下落するのを待ちます。2つのレッグの合計価格が目標価格を下回ると、2番目のレッグが買われ、裁定取引が終了します。決済と償還は15分以内に完了します。
このアプローチは明確かつ単純ですが、実際の取引に直接適用すると、いくつかの明らかな問題が発生します。
当初のアイデアは受動的な待機最初のレッグを購入し、反対方向の価格が下落するタイミングを見計らいます。2つのレッグの合計価格が目標価格を下回った場合にのみ、2番目のレッグを購入します。
改善に対する私たちのアプローチは異なります。急落の瞬間には、上昇指標と下降指標が異なる速度で動く可能性が高くなります。この非同期期間中は、同時に行動を起こします。
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
}
当初の考えでは、2 番目のレッグはすぐに完了するはずでしたが、現実には、上昇レッグが押し下げられた後、下降レッグの価格が下がらず、市場心理が悲観的なままで、両方のレッグの合計価格が目標に到達しないことがよくあります。
この期間中に片側上昇ポジションを保持している場合、価格はゼロに落ち着くまで下落し続ける可能性があります。ストップロス注文を出す必要があります。
2 つのパラメータを追加しました:
FLOOR_PRICE(最低価格)絶対的な安値(例:0.05)を設定します。保有価格がこの水準まで下落した場合、市場はこの方向性が崩れる可能性が高いと判断したため、損失を抑えて市場から撤退します。EARLY_TAKE_PROFIT(暫定利益確定比率)契約の最初のレグを購入した後、価格が利益目標まで上昇した場合は、2 番目のレグを待たずに、直接売却して利益を得ます。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分钟")
}
初期段階では価格の回復を待ち、後期段階では価格がゼロに下落するのを避けます。この2つのロジックは互いに干渉しません。
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には、契約決済後に支払金額が自動的に残高に戻らないという独自の仕組みがあります。資金は、Redeem API を積極的に呼び出すことによってのみ解放できます。この手順を省略すると、アカウント内の資金はすでに決済済みのポジションでロックされます。
この戦略では、資金のタイムリーな返還を確実にするために、各切り替え時に自動的に一括で償還を開始します。
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
}

この戦略には、口座残高、現在の状況、価格モニタリング、ポジションの損益を表形式で表示するリアルタイムダッシュボードが含まれており、ライブ取引中に戦略の進捗状況を簡単に追跡できます。ダッシュボードには4つの表があります。

ライブ取引の例:
新たなラウンドが始まり、戦略は監視中です。ダウン契約が0.43から0.35へと18.60%下落したことが検出され、シグナルが発動しました。同時に2つの指値注文が出されました。最初のダウン注文は0.37、2番目のアップ注文は0.60で、合計0.97となり、目標価格を下回っています。両方の注文は同時に発注され、その後約定しました。実際の平均約定価格:第1レッグ0.34、第2レッグ0.60、真の総コスト。0.94利益は予想よりも高く、事前に設定された閾値0.97を下回りました。
この戦略はコンセプトとしては比較的健全であり、市場環境が好調であれば良好なリターンを達成できます。しかし、率直に認めなければならない3つの欠点があります。
欠点 1: 市場が安定しているときにポジションを開く機会を見つけるのは困難です。裁定機会は市場の過剰反応に依存します。市場が安定しているときは、急落の可能性は非常に低く、この戦略は単独でしか機能しません。トリガーレンジを広げると機会は増えますが、エントリーの質は低下します。
欠点 2: 単一のポジションを保持することによるリスクを完全に回避することは困難です。最初のレッグが約定した後、価格が回復するどころか下落を続ける場合、2番目のレッグは成立せず、ストップロスラインに達してトリガーされるまで下落を続けます。ストップロスの閾値の設定はジレンマです。狭すぎると通常の変動で簡単にトリガーされてしまいますが、緩すぎると価格が実際に間違った方向に動いた場合に損失が大きくなりすぎます。
欠陥 3: 両方のレッグの合計目標価格のしきい値はトレードオフです。閾値を高く設定しすぎると、機会は増えますが、毎回得られる利益は少なくなります。逆に、閾値を低く設定しすぎると、毎回得られる利益は増えますが、大きな機会を待つ時間が長くなる可能性があります。これは戦略の選択です。つまり、小規模な積み増しを頻繁に行うか、低い閾値を維持して時折訪れる大きな機会を待つかです。
この戦略はフレームワークであり、深く検討する価値のある 3 つの方向性があります。
オプション 1: 外部の BTC 価格データを導入する。この戦略はレンジ相場に適しています。トレンド相場では、ストップロス注文が頻繁に発動されます。取引所のリアルタイムBTC価格と統合することで、明確なトレンドが現れた際にポジションを一時停止し、不要な損失を削減できます。
方向 2: 数学モデリング。上昇と下降は本質的に2つのバイナリオプションです。オプション分野には成熟した価格モデルが数多く存在し、固定された閾値に頼って恣意的な判断を下すのではなく、裁定機会の確率と最適なエントリーポイントを理論的にモデル化することができます。
オプション 3: 動的なパラメータ調整。現在、すべてのパラメータは固定されていますが、市場のボラティリティは変化します。ボラティリティの高い時期と低い時期に同じパラメータセットを使用することは明らかに不適切です。リアルタイムの市場状況に基づいてパラメータを自動調整することで、戦略の適応性が大幅に向上します。
この戦略の核となるロジック、つまりバイナリー市場における価格不均衡の瞬間を見つけることは、PolymarketのBTC契約に限定されるものではありません。バイナリー構造を持ち、短期的な価格差が生じる市場であれば、同様のアプローチを用いて取引機会を発掘することができます。私たちはこのアイデアを実用的なフレームワークに変換しただけであり、真に興味深い部分はまだこれからです。