Polymarket Up/Down 市场:slug、结算与订单簿断崖
Polymarket 的加密货币 Up/Down 市场是平台上频率最高的交易品种,也是最容易被误解的。下面介绍如何解读 slug、什么决定了结算,以及市场关闭后 Polymarket 到底保留了什么。
Polymarket 的加密货币 Up/Down 市场每五分钟结算一次,全天候运行,成交量相当可观:下面用作示例的那个五分钟 BTC 市场,单个市场就成交了 $638,615。它们是预测市场中最接近高频交易品种的东西。
它们也是平台上最难研究的市场,原因与它们的设计无关,而完全在于它们关闭之后发生了什么。本文涵盖全部三个部分:解读 slug、理解结算,以及结算后还剩下什么。
解读 slug
每个 Up/Down 市场都有一个格式固定、完全可预测的 slug:
{coin}-updown-{timeframe}-{unix_start}
btc-updown-5m-1775181000
│ │ │ └── Unix timestamp: window START, in UTC
│ │ └────── Timeframe: 5m | 15m | 1h | 4h | 24h
│ └───────────── Always "updown"
└───────────────── Coin: btc | eth | sol | xrp | doge | bnb末尾的整数才是有用的部分。它是交易窗口开启时刻的 Unix 时间戳(UTC)。解码它,你就能准确知道这个市场覆盖的是哪五分钟:
from datetime import datetime, timezone
slug = "btc-updown-5m-1775181000"
coin, _, timeframe, ts = slug.split("-")
start = datetime.fromtimestamp(int(ts), tz=timezone.utc)
print(coin.upper(), timeframe, start)
# BTC 5m 2026-04-03 01:50:00+00:00
# The market's own title renders this in US Eastern:
# "Bitcoin Up or Down - April 2, 9:50PM-9:55PM ET"由于格式是确定的,你可以直接构造 slug,而不必去搜索。每个 5m BTC 市场都从五分钟的整点边界开始,所以任意窗口的 slug 就是 btc-updown-5m- 加上该边界的 Unix 时间戳。如果你手上有一个 slug,想知道它的结果,把它粘贴到市场查询里即可。
不要相信 startDate 字段
几乎每个解析这些市场的人都会在这里栽跟头。API 中 btc-updown-5m-1775181000 的 startDate 是 2026-04-02T01:58:12Z,比交易窗口整整早了 24 小时。这个字段记录的是市场对象创建的时间,而不是窗口开启的时间。slug 中的时间戳才是真正的开始时间;endDate(2026-04-03T01:55:00Z)才是真正的收盘时间。注意 endDate 正好是 slug 时间戳加 300 秒。
结算如何运作
机制被刻意设计得很简单。市场问的是:币价在窗口收盘时是否高于开盘时。两个结果,Up 和 Down,其中一个按 $1 结算。
| 字段 | btc-updown-5m-1775181000 的值 |
|---|---|
question | Bitcoin Up or Down - April 2, 9:50PM-9:55PM ET |
outcomes | ["Up", "Down"] |
outcomePrices | ["0", "1"]:Down 获胜 |
endDate | 2026-04-03T01:55:00Z |
volumeNum | 638,615 |
spread | 0.01 |
umaResolutionStatus | resolved |
outcomePrices 读取获胜方。这种设计带来的几个后果,对任何为这些市场建模的人都很重要:
- 平局结算为 Down。问题是收盘价是否高于开盘价。不高于(包括正好相等)就是 Down。在 5 分钟窗口上这种情况很少见,但并非可以忽略,它引入了一个小小的结构性不对称,而简单的抛硬币模型会忽略这一点。
- 结算基于 Chainlink TWAP,而不是单一快照。自 2026 年 8 月 7 日起,加密货币 Up/Down 市场按时间加权平均价结算,而不是按收盘那一刻的单一价格;自 8 月 14 日起,所有 5 分钟市场都使用 60 秒窗口(在此之间的一周是 30 秒)。要超越的价格和结算价格都来自这个 TWAP。这实质性地改变了收盘阶段:最后十秒的一次价格尖峰几乎不会影响 60 秒平均值,所以尾盘反转远比现货图表上看起来的要弱。
- 临近到期时概率会急剧压缩。还剩六十秒且币价持平时,双方都向 50¢ 收敛,由价差决定胜负。在一次决定性变动后还剩十秒时,一方被钉在 97–99¢,几乎没有什么可交易的了。
- 价差就是全部。在一个支付 $1 的市场上,0.01 的报价价差意味着一个二元结果有 1% 的往返成本。大多数在中间价上看起来能赚钱的策略,跨过价差之后就不赚钱了,见下文。
如果你在 8 月之前构建过任何东西,请重新检查
五周内落地了三项结算变更:8 月 7 日上线 TWAP 结算(5m 市场为 30 秒窗口),8 月 14 日改为 60 秒窗口,以及加密货币市场的 taker 延迟在 8 月 17 日从 250ms 降到 50ms,又在 9 月 4 日从 50ms 提高到 150ms。任何基于 8 月之前行为校准的模型,校准的都是另一个交易品种。
为什么 5m 市场在结构上不同
在 24 小时的 BTC 市场上,基本面和资金流很重要。在 5 分钟市场上,你交易的是微观结构:订单流、参考数据源的跳动,以及最后几秒订单簿的形态。策略在不同时间周期之间无法迁移,用 24h 数据测试无法告诉你 5m 的任何行为。把它们看作恰好共用一套命名规则的不同交易品种。
市场结算后 Polymarket 保留了什么
这决定了你到底能不能研究这些市场。结算后,Polymarket 会保留市场记录和一条稀疏的价格序列,但不保留订单簿。我们在 2026 年 9 月 29 日检查了六个已结算的 BTC 5 分钟市场,时间从 4 天前到大约六个月前不等。
更正,2026 年 9 月 29 日
本文的早期版本称 prices-history 在结算后会返回空数组。这对我们运行的那一个请求(对一个六个月前的市场使用 interval=max)是成立的,但作为一般性结论是错误的。显式传入开始和结束时间时,它会返回 Polymarket 保留的数据点。关于订单簿的结论不变,在我们尝试的每个市场上都成立。
TOK=<token_id_of_a_resolved_market>
START=1790466900 # the number at the end of btc-updown-5m-1790466900
END=$((START + 300))
# 1. The order book: gone, at every age we tried.
curl -s "https://clob.polymarket.com/book?token_id=$TOK"
# {"error":"No orderbook exists for the requested token id"} HTTP 404
# 2. The price series: thin, but there if you give it a window.
curl -s "https://clob.polymarket.com/prices-history?market=$TOK&startTs=$START&endTs=$END&fidelity=1"
# {"history":[{"t":...,"p":0.365}, ...]} 6 points for this 5-minute market
# 3. The same call with interval=max: empty for the six-month-old market we tried.
curl -s "https://clob.polymarket.com/prices-history?market=$TOK&interval=max&fidelity=1"
# {"history":[]} HTTP 200所以价格序列并没有消失,但很稀疏。对于 btc-updown-5m-1790466900,Polymarket 返回了六个数据点,从窗口开启后 11 秒到 316 秒,最后一分钟只有其中一个。PolyTest 保存了同一个市场的 2,552 条快照,大约每 0.12 秒一条,每条都带有双边订单簿。每分钟一个价格足以看出谁赢了,以及价格大致在什么时候变动。它无法告诉你一笔 500 份的订单会以什么价格成交,而且几乎覆盖不到最后一分钟,而这些市场恰恰是在最后一分钟决出胜负的。
Polymarket 较新的 Data API 还有第二条路径 GET /v2/prices-history,返回 60 秒分桶的数据。在我们的测试中,它有 8 天以内市场的数据,15 天或更早的市场则什么都没有,所以它无法替代存档。
| 你想要的 | 结算后还能获取吗? |
|---|---|
| 市场元数据(问题、结果、成交量) | 能,通过 ?closed=true |
| 哪一方获胜 | 能,outcomePrices |
| 窗口内的价格序列 | 能,大约每分钟一个点,需要显式传入开始和结束时间 |
| 任意时刻的订单簿深度 | 不能,我们尝试的每个时间点都返回 404 |
| 你的订单当时会以什么价格成交 | 不能 |
每分钟一个价格不等于订单簿
你可以知道 Down 赢了,以及价格逐分钟的大致走势。你无法知道任一时刻订单簿双边挂着什么,而每一个执行层面的问题都取决于这一点。价格序列足以计算基础概率和画一张粗略的图表,但不足以回测一个需要支付价差的策略。
为什么基础概率不够
到这里,一个常见的直觉是:既然结果可以获取,为什么不直接研究结算频率?统计过去一千个市场中 5m BTC 结算为 Up 的频率,找到一个偏差,然后交易它。
问题在于,任何这样的偏差早在你看到之前就已经计入了报价。如果上个月 SOL 5m 市场有 52% 的时候结算为 Up,做市商是知道的,Up 就会以 52¢ 开盘。基础概率不是优势,它已经在价格里了。要找到优势,你需要的恰恰是 Polymarket 不保留的东西:价格错误时订单簿是什么样子。
这才是 Up/Down 策略难以验证的真正原因。不是因为这些市场有效,而是因为无论要证明还是否定这一点,所需的证据都不在 API 里。
记录 Polymarket 不保留的东西
绕过订单簿缺失的唯一方法,就是在市场运行时把它记录下来。这正是 PolyTest 做的事:对 Polymarket 加密货币 Up/Down 市场进行连续的时点快照,在运行时采集,在结算后保留:240M+ 条快照,每边 8 档订单簿深度,亚秒级时间戳。
| 币种 | 时间周期 |
|---|---|
| BTC | 5m · 15m · 1h · 4h · 24h |
| ETH | 5m · 15m · 1h |
| SOL | 5m · 15m · 1h |
| XRP · DOGE · BNB | 正在采集,即将推出 |
import os, requests
BASE = "https://api.polytest.io/api/v1"
H = {"X-API-Key": os.environ["POLYTEST_KEY"]}
# Resolved markets are still here — that is the whole point.
markets = requests.get(f"{BASE}/markets",
params={"coin": "sol", "market_type": "5m", "limit": 50},
headers=H).json()["markets"]
for m in markets:
snaps = requests.get(f"{BASE}/markets/{m['id']}/snapshots",
params={"include_orderbook": "true"},
headers=H).json()["snapshots"]
# The final minute is where 5m markets are actually decided.
endgame = snaps[-12:]
for s in endgame:
print(m["slug"], s["timestamp"], s["midPrice"], s["spread"])三件值得测试的事
- 你的优势能扛住价差吗?用你实际会吃到的卖价代替中间价,重新运行任何看起来有希望的结果。在 $1 市场上 1¢ 的价差,经常会把一个赚钱的策略变成亏钱的策略。先做这一步,它能以很低的成本淘汰大多数想法。
- 最后 60 秒内深度如何变化?Up/Down 市场在临近到期时会急剧变薄。还剩 3 分钟时能成交的规模,在还剩 30 秒时未必能成交,而这在任何中间价序列中都看不出来。
- 有什么能跨币种迁移吗?BTC、ETH 和 SOL 的 5m 市场设计相同,但流动性分布不同。在 BTC 订单簿上调好的策略,到了 SOL 更薄的订单簿上经常失效,这一点最好在投入资金之前知道,而不是之后。
常见问题
- btc-updown-5m slug 格式是什么意思?
- Polymarket Up/Down slug 遵循 {coin}-updown-{timeframe}-{unix_start} 的模式。在 btc-updown-5m-1775181000 中,btc 是币种,5m 是窗口长度,1775181000 是交易窗口开启时刻的 Unix 时间戳(UTC),这里对应 2026-04-03 01:50:00 UTC,在市场标题中显示为 April 2, 9:50PM-9:55PM ET。格式是确定的,所以 slug 可以直接构造,而不必搜索。
- Polymarket Up/Down 市场如何结算?
- 如果币种在窗口收盘时的参考价格高于开盘时,市场结算为 Up,否则结算为 Down。由于判断条件是严格高于,正好持平的收盘结算为 Down。自 2026 年 8 月 7 日起,开盘价和收盘价来自 Chainlink 时间加权平均价,而不是单一价格;自 8 月 14 日起,5 分钟市场使用 60 秒窗口。在临界点附近,你自己的数据源与该平均价之间的基差很重要。
- 为什么 Polymarket Up/Down 市场上的 startDate 是错的?
- 它没有错,但它的含义和人们以为的不一样。startDate 字段记录的是市场对象的创建时间,可能比开始交易早一天或更久。对于 btc-updown-5m-1775181000,startDate 是 2026-04-02T01:58:12Z,而窗口实际在 2026-04-03T01:50:00Z 开启。用 slug 中的 Unix 时间戳作为窗口开始时间,用 endDate 作为收盘时间。
- 能获取已结算 Polymarket Up/Down 市场的历史数据吗?
- 从 Polymarket 的 API 获取不到。只能获取一部分。Polymarket 对已结算市场的订单簿返回 404。它保留市场记录(结果和成交量,使用 closed=true)以及大约每分钟一个点的价格序列,需要显式传入开始和结束时间来获取;对于较早的市场,interval=max 会返回空列表。没有订单簿深度,所以你无法模拟成交。回测执行需要在市场运行期间记录的快照。
- 哪些币种有 Polymarket Up/Down 市场?
- BTC 覆盖最全,有 5m、15m、1h、4h 和 24h 窗口。ETH 和 SOL 有 5m、15m 和 1h。XRP、DOGE 和 BNB 是较新加入的,覆盖范围较窄。各币种的流动性差异很大,所以基于 BTC 订单簿校准的策略,通常无法迁移到 SOL 更薄的订单簿上。
获取 Polymarket 不保留的历史数据
PolyTest 在 Polymarket 加密货币 Up/Down 市场运行期间实时记录:240M+ 条快照,包含 8 档订单簿深度、亚秒级时间戳,并保留已结算的市场。从 3 天免费试用开始。
继续阅读
Polymarket 现货滞后优势是真的,但它只有大约 $100 深
在 Polymarket 重新定价之前,买入现货已经确认的那一方。与人们声称的大多数策略不同,这个策略经得起数据检验,z 值高达 15。它之所以没能让所有人发财,原因就摆在订单簿里。
97.7% 胜率却在亏钱:买入热门方策略回测
买入明显领先的一方,拿走几乎确定的收益,然后重复。这种策略的胜率在截图上看起来非同寻常。但在真实订单簿数据上的 17,002 笔交易中,它是亏钱的,而原因是算术,不是运气。
如何构建 Polymarket 交易机器人
大多数 Polymarket 机器人教程都基于已经不存在的 SDK。这是一条最新的端到端路径:2026 年该安装什么、认证实际如何运作、数据缺口在哪里,以及在第一周就让机器人挂掉的失效模式。