Polymarket 交易量被重复计算

  • Paradigm
  • 发布于 10小时前
  • 阅读 60

本文分析了 Polymarket 交易市场的链上数据,指出现有的大多数分析和仪表板错误地重复计算了交易量。

在分析了 Polymarket 的市场结构、事件数据和智能合约后,我们发现大多数 Polymarket 分析和仪表板都错误地重复计算了交易量。Polymarket 的链上数据非常复杂,这导致了有缺陷的会计方法的广泛采用。但是,使用下面解释的原则,这些数据变得易于使用。

本文包含以下几部分:

1. Polymarket 交易的剖析

Polymarket 交易如何在链上数据中体现?

2. 并非所有匹配都是掉期

预测市场撮合引擎是如何运作的?

3. 预测市场交易量指标

衡量交易量的正确方法是什么?

主要观点:

  1. 对 Polymarket 的 OrderFilled 事件求和的常用方法会导致重复计算交易量。这种方法既重复计算了交易的合约数量,又重复计算了美元现金流。例如,以 4.13 美元的价格出售 YES 代币的简单销售被记录为价值 8.26 美元的交易量。这是因为有单独的 OrderFilled 事件代表交易的 maker 方和 taker 方。

  2. 预测市场的交易量应该使用单边交易量指标来衡量,例如 taker 方的交易量或 maker 方的交易量。有多种有效的方法来衡量预测市场交易量,但将所有 OrderFilled 事件加起来并不是其中之一。

本文与刷量或其他类型的交易量分类无关。我们只是在描述如何衡量 Polymarket 上发生的原始总交易量,特别是以一种能够与其他预测市场平台进行同类比较的方式。

Polymarket 交易的剖析

我们将首先描述与每笔 Polymarket 交易相关的链上数据。

Polymarket 交易事务都遵循一个严格的模板:

  • 每个 Polygon 交易中最多有一组匹配的 Polymarket 订单。
  • 每组匹配的订单都有正好一个 taker 和至少一个 maker。
  • 交易事务由约 50 个与 Polymarket 相关的 EOA 提交。

事件结构

Polymarket 使用 2 个 EVM 事件来跟踪交易:OrderFilled 和 OrdersMatched。

这两个事件都有这些字段:

  1. makerAssetID:0(对于 USDC),或 YES 代币 ID,或 NO 代币 ID
  2. takerAssetID:0(对于 USDC),或 YES 代币 ID,或 NO 代币 ID
  3. makerAmountFilled:maker 代币的数量
  4. takerAmountFilled:taker 代币的数量

OrderFilled 事件还有一个 maker 字段和 taker 字段,我们将在下面描述。

事件序列

每个 Polymarket 交易事务都有相同的事件序列:

  1. 至少一个“以 maker 为中心”的 OrderFilled 事件

    • 为参与交易的每个 maker 发出一个此类事件
    • 这些事件的 maker 值通常(但并非总是)不同
    • 所有这些事件都具有相同的 taker,即交易的总体 taker
    • 这些事件的 makertaker 都不是 Polymarket 交易所合约、
  2. 然后有正好一个“以 taker 为中心”的 OrderFilled 事件

    • 它的 maker 是交易的总体 taker
    • 它的 taker 是 Polymarket 交易所合约(CTF 或 NegRisk)
  3. 最后有正好一个 OrdersMatched 事件

    • 它具有与 (2) 的“以 taker 为中心”的 OrderFilled 事件相同的 makerAmountFilledtakerAmountFilled

关键是,项目 (2) 与项目 (1) 冗余。最后一个 OrderFilled 是相同交易的第二次表示,而不是 taker 和 Polymarket 交易所之间的额外交易。它不代表额外的经济活动,也不代表市场参与者之间任何额外的风险转移。

此外,一个常见的混淆点是 OrderFilled 事件记录的总 Token 交易量大约是 OrdersMatched 事件记录的总 Token 交易量的 2 倍。这种差异通过意识到每个交易包含两组 OrderFilled 事件来解决,这两组事件都代表相同的交易。

另一个混淆点是,对应于 maker 和 taker 的这两组 OrderFilled 事件可以衡量单个交易的不同交易量。这可以通过意识到 maker 和 taker 在拆分交易和合并交易期间可以体验到不同的交易量来解决。但是,在许多交易中,在几天或几个月的时间尺度上,maker 交易量和 taker 交易量往往会收敛到相同的值。我们将在后面的章节中详细说明。

智能合约结构

通过查看 Polymarket 交易所合约,可以进一步阐明 Polymarket 的事件序列。每笔交易都由两个交易所合约之一促成,CTFNegRisk CTF。发射 OrderFilled 和 OrdersMatched 的代码部分显示在图 1中。此代码在两个合约中都是相同的。

图 1:Polymarket 交易所智能合约的事件发射部分。编号标签对应于上面“事件序列”部分中的项目。RR 拍卖

图 1:Polymarket 交易所智能合约的事件发射部分。编号标签对应于上面“事件序列”部分中的项目。RR 拍卖

图 1:Polymarket 交易所智能合约的事件发射部分。编号标签对应于上面“事件序列”部分中的项目。

每笔 Polymarket 交易都遵循相同的序列:

  1. 通过 matchOrders() 函数进入合约,该函数只是调用 _matchOrders()
  2. 将 taker 的 Token 从 taker 转移到交易所合约
  3. _fillMakerOrders() 循环遍历 maker。对于每一个:
    • 计算给 maker 的费用
    • 如果需要,执行拆分/合并操作(参见下一节)
    • 将 maker 的 Token 从 maker 转移到交易所合约
    • 将 taker 的 Token 从交易所合约转移到 maker
    • 将 maker 费用从交易所合约转移到费用收集器
    • 发出描述由 maker 填补的 taker 交易部分的 OrderFilled 事件
  4. 将 maker 的 Token 从交易所合约转移到 taker
  5. 将 taker 费用从交易所合约转移到费用收集器
  6. 发出描述整个填充集的 OrderFilled 事件
  7. 发出描述整个填充集的 OrdersMatched 事件

在这种设计中,交易所合约充当路由器。它是每个 Token 转移的发送者或接收者。但关键是,交易所不承担任何仓位,它不提供任何资金,它不承担任何风险,而且它不是任何交易的交易对手。唯一发生的交易是在 taker 和每个 maker 之间。因此,两种类型的 OrderFilled 事件是相同交易的两种表示,不应将它们加在一起。

应该注意的是,没有一个 OrderFilled 事件包含不正确的信息。智能合约可能被设计为发射额外事件的原因有很多(例如,它可能使在前端报告每个用户的历史更容易)。只有当有人尝试通过对所有 OrderFilled 事件求和来计算交易量时,才会出现不正确的信息。

并非所有匹配都是掉期

除了冗余的 OrderFilled 发射之外,Polymarket 交易也可能令人困惑,因为撮合引擎可以在同一多腿交易中跨 YES 和 NO 订单簿匹配订单。这些不是传统的掉期,乍一看,它们似乎产生了任意或不平衡的会计处理。

此 Polymarket 交易为例,Polygonscan 表示形式如图 2 所示。

图 2:Polymarket “令人困惑”的交易示例

图 2:Polymarket “令人困惑”的交易示例

Polygonscan 将此交易总结为“下注 28.41 美元”。这是一个活跃的市场,尚未解决。那么为什么会有一个当事人净赚 6780 美元?

这里实际发生的情况:

  • taker 0x0c45 以市价单出售了价值 90 美元的 YES 份额
  • 此 taker 订单通过与两个做市商匹配来完成
  • 第一个做市商 0xd9A5 购买了价值 28 美元的 YES
  • 第二个做市商 0x8E8C 出售了价值 6780 美元的 NO

要理解最后一点,有必要理解 YES-NO 拆分-合并 套利。

YES-NO 拆分-合并 套利

Polymarket 使用 YES 代币和 NO 代币的双重资产来表示仓位。在控制这些 Token 的主要智能合约中,YES 和 NO 之间相互转换的唯一方法是拆分和合并操作:

  1. 拆分: 以 1 美元兑换(1 个 YES 代币 + 1 个 NO 代币)
  2. 合并: 以(1 个 YES 代币 + 1 个 NO 代币)兑换 1 美元

YES 代币和 NO 代币存在于具有单独流动性的单独订单簿中。(YES 价格)通常非常接近(1 - NO 价格),但这种关系并不精确,它取决于套利和流动性:

  • 如果订单簿中 YES + NO > 1 美元,则可以拆分 1 美元以拆分为 YES+NO 并出售这些 Token 获得 > 1 美元

  • 如果订单簿中 YES + NO < 1 美元,则可以购买 YES+NO 获得 < 1 美元并将其合并为 1 美元

这些操作要求 Token 在其订单簿中具有足够的卖方或买方流动性。Gas 费用或其他费用也可能扰乱平衡。

跨订单簿匹配

taker 的 YES 或 NO 订单的价格影响可能会推动(YES+NO)的价格高于或低于 1 美元,这可能会创造套利机会。Polymarket 的订单撮合引擎意识到了这一点。该引擎寻找使用拆分合并操作来桥接 YES 和 NO 订单簿之间的流动性并完成更多订单的机会。

在上述交易之前,第二个做市商 0x8E8C 已为其 NO 代币开设了卖单。撮合引擎发现 taker 0x0c45 出售的某些 YES 代币可以与 maker 0x8E8C 出售的某些 NO 代币合并,这将产生足够的 USDC 来部分完成两个订单。然后,为了执行交易,交易所合约 1) 从双方收集 YES 代币和 NO 代币,2) 合并它们,然后 3) 根据交易的执行价格按比例分配收益。

Token 会计

以下是交易中的 Token 转移序列(图 3A),以及相关的净余额变化(图 3B)。

交易所是每个转移的发送者或接收者。保险库是存储所有支持 YES-NO Token 对的 USDC 的“条件 Token”合约。

图 3a:“令人困惑”的交易相关的 Token 转移

图 3a:“令人困惑”的交易相关的 Token 转移

图 3b:“令人困惑”的交易相关的余额变化

图 3b:“令人困惑”的交易相关的余额变化

拆分、合并与掉期的市场结构

市场结构可以描述如下:Polymarket 的撮合引擎匹配 maker 和 taker。其中一些匹配是传统的掉期,其中一个市场参与者将其风险敞口转移给另一个市场参与者,以换取 USDC。这与 Uniswap 或 Binance 等现货交易所类似。但是,预测市场的 YES-NO 结构也允许使用拆分或合并的另一种类型的匹配。在这些特殊匹配中:

  • maker 和 taker 要么都发送 USDC,要么都接收 USDC(而不是只有一个发送者和一个接收者)。

  • 买方和卖方一致同意采用市场的相反 стороны,要么创建新的未平仓合约,要么关闭现有的未平仓合约。系统中的未平仓合约增加或减少(而不是像在现货掉期中那样保持不变)。

  • maker 和 taker 通常发送或接收不同的价值量(而不是买方的美元增量与卖方的美元增量大致相同)。

拆分交易是指 maker 和 taker 同意将其 USDC 兑换为股份,然后一方获得 YES 敞口,另一方获得 NO 敞口的匹配。合并交易是指 maker 和 taker 同意将其相反的 YES 和 NO 股份兑换为 USDC 的匹配。

考虑到这些原则,我们可以用更精确的术语描述上面示例交易。这是一笔两腿交易,其中第一腿是掉期,第二腿是合并。

  • 在掉期腿中,taker 以 28.41 美元的价格兑换了 3,157.02 个 YES 代币,maker 以 28.41 美元的价格兑换了 3,157.02 个 YES 代币。maker 和 taker 都经历了相同数量的现金流交易量,即 28.41 美元。他们还经历了相同数量的合约交易量,即 3,157.02。

  • 在合并腿中,taker 以 61.59 美元的价格兑换了 их 6,842.98 个 YES 代币,maker 以 6781.39 美元的价格兑换了 6,842.98 个 NO 代币。taker 和 maker 经历了相同数量的合约交易量 6,842.98,但现金流交易量不同。

  • 对 OrderFilled 事件报告求和只是将 maker 交易量添加到 taker 交易量中,因为有单独的 OrderFilled 事件代表交易的 maker 方和 taker 方。

    • 它报告的总合约交易量为 3,157.02 + 3,157.02 + 6,842.98 + 6,842.98 = 20,000
    • 它报告的 USDC 总交易量为 28.41 + 28.41 + 61.59 + 6781.39 = 6899.80 美元

正如下一节所述,有多种有效的方法来解释交易的第二条腿中发生了多少交易量,但简单地将 maker 和 taker 加在一起并不是其中之一。这个总和是一种重复计算的形式,它产生的交易量数字与其他预测市场交易场所的交易量指标无法比较。

预测市场交易量指标

有多种有效的方法来计算预测市场的交易量。但是,所有这些方法都大致同意交易量值约为 Polymarket 的 OrderFilled 总和的 50%。

为了进行完整的会计处理,我们将从 Polymarket 上发生的 8 种简单交易类型开始:

  1. Taker 购买 YES,maker 出售 YES(掉期)
  2. Taker 购买 NO,maker 出售 NO(掉期)
  3. Taker 出售 YES,maker 购买 YES(掉期)
  4. Taker 出售 NO,maker 购买 NO(掉期)
  5. Taker 购买 YES,maker 购买 NO(拆分)
  6. Taker 出售 NO,maker 出售 YES(合并)
  7. Taker 出售 NO,maker 出售 YES(合并)
  8. Taker 出售 YES,maker 出售 NO(合并)

我们构建了一个模拟器,用于说明这些 8 种交易类型中的每一种的各种交易指标是如何表现的。对于每种交易类型,模拟器计算 1) maker/taker 余额变化,2) 未平仓合约变化,以及 3) 各种交易量指标。示例输出如图 4 所示。

图 4:Polymarket 交易量模拟器电子表格

模拟所需的唯二两个输入是 1) YES 价格和 2) 交易的合约数量。你可以复制电子表格并更改这些参数以执行你自己的模拟。为简单起见,我们假设零费用,并且(NO 价格)完全等于 1 美元 -(YES 价格)。

我们现在将介绍模拟器输出中的每个项目。

账户增量和未平仓合约变化

模拟器中的前几列跟踪每次交易期间未平仓合约和 maker/taker 余额的变化量。

请注意几个不变性:

  • 对于每种交易类型,taker 和 maker 总是采取相反的仓位。一个是 YES 决议的多头,另一个是 YES 决议的空头。
  • taker 和 maker 的 YES 和 NO 增量始终具有相同的绝对值。这与他们的 USDC 增量不同,USDC 增量可能具有不同的绝对值。
  • 拆分交易总是增加未平仓合约,合并交易总是减少未平仓合约,掉期交易总是保持未平仓合约不变。

交易量指标

常用的预测市场交易量指标有两种:

  1. 名义交易量: 交易的合约数量
  2. 现金流交易量: 交易时交换的美元金额

计算 掉期交易 的这些指标很简单。名义交易量就是交易的合约数量。现金流交易量是交易的合约数量乘以份额价格。对于这两种交易量指标,Polymarket 的 OrderFilled 总和给出的值是正确值的 2 倍。

计算 拆分交易合并交易 的这些指标更复杂,因为它们不是传统意义上的掉期(参见拆分、合并与掉期一节)。在传统掉期中,maker 和 taker 体验到相同数量的交易量。但是在拆分交易或合并交易中,maker 和 taker 可以体验到不同数量的交易量。对于是衡量 maker 的交易量、taker 的交易量还是两者之间的一些东西,我们没有意见。但是,简单地将两者加在一起是重复计算,就像在掉期交易中一样。

考虑到这些因素,计算拆分交易和合并交易的 名义交易量 变得很简单。它只是拆分或合并的合约数量。

计算拆分交易和合并交易的 现金流交易量 是最复杂的情况。如上所述,maker 和 taker 将体验到不同数量的现金流。是关注于 maker 的现金流、taker 的现金流、maker taker 平均值,还是其他一些近似值(如按份额定价的交易量),可以取决于上下文。这些指标可以为单个交易产生不同的交易量值。但是,这些指标在几天或几个月的较长时间尺度上汇总时,都会产生大致相同的交易量数字(参见下面的图 5)。因此,现金流指标的确切选择通常并不重要。唯一重要的说明是,对 OrderFlow 事件求和与这些交易量指标不一致,而是由于重复计算而产生约 2 倍大的值(参见下面的图 5)。

Polymarket USDC 交易量指标

image.png

图 5:不同指标下的 Polymarket 月度交易量。Taker 方的交易量、Maker 方的交易量和按份额定价的交易量均约为 OrderFilled 总和的一半。Polymarket 交易量图表可能正在使用 OrderFilled 总和的一个指标是检查 2024-10 和 2024-11 的月度交易量是否约为 25 亿美元。

真实世界的示例

电子表格的最后一列提供了 8 种交易类型中每一种的历史交易的 4 个示例。每个示例的价格和大小参数可以输入到电子表格的单元格 A1 和 A2 中,以模拟每个交易的 OrderFilled 事件的总和。

image.png

图 6:该电子表格包含 8 种交易类型中每一种的 4 个真实交易示例

这些示例的视图如图 6 所示。还要注意,这些示例来自 Polymarket CTF 交易所和 Polymarket Negrisk 交易所,并且每个交易所都具有相同的 OrderFilled 发射。

分析 Polymarket 数据的困难之一是交易类型很多。即使了解这 8 种交易类型,使用区块浏览器也很难找到或识别特定的交易类型。这 32 个示例交易应该对任何试图了解更多关于 Polymarket 数据的人来说都是有用的资源。

使用哪些指标?

以下是单个视图中提到的指标的比较:

图 7:预测市场交易量指标的比较

图 7:预测市场交易量指标的比较

对于名义交易量,测量很简单。只需测量交易的合约数量。

对于现金流交易量,有多种可能性。可以使用 maker 的现金流,也可以使用 taker 的现金流,或者使用两者的平均值。每一个都可以从 Polymarket 的链上数据中推导出来,并且每一个在几天或几个月内汇总时都会产生相似的交易量数字(图 5)。

可以通过过滤和求和 taker 字段等于两个交易所合约之一(CTF 0x4bfb41d5b3570defd03c39a9a4d8de6bd8b8982e 和 NegRisk 0xc5d563a36ae78145c45a50134d48a1215220f80a)的 OrderFilled 事件来获得 Taker 侧的交易量。可以通过过滤和求和 taker 字段不等于这两个交易所合约中任何一个的 OrderFilled 事件来计算 Maker 侧的交易量。

结论

预测市场正在迅速发展成为一个关键的金融部门。随着该类别的成熟,该行业应趋同于一致、透明和客观的报告标准。这对于比较跨平台的活动以及评估预测市场在日常生活中的日益增长的作用尤其重要。

在我们对该主题的调查中,我们发现大多数 Polymarket 分析和仪表板都在无意中重复计算了交易量。这种混乱源于相互作用的复杂性层次:

  1. 掉期匹配和拆分/合并匹配导致 8 种可能的单腿交易类型,以及更大种类的多腿交易。
  2. 每种交易类型都会导致 Polymarket 合约发出略有不同的事件。
  3. 虽然没有一个 Polymarket 事件包含不正确的信息,但事件流包含每个交易的 maker 侧和 taker 侧的冗余表达。简单地对这些事件求和会导致重复计算。

这些因素大多没有记录,而且像区块浏览器这样的标准工具不足以理清这种复杂性。只有在检查多条证据(市场结构、事件发射和智能合约架构)时,才能更准确地描述这些数据。但总而言之,这些证据清楚而一致地描绘了如何衡量和比较预测市场交易。

非常感谢 dashAlliumDan SmithChaos LabsRicardo de ArrudaCiamac MoallemiDan Robinsonfrankie 的反馈 + 帮助理清这些数据的对话

披露:Paradigm 是 Kalshi(Polymarket 的竞争对手)的投资者。

附录:实际示例

将下面的图表与 图 5 进行比较。请注意,2024-10 和 2025-11 月份的月交易量值约为 25 亿美元通常表示仪表板正在通过对所有 OrderFilled 事件求和来计算交易量。

我们已经通过多个仪表板创建者和数据分析师验证了此信息。DefiLlama、Allium、Blockworks 等现在正在更新其仪表板以消除重复计算。

image.png

Allium

image.png

Blockworks

image.png

DefiLlama

image.png

Dune #1

image.png

Dune #2

image.png

Dune #3

image.png

Dune #4

image.png

Dune #5

image.png

Token Terminal

  • 原文链接: paradigm.xyz/2025/12/pol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Paradigm
Paradigm
Paradigm 是一家研究驱动型技术投资公司 https://www.paradigm.xyz/