全部文章
市场数据Up/Down 市场BTCETH

Polymarket Up/Down 市场:slug、结算与订单簿断崖

Polymarket 的加密货币 Up/Down 市场是平台上频率最高的交易品种,也是最容易被误解的。下面介绍如何解读 slug、什么决定了结算,以及市场关闭后 Polymarket 到底保留了什么。

阅读约 10 分钟更新于 2026年9月24日

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 的值
questionBitcoin Up or Down - April 2, 9:50PM-9:55PM ET
outcomes["Up", "Down"]
outcomePrices["0", "1"]:Down 获胜
endDate2026-04-03T01:55:00Z
volumeNum638,615
spread0.01
umaResolutionStatusresolved
从 Gamma API 拉取的实时值。结算后通过 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 档订单簿深度,亚秒级时间戳。

币种时间周期
BTC5m · 15m · 1h · 4h · 24h
ETH5m · 15m · 1h
SOL5m · 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 市场上 1¢ 的价差,经常会把一个赚钱的策略变成亏钱的策略。先做这一步,它能以很低的成本淘汰大多数想法。
  2. 最后 60 秒内深度如何变化?Up/Down 市场在临近到期时会急剧变薄。还剩 3 分钟时能成交的规模,在还剩 30 秒时未必能成交,而这在任何中间价序列中都看不出来。
  3. 有什么能跨币种迁移吗?BTC、ETH 和 SOL 的 5m 市场设计相同,但流动性分布不同。在 BTC 订单簿上调好的策略,到了 SOL 更薄的订单簿上经常失效,这一点最好在投入资金之前知道,而不是之后。

回测指南更深入地介绍了成交模拟。如果你想在做任何决定之前先看看数据,还有 3 天免费试用。

常见问题

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 天免费试用开始。

继续阅读