@catalyst-team/poly-sdk 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.en.md +8 -44
- package/README.md +5 -3
- package/README.zh-CN.md +502 -0
- package/dist/__tests__/clob-api.test.d.ts +5 -0
- package/dist/__tests__/clob-api.test.d.ts.map +1 -0
- package/dist/__tests__/clob-api.test.js +240 -0
- package/dist/__tests__/clob-api.test.js.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts +11 -0
- package/dist/__tests__/integration/bridge-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js +260 -0
- package/dist/__tests__/integration/bridge-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts +13 -0
- package/dist/__tests__/integration/clob-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/clob-api.integration.test.js +170 -0
- package/dist/__tests__/integration/clob-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts +17 -0
- package/dist/__tests__/integration/ctf-client.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js +234 -0
- package/dist/__tests__/integration/ctf-client.integration.test.js.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/data-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/data-api.integration.test.js +161 -0
- package/dist/__tests__/integration/data-api.integration.test.js.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts +9 -0
- package/dist/__tests__/integration/gamma-api.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js +170 -0
- package/dist/__tests__/integration/gamma-api.integration.test.js.map +1 -0
- package/dist/__tests__/test-utils.d.ts +92 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/__tests__/test-utils.js +143 -0
- package/dist/__tests__/test-utils.js.map +1 -0
- package/dist/clients/bridge-client.d.ts +388 -0
- package/dist/clients/bridge-client.d.ts.map +1 -0
- package/dist/clients/bridge-client.js +587 -0
- package/dist/clients/bridge-client.js.map +1 -0
- package/dist/clients/clob-api.d.ts +318 -0
- package/dist/clients/clob-api.d.ts.map +1 -0
- package/dist/clients/clob-api.js +388 -0
- package/dist/clients/clob-api.js.map +1 -0
- package/dist/clients/ctf-client.d.ts +473 -0
- package/dist/clients/ctf-client.d.ts.map +1 -0
- package/dist/clients/ctf-client.js +915 -0
- package/dist/clients/ctf-client.js.map +1 -0
- package/dist/clients/data-api.d.ts +134 -0
- package/dist/clients/data-api.d.ts.map +1 -0
- package/dist/clients/data-api.js +265 -0
- package/dist/clients/data-api.js.map +1 -0
- package/dist/clients/gamma-api.d.ts +401 -0
- package/dist/clients/gamma-api.d.ts.map +1 -0
- package/dist/clients/gamma-api.js +352 -0
- package/dist/clients/gamma-api.js.map +1 -0
- package/dist/clients/trading-client.d.ts +252 -0
- package/dist/clients/trading-client.d.ts.map +1 -0
- package/dist/clients/trading-client.js +543 -0
- package/dist/clients/trading-client.js.map +1 -0
- package/dist/clients/websocket-manager.d.ts +100 -0
- package/dist/clients/websocket-manager.d.ts.map +1 -0
- package/dist/clients/websocket-manager.js +193 -0
- package/dist/clients/websocket-manager.js.map +1 -0
- package/dist/core/cache-adapter-bridge.d.ts +36 -0
- package/dist/core/cache-adapter-bridge.d.ts.map +1 -0
- package/dist/core/cache-adapter-bridge.js +81 -0
- package/dist/core/cache-adapter-bridge.js.map +1 -0
- package/dist/core/cache.d.ts +40 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +71 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +38 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +84 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +31 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +70 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/{src/core/types.ts → dist/core/types.d.ts} +169 -215
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/unified-cache.d.ts +63 -0
- package/dist/core/unified-cache.d.ts.map +1 -0
- package/dist/core/unified-cache.js +114 -0
- package/dist/core/unified-cache.js.map +1 -0
- package/dist/index.d.ts +93 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +255 -0
- package/dist/index.js.map +1 -0
- package/dist/services/arbitrage-service.d.ts +408 -0
- package/dist/services/arbitrage-service.d.ts.map +1 -0
- package/dist/services/arbitrage-service.js +1422 -0
- package/dist/services/arbitrage-service.js.map +1 -0
- package/dist/services/authorization-service.d.ts +97 -0
- package/dist/services/authorization-service.d.ts.map +1 -0
- package/dist/services/authorization-service.js +279 -0
- package/dist/services/authorization-service.js.map +1 -0
- package/dist/services/market-service.d.ts +108 -0
- package/dist/services/market-service.d.ts.map +1 -0
- package/dist/services/market-service.js +458 -0
- package/dist/services/market-service.js.map +1 -0
- package/dist/services/realtime-service.d.ts +82 -0
- package/dist/services/realtime-service.d.ts.map +1 -0
- package/dist/services/realtime-service.js +150 -0
- package/dist/services/realtime-service.js.map +1 -0
- package/dist/services/swap-service.d.ts +217 -0
- package/dist/services/swap-service.d.ts.map +1 -0
- package/dist/services/swap-service.js +695 -0
- package/dist/services/swap-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +94 -0
- package/dist/services/wallet-service.d.ts.map +1 -0
- package/dist/services/wallet-service.js +173 -0
- package/dist/services/wallet-service.js.map +1 -0
- package/dist/utils/price-utils.d.ts +153 -0
- package/dist/utils/price-utils.d.ts.map +1 -0
- package/dist/utils/price-utils.js +236 -0
- package/dist/utils/price-utils.js.map +1 -0
- package/package.json +7 -2
- package/docs/00-design.md +0 -760
- package/docs/02-API.md +0 -1148
- package/docs/arb/test-plan.md +0 -387
- package/docs/arb/test-results.md +0 -336
- package/docs/arbitrage.md +0 -754
- package/docs/reports/smart-money-analysis-2025-12-23-cn.md +0 -840
- package/examples/01-basic-usage.ts +0 -68
- package/examples/02-smart-money.ts +0 -95
- package/examples/03-market-analysis.ts +0 -108
- package/examples/04-kline-aggregation.ts +0 -158
- package/examples/05-follow-wallet-strategy.ts +0 -156
- package/examples/06-services-demo.ts +0 -124
- package/examples/07-realtime-websocket.ts +0 -117
- package/examples/08-trading-orders.ts +0 -278
- package/examples/09-rewards-tracking.ts +0 -187
- package/examples/10-ctf-operations.ts +0 -336
- package/examples/11-live-arbitrage-scan.ts +0 -221
- package/examples/12-trending-arb-monitor.ts +0 -406
- package/examples/13-arbitrage-service.ts +0 -211
- package/examples/README.md +0 -179
- package/scripts/README.md +0 -163
- package/scripts/approvals/approve-erc1155.ts +0 -129
- package/scripts/approvals/approve-neg-risk-erc1155.ts +0 -149
- package/scripts/approvals/approve-neg-risk.ts +0 -102
- package/scripts/approvals/check-all-allowances.ts +0 -150
- package/scripts/approvals/check-allowance.ts +0 -129
- package/scripts/approvals/check-ctf-approval.ts +0 -158
- package/scripts/arb/faze-bo3-arb.ts +0 -385
- package/scripts/arb/settle-position.ts +0 -190
- package/scripts/arb/token-rebalancer.ts +0 -420
- package/scripts/arb-tests/01-unit-tests.ts +0 -495
- package/scripts/arb-tests/02-integration-tests.ts +0 -412
- package/scripts/arb-tests/03-e2e-tests.ts +0 -503
- package/scripts/arb-tests/README.md +0 -109
- package/scripts/datas/001-report.md +0 -486
- package/scripts/datas/clone-modal-screenshot.png +0 -0
- package/scripts/deposit/deposit-native-usdc.ts +0 -179
- package/scripts/deposit/deposit-usdc.ts +0 -155
- package/scripts/deposit/swap-usdc-to-usdce.ts +0 -375
- package/scripts/research/research-markets.ts +0 -166
- package/scripts/trading/check-orders.ts +0 -50
- package/scripts/trading/sell-nvidia-positions.ts +0 -206
- package/scripts/trading/test-order.ts +0 -172
- package/scripts/verify/test-approve-trading.ts +0 -98
- package/scripts/verify/test-provider-fix.ts +0 -43
- package/scripts/verify/test-search-mcp.ts +0 -113
- package/scripts/verify/verify-all-apis.ts +0 -160
- package/scripts/wallet/check-wallet-balances.ts +0 -75
- package/scripts/wallet/test-wallet-operations.ts +0 -191
- package/scripts/wallet/verify-wallet-tools.ts +0 -124
- package/src/__tests__/clob-api.test.ts +0 -301
- package/src/__tests__/integration/bridge-client.integration.test.ts +0 -314
- package/src/__tests__/integration/clob-api.integration.test.ts +0 -218
- package/src/__tests__/integration/ctf-client.integration.test.ts +0 -331
- package/src/__tests__/integration/data-api.integration.test.ts +0 -194
- package/src/__tests__/integration/gamma-api.integration.test.ts +0 -206
- package/src/__tests__/test-utils.ts +0 -170
- package/src/clients/bridge-client.ts +0 -841
- package/src/clients/clob-api.ts +0 -629
- package/src/clients/ctf-client.ts +0 -1216
- package/src/clients/data-api.ts +0 -469
- package/src/clients/gamma-api.ts +0 -597
- package/src/clients/trading-client.ts +0 -749
- package/src/clients/websocket-manager.ts +0 -267
- package/src/core/cache-adapter-bridge.ts +0 -94
- package/src/core/cache.ts +0 -85
- package/src/core/errors.ts +0 -117
- package/src/core/rate-limiter.ts +0 -74
- package/src/core/unified-cache.ts +0 -153
- package/src/index.ts +0 -461
- package/src/services/arbitrage-service.ts +0 -1807
- package/src/services/authorization-service.ts +0 -357
- package/src/services/market-service.ts +0 -544
- package/src/services/realtime-service.ts +0 -196
- package/src/services/swap-service.ts +0 -896
- package/src/services/wallet-service.ts +0 -259
- package/src/utils/price-utils.ts +0 -307
- package/tsconfig.json +0 -8
- package/vitest.config.ts +0 -19
- package/vitest.integration.config.ts +0 -18
package/docs/arbitrage.md
DELETED
|
@@ -1,754 +0,0 @@
|
|
|
1
|
-
# Polymarket 订单簿与套利机制详解
|
|
2
|
-
|
|
3
|
-
> **Status**: Production Reference
|
|
4
|
-
> **Last Updated**: 2024-12-07
|
|
5
|
-
|
|
6
|
-
本文档详细解释 Polymarket 订单簿的工作原理,以及如何正确计算套利机会。
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Polymarket 市场结构
|
|
11
|
-
|
|
12
|
-
### 1.1 二元市场 (Binary Market)
|
|
13
|
-
|
|
14
|
-
每个 Polymarket 市场都是一个二元预测市场:
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
市场: "Will Bitcoin reach $100,000 by December 31, 2024?"
|
|
18
|
-
|
|
19
|
-
结果:
|
|
20
|
-
- YES: BTC 达到 $100k → 代币价值 $1
|
|
21
|
-
- NO: BTC 未达到 $100k → 代币价值 $1
|
|
22
|
-
|
|
23
|
-
不变量: YES + NO = $1 (市场结束时,只有一个结果获胜)
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### 1.2 Token 对
|
|
27
|
-
|
|
28
|
-
每个市场有两个 ERC-1155 代币:
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
YES Token (tokenId: 0x123...)
|
|
32
|
-
- 如果结果是 YES,价值 $1
|
|
33
|
-
- 如果结果是 NO,价值 $0
|
|
34
|
-
|
|
35
|
-
NO Token (tokenId: 0x456...)
|
|
36
|
-
- 如果结果是 NO,价值 $1
|
|
37
|
-
- 如果结果是 YES,价值 $0
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 2. 订单簿的镜像特性
|
|
43
|
-
|
|
44
|
-
### 2.1 关键洞察:买 YES = 卖 NO
|
|
45
|
-
|
|
46
|
-
这是理解 Polymarket 订单簿的核心概念:
|
|
47
|
-
|
|
48
|
-
```
|
|
49
|
-
┌────────────────────────────────────────────────────────────────┐
|
|
50
|
-
│ 等价关系 │
|
|
51
|
-
├────────────────────────────────────────────────────────────────┤
|
|
52
|
-
│ │
|
|
53
|
-
│ 买 YES @ $0.40 ≡ 卖 NO @ $0.60 │
|
|
54
|
-
│ 卖 YES @ $0.40 ≡ 买 NO @ $0.60 │
|
|
55
|
-
│ │
|
|
56
|
-
│ 一般形式: │
|
|
57
|
-
│ 买 YES @ P ≡ 卖 NO @ (1-P) │
|
|
58
|
-
│ 卖 YES @ P ≡ 买 NO @ (1-P) │
|
|
59
|
-
│ │
|
|
60
|
-
└────────────────────────────────────────────────────────────────┘
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 2.2 为什么会这样?
|
|
64
|
-
|
|
65
|
-
考虑做市商的视角:
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
做市商持有: 100 YES + 100 NO (通过 Split $100 获得)
|
|
69
|
-
|
|
70
|
-
如果做市商想卖出 1 YES @ $0.40:
|
|
71
|
-
- 他可以直接在 YES 订单簿挂 Ask @ $0.40
|
|
72
|
-
- 或者他可以在 NO 订单簿挂 Bid @ $0.60
|
|
73
|
-
|
|
74
|
-
两种方式对做市商来说是等价的:
|
|
75
|
-
- 卖 YES @ $0.40 → 收到 $0.40
|
|
76
|
-
- 买 NO @ $0.60 (如果对手方想卖 NO @ $0.60)
|
|
77
|
-
→ 做市商支付 $0.60,但现在有了完整的 YES+NO 对
|
|
78
|
-
→ 可以 Merge 获得 $1
|
|
79
|
-
→ 净收益 = $1 - $0.60 = $0.40
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### 2.3 订单簿镜像示例
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
86
|
-
│ 原始订单 │
|
|
87
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
88
|
-
│ │
|
|
89
|
-
│ 用户 A: "我想以 $0.40 买入 100 个 YES" │
|
|
90
|
-
│ 用户 B: "我想以 $0.65 卖出 50 个 YES" │
|
|
91
|
-
│ │
|
|
92
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
93
|
-
│ 这些订单如何显示 │
|
|
94
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
95
|
-
│ │
|
|
96
|
-
│ YES Token 订单簿: NO Token 订单簿: │
|
|
97
|
-
│ │
|
|
98
|
-
│ ┌─────────────────────┐ ┌─────────────────────┐ │
|
|
99
|
-
│ │ Bids │ Asks │ │ Bids │ Asks │ │
|
|
100
|
-
│ ├───────────┼─────────┤ ├───────────┼─────────┤ │
|
|
101
|
-
│ │ 0.40 x100 │ 0.65 x50│ │ 0.35 x50 │ 0.60 x100│ │
|
|
102
|
-
│ │ (用户 A) │ (用户 B) │ │ (用户 B) │ (用户 A) │ │
|
|
103
|
-
│ └───────────┴─────────┘ └───────────┴─────────┘ │
|
|
104
|
-
│ │
|
|
105
|
-
│ 注意: │
|
|
106
|
-
│ - 用户 A 的买 YES 订单,变成了 NO 的卖单 (Ask @ 0.60 = 1 - 0.40) │
|
|
107
|
-
│ - 用户 B 的卖 YES 订单,变成了 NO 的买单 (Bid @ 0.35 = 1 - 0.65) │
|
|
108
|
-
│ │
|
|
109
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## 3. 套利机会分析
|
|
115
|
-
|
|
116
|
-
### 3.1 错误的计算方式
|
|
117
|
-
|
|
118
|
-
之前我们错误地这样计算:
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
// 错误!会导致重复计算
|
|
122
|
-
const askSum = yesAsk + noAsk; // 0.65 + 0.60 = 1.25
|
|
123
|
-
const bidSum = yesBid + noBid; // 0.40 + 0.35 = 0.75
|
|
124
|
-
|
|
125
|
-
// 这些数字没有意义,因为同一订单被算了两次
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### 3.2 正确的计算方式
|
|
129
|
-
|
|
130
|
-
实际可执行的交易成本:
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
134
|
-
│ 正确的套利计算 │
|
|
135
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
136
|
-
│ │
|
|
137
|
-
│ 目标: 买入 1 YES + 1 NO (用于 Merge 获得 $1) │
|
|
138
|
-
│ │
|
|
139
|
-
│ 买 YES 的成本: │
|
|
140
|
-
│ 方式 1: 直接买 YES @ YES.ask = $0.65 │
|
|
141
|
-
│ 方式 2: 通过卖 NO 获得 (成本 = 1 - NO.bid = 1 - 0.35 = $0.65) │
|
|
142
|
-
│ 最低成本 = min(0.65, 0.65) = $0.65 │
|
|
143
|
-
│ │
|
|
144
|
-
│ 买 NO 的成本: │
|
|
145
|
-
│ 方式 1: 直接买 NO @ NO.ask = $0.60 │
|
|
146
|
-
│ 方式 2: 通过卖 YES 获得 (成本 = 1 - YES.bid = 1 - 0.40 = $0.60) │
|
|
147
|
-
│ 最低成本 = min(0.60, 0.60) = $0.60 │
|
|
148
|
-
│ │
|
|
149
|
-
│ 总成本 = $0.65 + $0.60 = $1.25 │
|
|
150
|
-
│ Merge 收益 = $1.00 │
|
|
151
|
-
│ 利润 = $1.00 - $1.25 = -$0.25 (没有套利机会) │
|
|
152
|
-
│ │
|
|
153
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### 3.3 套利的真正公式
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
Long Arbitrage (买双边 + Merge):
|
|
160
|
-
有效买 YES 成本 = min(YES.ask, 1 - NO.bid)
|
|
161
|
-
有效买 NO 成本 = min(NO.ask, 1 - YES.bid)
|
|
162
|
-
总成本 = 有效买 YES + 有效买 NO
|
|
163
|
-
利润 = 1 - 总成本
|
|
164
|
-
|
|
165
|
-
当 总成本 < 1 时,存在套利机会
|
|
166
|
-
|
|
167
|
-
Short Arbitrage (Split + 卖双边):
|
|
168
|
-
有效卖 YES 收入 = max(YES.bid, 1 - NO.ask)
|
|
169
|
-
有效卖 NO 收入 = max(NO.bid, 1 - YES.ask)
|
|
170
|
-
总收入 = 有效卖 YES + 有效卖 NO
|
|
171
|
-
利润 = 总收入 - 1
|
|
172
|
-
|
|
173
|
-
当 总收入 > 1 时,存在套利机会
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### 3.4 简化公式(利用镜像特性)
|
|
177
|
-
|
|
178
|
-
由于 YES.ask = 1 - NO.bid 和 NO.ask = 1 - YES.bid(在理想情况下):
|
|
179
|
-
|
|
180
|
-
```
|
|
181
|
-
实际上,我们只需要看一个 token 的 spread:
|
|
182
|
-
|
|
183
|
-
YES Spread = YES.ask - YES.bid
|
|
184
|
-
|
|
185
|
-
Long Arb 成本 = YES.ask + (1 - YES.bid) = 1 + YES.spread
|
|
186
|
-
Short Arb 收入 = YES.bid + (1 - YES.ask) = 1 - YES.spread
|
|
187
|
-
|
|
188
|
-
因此:
|
|
189
|
-
Long Arb 利润 = 1 - (1 + spread) = -spread
|
|
190
|
-
Short Arb 利润 = (1 - spread) - 1 = -spread
|
|
191
|
-
|
|
192
|
-
结论: 在正常市场中,spread > 0,所以没有套利机会
|
|
193
|
-
只有当出现定价错误(spread < 0 或跨市场价格不一致)时才有套利
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## 4. 真正的套利场景
|
|
199
|
-
|
|
200
|
-
### 4.1 场景 1: 订单簿错配
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
204
|
-
│ 订单簿错配套利 │
|
|
205
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
206
|
-
│ │
|
|
207
|
-
│ YES 订单簿: NO 订单簿: │
|
|
208
|
-
│ ┌───────────┬─────────┐ ┌───────────┬─────────┐ │
|
|
209
|
-
│ │ Bid │ Ask │ │ Bid │ Ask │ │
|
|
210
|
-
│ ├───────────┼─────────┤ ├───────────┼─────────┤ │
|
|
211
|
-
│ │ 0.52 │ 0.53 │ │ 0.49 │ 0.50 │ │
|
|
212
|
-
│ └───────────┴─────────┘ └───────────┴─────────┘ │
|
|
213
|
-
│ │
|
|
214
|
-
│ 检测: │
|
|
215
|
-
│ YES.ask + NO.ask = 0.53 + 0.50 = 1.03 (> 1, 没有 Long Arb) │
|
|
216
|
-
│ YES.bid + NO.bid = 0.52 + 0.49 = 1.01 (> 1, 有 Short Arb!) │
|
|
217
|
-
│ │
|
|
218
|
-
│ 但等等!我们需要检查真实可执行价格: │
|
|
219
|
-
│ 真实卖 YES = max(YES.bid, 1 - NO.ask) = max(0.52, 0.50) = 0.52 │
|
|
220
|
-
│ 真实卖 NO = max(NO.bid, 1 - YES.ask) = max(0.49, 0.47) = 0.49 │
|
|
221
|
-
│ 总收入 = 0.52 + 0.49 = 1.01 > 1.00 │
|
|
222
|
-
│ │
|
|
223
|
-
│ 策略: │
|
|
224
|
-
│ 1. Split $1000 → 1000 YES + 1000 NO │
|
|
225
|
-
│ 2. Sell YES @ 0.52 → $520 │
|
|
226
|
-
│ 3. Sell NO @ 0.49 → $490 │
|
|
227
|
-
│ 4. Total = $1010, Profit = $10 (1%) │
|
|
228
|
-
│ │
|
|
229
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### 4.2 场景 2: 跨市场套利(多结果市场)
|
|
233
|
-
|
|
234
|
-
```
|
|
235
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
236
|
-
│ 多结果市场套利 │
|
|
237
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
238
|
-
│ │
|
|
239
|
-
│ 市场: "2024 美国总统大选赢家?" │
|
|
240
|
-
│ │
|
|
241
|
-
│ 结果 A: Trump @ $0.55 │
|
|
242
|
-
│ 结果 B: Biden @ $0.30 │
|
|
243
|
-
│ 结果 C: Harris @ $0.20 │
|
|
244
|
-
│ 结果 D: Other @ $0.02 │
|
|
245
|
-
│ ───────────────────────── │
|
|
246
|
-
│ 总和 = $1.07 (> $1.00) │
|
|
247
|
-
│ │
|
|
248
|
-
│ 这种情况下可以 Short Arb: │
|
|
249
|
-
│ Split $100 → 100 份每个结果 │
|
|
250
|
-
│ 卖出全部 → $107 │
|
|
251
|
-
│ 利润 = $7 (7%) │
|
|
252
|
-
│ │
|
|
253
|
-
│ 注意: 这需要多结果市场支持,不适用于简单的 YES/NO 市场 │
|
|
254
|
-
│ │
|
|
255
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
## 5. 实现代码
|
|
261
|
-
|
|
262
|
-
### 5.1 正确的套利检测
|
|
263
|
-
|
|
264
|
-
```typescript
|
|
265
|
-
/**
|
|
266
|
-
* 计算有效的买入/卖出价格
|
|
267
|
-
* 考虑镜像订单的影响
|
|
268
|
-
*/
|
|
269
|
-
export function getEffectivePrices(
|
|
270
|
-
yesAsk: number,
|
|
271
|
-
yesBid: number,
|
|
272
|
-
noAsk: number,
|
|
273
|
-
noBid: number
|
|
274
|
-
): {
|
|
275
|
-
effectiveBuyYes: number; // 买 YES 的最低成本
|
|
276
|
-
effectiveBuyNo: number; // 买 NO 的最低成本
|
|
277
|
-
effectiveSellYes: number; // 卖 YES 的最高收入
|
|
278
|
-
effectiveSellNo: number; // 卖 NO 的最高收入
|
|
279
|
-
} {
|
|
280
|
-
return {
|
|
281
|
-
// 买 YES: 直接买 YES.ask 或者 通过卖 NO (成本 = 1 - NO.bid)
|
|
282
|
-
effectiveBuyYes: Math.min(yesAsk, 1 - noBid),
|
|
283
|
-
|
|
284
|
-
// 买 NO: 直接买 NO.ask 或者 通过卖 YES (成本 = 1 - YES.bid)
|
|
285
|
-
effectiveBuyNo: Math.min(noAsk, 1 - yesBid),
|
|
286
|
-
|
|
287
|
-
// 卖 YES: 直接卖 YES.bid 或者 通过买 NO (收入 = 1 - NO.ask)
|
|
288
|
-
effectiveSellYes: Math.max(yesBid, 1 - noAsk),
|
|
289
|
-
|
|
290
|
-
// 卖 NO: 直接卖 NO.bid 或者 通过买 YES (收入 = 1 - YES.ask)
|
|
291
|
-
effectiveSellNo: Math.max(noBid, 1 - yesAsk),
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* 检测套利机会
|
|
297
|
-
*/
|
|
298
|
-
export function checkArbitrage(
|
|
299
|
-
yesAsk: number,
|
|
300
|
-
yesBid: number,
|
|
301
|
-
noAsk: number,
|
|
302
|
-
noBid: number
|
|
303
|
-
): ArbitrageOpportunity | null {
|
|
304
|
-
const effective = getEffectivePrices(yesAsk, yesBid, noAsk, noBid);
|
|
305
|
-
|
|
306
|
-
// Long Arb: 买双边 + Merge
|
|
307
|
-
const longCost = effective.effectiveBuyYes + effective.effectiveBuyNo;
|
|
308
|
-
const longProfit = 1 - longCost;
|
|
309
|
-
|
|
310
|
-
// Short Arb: Split + 卖双边
|
|
311
|
-
const shortRevenue = effective.effectiveSellYes + effective.effectiveSellNo;
|
|
312
|
-
const shortProfit = shortRevenue - 1;
|
|
313
|
-
|
|
314
|
-
if (longProfit > 0) {
|
|
315
|
-
return {
|
|
316
|
-
type: 'long',
|
|
317
|
-
profit: longProfit,
|
|
318
|
-
description: `Buy YES @ ${effective.effectiveBuyYes.toFixed(4)} + NO @ ${effective.effectiveBuyNo.toFixed(4)}, Merge for $1`,
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
if (shortProfit > 0) {
|
|
323
|
-
return {
|
|
324
|
-
type: 'short',
|
|
325
|
-
profit: shortProfit,
|
|
326
|
-
description: `Split $1, Sell YES @ ${effective.effectiveSellYes.toFixed(4)} + NO @ ${effective.effectiveSellNo.toFixed(4)}`,
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
return null;
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## 6. 实际市场观察
|
|
337
|
-
|
|
338
|
-
### 6.1 为什么大多数时候没有套利?
|
|
339
|
-
|
|
340
|
-
```
|
|
341
|
-
市场效率:
|
|
342
|
-
- 做市商会主动消除价差
|
|
343
|
-
- 套利机器人在毫秒级别执行
|
|
344
|
-
- Gas 成本 (~$0.01-0.05) 吃掉小利润
|
|
345
|
-
|
|
346
|
-
典型观察:
|
|
347
|
-
- YES.ask ≈ 1 - NO.bid (镜像关系成立)
|
|
348
|
-
- Spread ≈ 0.5% - 2%
|
|
349
|
-
- 套利空间 ≈ -spread (负数,无利可图)
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
### 6.2 什么时候会有套利?
|
|
353
|
-
|
|
354
|
-
```
|
|
355
|
-
1. 市场剧烈波动时
|
|
356
|
-
- 新闻事件导致价格快速变化
|
|
357
|
-
- 订单簿来不及完全调整
|
|
358
|
-
|
|
359
|
-
2. 低流动性市场
|
|
360
|
-
- 订单簿深度不足
|
|
361
|
-
- 大单冲击导致价格偏离
|
|
362
|
-
|
|
363
|
-
3. 系统延迟
|
|
364
|
-
- 不同交易者的延迟差异
|
|
365
|
-
- 链上确认时间差
|
|
366
|
-
|
|
367
|
-
4. 新市场上线
|
|
368
|
-
- 初始定价可能不准确
|
|
369
|
-
- 套利者尚未入场
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
## 7. 总结
|
|
375
|
-
|
|
376
|
-
### 核心要点
|
|
377
|
-
|
|
378
|
-
1. **镜像订单**: 每个订单同时出现在 YES 和 NO 订单簿中
|
|
379
|
-
2. **等价关系**: 买 YES @ P = 卖 NO @ (1-P)
|
|
380
|
-
3. **有效价格**: 计算套利时要用 min/max 取最优价格
|
|
381
|
-
4. **Spread = 成本**: 在正常市场中,spread 就是交易成本
|
|
382
|
-
5. **市场效率**: 大多数时候不存在无风险套利
|
|
383
|
-
|
|
384
|
-
### 代码检查清单
|
|
385
|
-
|
|
386
|
-
- [ ] 使用 `getEffectivePrices()` 而不是直接相加
|
|
387
|
-
- [ ] Long Arb 利润 = 1 - (effectiveBuyYes + effectiveBuyNo)
|
|
388
|
-
- [ ] Short Arb 利润 = (effectiveSellYes + effectiveSellNo) - 1
|
|
389
|
-
- [ ] 考虑 Gas 成本对净利润的影响
|
|
390
|
-
- [ ] 考虑滑点(使用 2-3 档深度计算)
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## 8. CTF 合约架构:两种市场类型
|
|
395
|
-
|
|
396
|
-
Polymarket 使用 **两种不同的 CTF (Conditional Token Framework) 合约**,理解它们的区别对于套利策略至关重要。
|
|
397
|
-
|
|
398
|
-
### 8.1 标准 CTF 合约 (Standard Binary Markets)
|
|
399
|
-
|
|
400
|
-
```
|
|
401
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
402
|
-
│ 标准 CTF 合约 │
|
|
403
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
404
|
-
│ │
|
|
405
|
-
│ 合约地址: 0x4D97DCd97eC945f40cF65F87097ACe5EA0476045 │
|
|
406
|
-
│ │
|
|
407
|
-
│ 用途: 简单的二元市场 (Yes/No) │
|
|
408
|
-
│ │
|
|
409
|
-
│ 操作: │
|
|
410
|
-
│ - Split: USDC → YES + NO token │
|
|
411
|
-
│ - Merge: YES + NO → USDC │
|
|
412
|
-
│ - Redeem: Winning tokens → USDC (市场结算后) │
|
|
413
|
-
│ │
|
|
414
|
-
│ 特点: │
|
|
415
|
-
│ - 每个市场独立 │
|
|
416
|
-
│ - YES + NO 代币只在同一市场内有意义 │
|
|
417
|
-
│ - 适用于大多数简单预测市场 │
|
|
418
|
-
│ │
|
|
419
|
-
│ 示例市场: │
|
|
420
|
-
│ - "BTC 年底前会达到 $100k 吗?" │
|
|
421
|
-
│ - "Fed 会在下次会议降息吗?" │
|
|
422
|
-
│ │
|
|
423
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
### 8.2 NegRisk CTF 合约 (Winner-Take-All Events)
|
|
427
|
-
|
|
428
|
-
```
|
|
429
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
430
|
-
│ NegRisk CTF 系统 │
|
|
431
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
432
|
-
│ │
|
|
433
|
-
│ CTF 合约: 0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E │
|
|
434
|
-
│ CTF 交易所: 0xC5d563A36AE78145C45a50134d48A1215220f80a │
|
|
435
|
-
│ Neg Adapter: 0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296 │
|
|
436
|
-
│ │
|
|
437
|
-
│ 用途: "Winner-Take-All" 多结果事件 │
|
|
438
|
-
│ │
|
|
439
|
-
│ 关键创新: │
|
|
440
|
-
│ ┌──────────────────────────────────────────────────────────────┐ │
|
|
441
|
-
│ │ NO share 可以转换为其他所有市场的 YES share! │ │
|
|
442
|
-
│ └──────────────────────────────────────────────────────────────┘ │
|
|
443
|
-
│ │
|
|
444
|
-
│ 示例: 2024 美国总统大选 │
|
|
445
|
-
│ │
|
|
446
|
-
│ Market A: "Trump 赢?" → 持有 Trump NO │
|
|
447
|
-
│ Market B: "Harris 赢?" │
|
|
448
|
-
│ Market C: "Biden 赢?" │
|
|
449
|
-
│ │
|
|
450
|
-
│ 通过 NegRisk Adapter: │
|
|
451
|
-
│ Trump NO → Harris YES + Biden YES + ... │
|
|
452
|
-
│ │
|
|
453
|
-
│ 这意味着: 买 Trump NO = 押注 "任何其他人赢" │
|
|
454
|
-
│ │
|
|
455
|
-
│ 资本效率优势: │
|
|
456
|
-
│ - 不需要在每个候选人市场都买 YES │
|
|
457
|
-
│ - 只需买一个候选人的 NO,就等于投资了所有其他人 │
|
|
458
|
-
│ │
|
|
459
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
### 8.3 如何判断市场类型?
|
|
463
|
-
|
|
464
|
-
```typescript
|
|
465
|
-
// 通过 Gamma API 获取市场信息
|
|
466
|
-
const market = await gammaApi.getMarketByConditionId(conditionId);
|
|
467
|
-
|
|
468
|
-
// 检查是否是 NegRisk 市场
|
|
469
|
-
if (market.negRisk === true) {
|
|
470
|
-
// 使用 NegRisk CTF 合约
|
|
471
|
-
// 可以进行 NO → YES 转换
|
|
472
|
-
} else {
|
|
473
|
-
// 使用标准 CTF 合约
|
|
474
|
-
// 只能做 split/merge/redeem
|
|
475
|
-
}
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
---
|
|
479
|
-
|
|
480
|
-
## 9. 多结果市场套利策略 (NegRisk Arbitrage)
|
|
481
|
-
|
|
482
|
-
这是 Polymarket 最有价值的套利机会来源!
|
|
483
|
-
|
|
484
|
-
### 9.1 多结果市场的套利原理
|
|
485
|
-
|
|
486
|
-
```
|
|
487
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
488
|
-
│ 多结果市场套利 (Winner-Take-All) │
|
|
489
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
490
|
-
│ │
|
|
491
|
-
│ 事件: "2024 NBA 总冠军?" │
|
|
492
|
-
│ │
|
|
493
|
-
│ 结果 (n 个候选): │
|
|
494
|
-
│ Lakers: YES @ $0.15 NO @ $0.85 │
|
|
495
|
-
│ Celtics: YES @ $0.35 NO @ $0.65 │
|
|
496
|
-
│ Nuggets: YES @ $0.25 NO @ $0.75 │
|
|
497
|
-
│ Warriors: YES @ $0.18 NO @ $0.82 │
|
|
498
|
-
│ Mavs: YES @ $0.05 NO @ $0.95 │
|
|
499
|
-
│ Other: YES @ $0.02 NO @ $0.98 │
|
|
500
|
-
│ │
|
|
501
|
-
│ 不变量: 只有一个结果会赢,所有 YES 应该加起来 = $1.00 │
|
|
502
|
-
│ │
|
|
503
|
-
│ 实际情况: │
|
|
504
|
-
│ YES 总和 = 0.15 + 0.35 + 0.25 + 0.18 + 0.05 + 0.02 = $1.00 │
|
|
505
|
-
│ NO 总和 = 0.85 + 0.65 + 0.75 + 0.82 + 0.95 + 0.98 = $5.00 │
|
|
506
|
-
│ │
|
|
507
|
-
│ 等等!NO 总和应该 = (n-1) * $1 = 5 * $1 = $5.00 ✓ │
|
|
508
|
-
│ │
|
|
509
|
-
│ 套利条件: │
|
|
510
|
-
│ 如果 Σ(YES prices) < $1.00 → Long Arb (买所有 YES,持有到结算) │
|
|
511
|
-
│ 如果 Σ(YES prices) > $1.00 → Short Arb (卖所有 YES) │
|
|
512
|
-
│ │
|
|
513
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
### 9.2 实际套利机会示例
|
|
517
|
-
|
|
518
|
-
```
|
|
519
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
520
|
-
│ 多结果 Short Arb 示例 │
|
|
521
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
522
|
-
│ │
|
|
523
|
-
│ 事件: "下一任法国总统?" │
|
|
524
|
-
│ │
|
|
525
|
-
│ 候选人 YES 价格: │
|
|
526
|
-
│ Macron: $0.45 │
|
|
527
|
-
│ Le Pen: $0.35 │
|
|
528
|
-
│ Mélenchon: $0.15 │
|
|
529
|
-
│ Zemmour: $0.08 │
|
|
530
|
-
│ Other: $0.05 │
|
|
531
|
-
│ ───────────────── │
|
|
532
|
-
│ 总和: $1.08 (> $1.00,存在套利!) │
|
|
533
|
-
│ │
|
|
534
|
-
│ 套利策略: │
|
|
535
|
-
│ 1. Split $1000 → 获得每个结果 1000 份 tokens │
|
|
536
|
-
│ 2. 卖出所有 YES tokens: │
|
|
537
|
-
│ - 卖 Macron YES @ $0.45 → $450 │
|
|
538
|
-
│ - 卖 Le Pen YES @ $0.35 → $350 │
|
|
539
|
-
│ - 卖 Mélenchon YES @ $0.15 → $150 │
|
|
540
|
-
│ - 卖 Zemmour YES @ $0.08 → $80 │
|
|
541
|
-
│ - 卖 Other YES @ $0.05 → $50 │
|
|
542
|
-
│ 3. 总收入: $1080 │
|
|
543
|
-
│ 4. 利润: $1080 - $1000 = $80 (8%) │
|
|
544
|
-
│ │
|
|
545
|
-
│ 风险: 几乎为零(只要市场正常结算) │
|
|
546
|
-
│ 成本: Gas fee (~$0.05) + 交易手续费 │
|
|
547
|
-
│ │
|
|
548
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
549
|
-
```
|
|
550
|
-
|
|
551
|
-
### 9.3 多结果 Long Arb (更少见)
|
|
552
|
-
|
|
553
|
-
```
|
|
554
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
555
|
-
│ 多结果 Long Arb 示例 │
|
|
556
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
557
|
-
│ │
|
|
558
|
-
│ 场景: 新市场刚上线,定价不足 │
|
|
559
|
-
│ │
|
|
560
|
-
│ 候选人 YES 价格: │
|
|
561
|
-
│ 候选人 A: $0.30 │
|
|
562
|
-
│ 候选人 B: $0.28 │
|
|
563
|
-
│ 候选人 C: $0.22 │
|
|
564
|
-
│ 候选人 D: $0.12 │
|
|
565
|
-
│ ───────────────── │
|
|
566
|
-
│ 总和: $0.92 (< $1.00,存在套利!) │
|
|
567
|
-
│ │
|
|
568
|
-
│ 套利策略: │
|
|
569
|
-
│ 1. 买入所有 YES tokens: │
|
|
570
|
-
│ - 买 A YES @ $0.30 × 1000 = $300 │
|
|
571
|
-
│ - 买 B YES @ $0.28 × 1000 = $280 │
|
|
572
|
-
│ - 买 C YES @ $0.22 × 1000 = $220 │
|
|
573
|
-
│ - 买 D YES @ $0.12 × 1000 = $120 │
|
|
574
|
-
│ 2. 总成本: $920 │
|
|
575
|
-
│ 3. 无论谁赢,你都有 1000 个获胜 tokens = $1000 │
|
|
576
|
-
│ 4. 利润: $1000 - $920 = $80 (8.7%) │
|
|
577
|
-
│ │
|
|
578
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
### 9.4 NegRisk Conversion 套利
|
|
582
|
-
|
|
583
|
-
```
|
|
584
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
585
|
-
│ NegRisk Conversion 高级策略 │
|
|
586
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
587
|
-
│ │
|
|
588
|
-
│ 场景: 利用 NO → YES 转换机制 │
|
|
589
|
-
│ │
|
|
590
|
-
│ 事件: 3 候选人选举 │
|
|
591
|
-
│ A: YES @ $0.50, NO @ $0.50 │
|
|
592
|
-
│ B: YES @ $0.30, NO @ $0.70 │
|
|
593
|
-
│ C: YES @ $0.25, NO @ $0.75 │
|
|
594
|
-
│ │
|
|
595
|
-
│ 发现: │
|
|
596
|
-
│ 买 A NO @ $0.50 │
|
|
597
|
-
│ = 押注 "A 不会赢" │
|
|
598
|
-
│ = 押注 "B 或 C 会赢" │
|
|
599
|
-
│ │
|
|
600
|
-
│ 但是: │
|
|
601
|
-
│ 买 B YES + C YES 直接成本 = $0.30 + $0.25 = $0.55 │
|
|
602
|
-
│ 买 A NO 成本 = $0.50 │
|
|
603
|
-
│ │
|
|
604
|
-
│ 套利策略: │
|
|
605
|
-
│ 1. 买入 A NO @ $0.50 (获得 B+C 敞口) │
|
|
606
|
-
│ 2. Convert: A NO → B YES + C YES │
|
|
607
|
-
│ 3. 卖出 B YES @ $0.30 + C YES @ $0.25 = $0.55 │
|
|
608
|
-
│ 4. 利润: $0.55 - $0.50 = $0.05 (10%) │
|
|
609
|
-
│ │
|
|
610
|
-
│ 注意: 这需要使用 Neg Risk Adapter 合约进行转换 │
|
|
611
|
-
│ │
|
|
612
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
---
|
|
616
|
-
|
|
617
|
-
## 10. 监控与执行策略
|
|
618
|
-
|
|
619
|
-
### 10.1 多结果市场扫描
|
|
620
|
-
|
|
621
|
-
```typescript
|
|
622
|
-
/**
|
|
623
|
-
* 扫描多结果市场的套利机会
|
|
624
|
-
*/
|
|
625
|
-
async function scanMultiOutcomeArbitrage(eventId: string): Promise<ArbitrageOpportunity | null> {
|
|
626
|
-
// 获取事件下所有市场
|
|
627
|
-
const event = await gammaApi.getEvent(eventId);
|
|
628
|
-
const markets = event.markets;
|
|
629
|
-
|
|
630
|
-
// 计算所有 YES 价格总和
|
|
631
|
-
let yesSum = 0;
|
|
632
|
-
const marketPrices: Map<string, number> = new Map();
|
|
633
|
-
|
|
634
|
-
for (const market of markets) {
|
|
635
|
-
const yesPrice = market.outcomePrices[0]; // YES 通常是第一个
|
|
636
|
-
yesSum += yesPrice;
|
|
637
|
-
marketPrices.set(market.conditionId, yesPrice);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
// 检测套利
|
|
641
|
-
if (yesSum < 0.99) {
|
|
642
|
-
// Long Arb: 买所有 YES
|
|
643
|
-
return {
|
|
644
|
-
type: 'MULTI_LONG',
|
|
645
|
-
profit: 1 - yesSum,
|
|
646
|
-
profitPercent: ((1 - yesSum) / yesSum) * 100,
|
|
647
|
-
markets: marketPrices,
|
|
648
|
-
action: 'BUY_ALL_YES',
|
|
649
|
-
};
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
if (yesSum > 1.01) {
|
|
653
|
-
// Short Arb: 卖所有 YES
|
|
654
|
-
return {
|
|
655
|
-
type: 'MULTI_SHORT',
|
|
656
|
-
profit: yesSum - 1,
|
|
657
|
-
profitPercent: ((yesSum - 1) / 1) * 100,
|
|
658
|
-
markets: marketPrices,
|
|
659
|
-
action: 'SELL_ALL_YES',
|
|
660
|
-
};
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
return null; // 没有套利机会
|
|
664
|
-
}
|
|
665
|
-
```
|
|
666
|
-
|
|
667
|
-
### 10.2 建议的监控策略
|
|
668
|
-
|
|
669
|
-
```
|
|
670
|
-
┌─────────────────────────────────────────────────────────────────────┐
|
|
671
|
-
│ 套利监控优先级 │
|
|
672
|
-
├─────────────────────────────────────────────────────────────────────┤
|
|
673
|
-
│ │
|
|
674
|
-
│ 1. 高优先级: 多结果事件 (NegRisk Markets) │
|
|
675
|
-
│ - 选举: 总统/市长/议会 │
|
|
676
|
-
│ - 体育冠军: NBA/NFL/World Cup │
|
|
677
|
-
│ - 颁奖典礼: Oscar/Grammy │
|
|
678
|
-
│ └─ 套利机会更频繁,利润更高 │
|
|
679
|
-
│ │
|
|
680
|
-
│ 2. 中优先级: 高流动性二元市场 │
|
|
681
|
-
│ - 宏观经济: Fed 利率决定 │
|
|
682
|
-
│ - 加密货币: BTC 价格里程碑 │
|
|
683
|
-
│ └─ 偶尔有价格错配,但竞争激烈 │
|
|
684
|
-
│ │
|
|
685
|
-
│ 3. 低优先级: 低流动性二元市场 │
|
|
686
|
-
│ - 小众事件 │
|
|
687
|
-
│ └─ 有机会但难以执行大额 │
|
|
688
|
-
│ │
|
|
689
|
-
└─────────────────────────────────────────────────────────────────────┘
|
|
690
|
-
```
|
|
691
|
-
|
|
692
|
-
---
|
|
693
|
-
|
|
694
|
-
## 11. 盈利预期与风险
|
|
695
|
-
|
|
696
|
-
### 11.1 预期收益
|
|
697
|
-
|
|
698
|
-
| 市场类型 | 套利频率 | 典型利润 | 竞争程度 |
|
|
699
|
-
|---------|---------|---------|---------|
|
|
700
|
-
| 多结果 Short | 每周 2-5 次 | 1-5% | 中等 |
|
|
701
|
-
| 多结果 Long | 每月 1-2 次 | 2-8% | 低 |
|
|
702
|
-
| 二元市场 | 罕见 | 0.1-0.5% | 极高 |
|
|
703
|
-
| NegRisk Conversion | 每周 1-3 次 | 0.5-2% | 中等 |
|
|
704
|
-
|
|
705
|
-
### 11.2 风险因素
|
|
706
|
-
|
|
707
|
-
```
|
|
708
|
-
1. 执行风险
|
|
709
|
-
- 价格在执行过程中变化
|
|
710
|
-
- 深度不足导致滑点
|
|
711
|
-
- 链上交易失败
|
|
712
|
-
|
|
713
|
-
2. 智能合约风险
|
|
714
|
-
- 合约 bug 导致资金损失
|
|
715
|
-
- 市场结算异常
|
|
716
|
-
|
|
717
|
-
3. 流动性风险
|
|
718
|
-
- 无法全部成交
|
|
719
|
-
- 被更快的套利者抢先
|
|
720
|
-
|
|
721
|
-
4. Gas 成本
|
|
722
|
-
- 多次交易累积成本
|
|
723
|
-
- 网络拥堵时成本飙升
|
|
724
|
-
|
|
725
|
-
缓解措施:
|
|
726
|
-
- 设置最小利润阈值 (>0.5%)
|
|
727
|
-
- 使用 FOK 订单避免部分成交
|
|
728
|
-
- 监控 Gas 价格,高峰期不操作
|
|
729
|
-
- 从小额开始测试
|
|
730
|
-
```
|
|
731
|
-
|
|
732
|
-
---
|
|
733
|
-
|
|
734
|
-
## 12. 实施路线图
|
|
735
|
-
|
|
736
|
-
```
|
|
737
|
-
Phase 1: 监控 (已完成)
|
|
738
|
-
✅ 多结果市场 YES 价格总和监控
|
|
739
|
-
✅ 二元市场有效价格计算
|
|
740
|
-
✅ 套利机会检测
|
|
741
|
-
|
|
742
|
-
Phase 2: 通知 (进行中)
|
|
743
|
-
□ 发现机会时发送通知
|
|
744
|
-
□ 利润/深度/风险评估
|
|
745
|
-
|
|
746
|
-
Phase 3: 半自动执行
|
|
747
|
-
□ 一键执行套利
|
|
748
|
-
□ 预设参数确认后执行
|
|
749
|
-
|
|
750
|
-
Phase 4: 全自动执行
|
|
751
|
-
□ 自动检测 + 自动执行
|
|
752
|
-
□ 风控系统
|
|
753
|
-
□ 利润跟踪
|
|
754
|
-
```
|