在Pyth,我们一直在研究一种新算法,用于将发布者的价格数据合并为一个聚合价格数据,我们希望在发布之前与社群分享以获取意见回馈。

提供一些背景,Pyth 是一个预言机,它发布每个Solana 插槽上每个产品的聚合价格和信赖区间。Pyth 程序通过聚合各个发布者提交的价格和信赖区间来计算链上的价格。例如: 一个发布者可能会说BTC/USD 的价格是$52000 ± 10,而另一个发布者说它是$53000 ± 20,而Pyth 可能会将这两个价格合并为$52500 ± 500 的总价。这篇文章是对于最后聚合的步骤提出了一种新的聚合算法。

目标

我们希望Pyth 的聚合算法具有三个属性。首先,它应该对发布者的操纵— 无论是无意的还是有意的— 都具有强大的抵抗力。如果大多数发布者提交的价格为100 美元,而一个发布者提交的价格为80 美元,则总价格应保持在100 美元附近,并且不会受到单一外围价格的过度影响。此属性可确保Pyth 价格保持准确,即使少数发布者提交的价格远离市场。这种情况如下图(a) 所示。

聚合过程的情况。较低的细条代表每个发布者的价格和信赖区间,粗体红色条代表我们直觉上希望总价格和信赖值的位置。

其次,聚合价格应适当加权不同准确度的数据源。Pyth 允许发布者提交信赖区间,因为他们在观察产品价格时具有不同的准确度。例如: 美国股票交易所有不同程度的流动性,流动性较差的交易所比流动性较高的交易所的买卖价差更大。此属性可能导致以下情况:一个交易所报告的价格为101 +- 1 美元,而另一个交易所报告的价格为110 +- 10 美元。在这些情况下,我们希望总价格更接近101 美元而不是110 美元。这种情况如下图(b) 所示。

最后,聚合信赖区间应反映发布者价格之间的差异。实际上,任何给定的产品都没有单一的价格。在任何特定时间,每种产品在世界各地的不同场所以略有不同的价格交易。此外,如果交易者立即买卖产品,他们将获得不同的价格。我们希望Pyth 的信赖区间能够反映这些在不同场所的价格差异。图)(c) 和(d) 描绘了两种不同的情况,其中交易所之间存在价格差异。

聚合算法

我们设计了一个聚合算法来获得这三个属性。算法的第一步是通过给每个发布者三票来计算总价格— 价格一票,价格加上和减去他们的信赖区间一票— 然后取投票的中位数。第二步计算从聚合价格到投票的第25 个和第75 个百分位数的距离,然后选择两者中较大的作为总信赖区间。

这个简单的算法有一些令人惊讶的特性:计算总价格的过程实际上是普通中位数的一般化。大多数人将中位数理解为数据的中间值,即第50 个百分位数。然而,中位数也是最小化目标函数∑ᵢ |R — pᵢ| 的R 值,其中pᵢ 是每个发布者的价格。此函数根据R 与发布者价格pᵢ 的距离来惩罚R。Pyth 的算法透过最小化⅓Σᵢ|R — pᵢ| + ⅔Σᵢ max(|R — pᵢ| — cᵢ, 0) 计算聚合的R价格,其中cᵢ 是发布者的信赖区间。这个算法将普通中位数与第二项相结合,如果R 位于发布者的信赖区间之外,则仅对R 进行惩罚。这个算法鼓励聚合价格R 不仅接近发布者的价格,而且在他们的信赖区间内。(有一个简单证明投票方案和最小化这个算法之间的等价性,我们将留给读者。)

我们可以将两个算法视觉化以了解它们之间的区别:

左边是应用价格pᵢ= 0 也就是|R| 的普通中位数的算法。右边是Pyth的算法⅓|R| + ⅔max(|R| — cᵢ, 0) 描述了各种信赖区间cᵢ 的选择。信赖区间的宽度决定了曲线中拐点的位置— 随着区间的扩大,拐点从0 开始移动得更远。两个拐点之间的区域相对于中位数减少了惩罚。

一般化的中位数具有我们想要的前两个属性。它对异常值具有稳定性,因为普通中位数对异常值具有稳定性。(很容易看出中位数是稳健的— 无论第99 个百分位数的值是多少,数据的第50 个百分位数都保持不变。)此外,其信赖区间调整考虑了不同数据源的准确性。

我们可以在上面的场景中视觉化这个算法,如下所示:

上图将算法描绘为一条红线。这个算法的最佳值是在红点上,它是聚合价格的位置。每个发布者对算法的贡献用灰色虚线表示。因此,灰色虚线函数的总和是红色线算法。最左边的图显示了算法的稳健性,第二张图显示了信赖区间更窄的发布者如何对总价格的位置施加更大的影响。在第三张和第四张图中,算法给出的结果与普通中位数相似。

聚合算法的第二步是计算围绕聚合价格的信赖区间。Pyth 的聚合信赖区间可以被视为一般化四分位间距,这是数据分散的标准度量。四分位间距通常定义为第25 和第75 个百分位数之间的距离。我们修改了这个定义,取聚合价格与第25 个或第75 个百分位数之间距离的最大值,以产生一个围绕聚合价格对称的信赖区间。此外,Pyth 不使用价格的四分位间距,而是使用发布者​​票数的四分位间距。这种修改既考虑了发布者的信赖区间的宽度,也考虑了发布者聚合价格之间的任何差异。

将所有内容放在一起,下图显示了完整算法在我们四个情况中的行为:

红点表示使用中位数算法计算的聚合价格,相应的粗红线表示聚合信赖区间。灰色圆圈代表票数的第25 个和第75 个百分位数— 距离聚合价格较远的百分位数决定聚合信赖区间的宽度。图中的其他元素与上图中的元素相同。第三张图显示聚合信赖区间考虑了发布者的信赖区间,第四张图显示了它考虑了发布者之间的价格差异。

理论分析

除了产生直观合理的结果外,此算法还具有很好的理论特性。在两种限制情况下,聚合价格保证等于普通中位数:

发布者发布相同的价格,但具有不同宽度的信赖区间。在这种情况下,票数将被排序,使得底部33% 由价格减去信赖区间组成,顶部33% 由价格加上信赖区间组成。票数的中位数等于第33–66 个百分位数的中位数,即发布者价格的普通中位数。这种情况可以在上面左边数来第三张图中看到。 发布者发布具有非重叠信赖区间的不同价格。在这种情况下,单个发布者的所有票数将在排序列表中并列,我们可以将它们视为个体票数。因此,Pyth 的聚合价格降低到发布者价格的中位数。上面左边数来第四幅图中描述了这种情况。

此外,即使我们不在这些情况中,我们也可以证明聚合价格永远不会与对比的普通中位数相差太远。也可以更进一步解释成,聚合价格将始终位于发布者价格的第25–75 个百分位数内。这种稳健性意味着只要少于25% 的发布者是错误的,他们就无法完全确定聚合价格的位置。(请注意,普通中位数会给你更有利的保证,50% 而不是25%。这些界限之间的差异是由于某些发布者的信赖区间较宽而其他发布者在该区间内移动价格的情况。在这种情况下,我们实际上希望更严格的发布者有更大的影响力!)

请注意,此文章的所有结果都适用于发布者在计算中具有不同权重的情况。我们正在为发布者开发一个质押系统,以奖励他们提供准确的数据,在此系统中,每个发布者将拥有不同数量的份额。如果我们简单地将发布者的百分比替换为权重的百分比,则所有结果也适用于质押权重。

结论

这就是Pyth 的新聚合算法的完整介绍。算法本身很简单。每个发布者提交一个价格pᵢ 和信赖度c_i,我们用它来为发布者pᵢ — cᵢ、pᵢ、pᵢ + cᵢ 产生三票。所有票数的中位数就是聚合价,而围绕聚合价对称的第25–75 个百分位数是聚合信赖区间。此算法是普通中位数的信赖度调整变数,可产生直观的结果并具有可靠的理论特性。