Crypto DEX三角套利(2)

现在我有了所有交易所、资产和报价的图。我需要找到套利机会。问题归结为在图中找到某处,当我遍历X条边后,我将拥有比开始时更多的源节点。

Crypto DEX三角套利(2)
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK

自从上次更新以来,已经过去了一段时间,我有很多事情在忙,因此我把整个套利机器人重写了,让它更加高效。这次更新会涵盖很多内容,所以我可能需要分成三部分。这部分将详细说明如何让这种东西在大规模下运作。

1、回顾

在上一部分中,我讨论了从DEX(这里以Tinyman为例)获取池子,并将每种资产的报价放入矩阵中。然后我会计算每种资产的排列组合,并使用矩阵来获取报价,即:

Path (0, 31566704, 312769) Close to Profit!

First Swap Quote: SwapQuote(swap_type='fixed-input', amount_in=ALGO('20'), amount_out=USDC('14.394919'), swap_fees=ALGO('0.06'), slippage=0.01)

Second Swap Quote: SwapQuote(swap_type='fixed-input', amount_in=USDC('14.25097'), amount_out=USDt('14.260552'), swap_fees=USDC('0.042752'), slippage=0.01)

Third Swap Quote: SwapQuote(swap_type='fixed-input', amount_in=USDt('14.117947'), amount_out=ALGO('19.402954'), swap_fees=USDt('0.042353'), slippage=0.01)

Final Amount Of ALGO('19.208925')

这里的问题是,收集池子是通过分页API完成的,对于Tinyman来说,每次请求可以得到10个池子,总共575个池子!那就是58次请求,然后我还需要再次向Algorand区块链请求池对象,即58 * 2次请求,总共116次。如果每个网络请求花费1秒,那就要2分钟,而且我甚至还没有获取到报价!

矩阵查找的时间复杂度最坏情况下是三次方,用大O表示就是O(n³),这显然无法扩展。

2、异步获取

当我刚开始这个项目时,它更像是一个概念验证,我没有期望能赚到钱,但现在我已经部署了它,我需要更快的查找速度,这意味着我必须采用异步方式。如果你还没有尝试过异步Python,那你错过了好东西。这是一个关于这个主题的好视频

基本上,我可以同时发起所有的58个HTTP请求。然后我使用多进程池来调用区块链并检索池对象。

我已经为AlgoFi和PactFi这两个Algorand上的其他DEX复制了这种行为。然后我使用与获取池对象相同的多进程技巧来获取报价。

3、图论与套利

现在我可以把这些都放入一个矩阵中,我可以将我的二维矩阵转换为三维,其中第三维将是交易所。相反,这看起来更像一个图问题,而不是做矩阵查找,我可以遍历一条路径,从而节省多次矩阵查找。

3.1 将其可视化为图

没有比可视化更好的方法来解释这一点了,所以这里有AlgoFi和PactFi的交换图(Tinyman有点太大了..)

交换网络

PactFi的边是红色的,AlgoFi的边是蓝色的。你可以通过它们的连接看到哪些池子可用。

我还可以点击一条边和一种资产。我很快会谈到权重。

3.2 套利作为图问题

现在我有了所有交易所、资产和报价的图。我需要找到套利机会。这部分不会详细说明,因此需要对图论有一定的熟悉。

问题归结为在图中找到某处,当我遍历X条边后,我将拥有比开始时更多的源节点。例如,如果我一开始有1个ALGO,我需要找到一条路径,在遍历之后能得到超过1个ALGO。我需要找到正循环,这些循环在你越遍历它们时,路径的成本不断增加。

汇率正循环示例

如上所示,每次我们遵循这个循环时,我们都会增加起始权重,即输出量。这是一个正循环。

3.3 进入贝尔曼-福特算法

不幸的是,没有算法可以检测正循环,因为对于最短路径问题来说,正循环永远不会被发现,因为你试图减少成本或最小化权重。另一个问题是,最短路径算法都不乘以权重,而是加法。

幸运的是,我们可以使用一些数学技巧来帮助我们。贝尔曼-福特是一种算法,用于在给定每条边X权重的情况下,找到源节点和目标节点之间的最短路径。它通过将路径的权重相加得到总路径权重来实现这一点。贝尔曼-福特可以检测负循环,这使它非常适合我们的用例。它通过找到趋于负无穷的路径来检测负循环,而我们正在寻找趋于正无穷的路径。贝尔曼-福特这样做是因为如果一个循环趋于负无穷,最短路径永远无法找到,它只会不断遍历这个循环。

因此,利用这些数学技巧,我们可以改变当前寻找套利的方法(即将每个汇率相乘),改为使用加法,这就是贝尔曼-福特所使用的。以下是一个套利机会的例子。

如果我们对每个汇率取自然对数,我们可以将其变为ln(a) + ln(b) + ln(c)

自然对数示例

然后,如果我们将每个对数乘以-1,我们现在就使用负循环来判断是否存在套利机会。

贝尔曼-福特示例

你可以看到当我们遍历这个循环时,我们越来越接近负无穷,这正是我们想要检测的信号套利。

贝尔曼-福特的执行时间是O(V*E),其中V是顶点,E是边。比我们之前的矩阵查找快得多。

4、最终产品

为了将这一切结合起来,目前的流程如下。

输出看起来像这样

Found a winning Cycle… (404044168, 0, 404044168) via [<Exchange.ALGOFI: 2>, <Exchange.TINYMAN: 1>] with profit 0.19299999999999962

代码随后会创建交易并执行。这里还有一些工作要做——更好的方法是从AlgoFi借出闪电贷款,使用它来增加初始投资金额并获得更高的回报。这将在下一章中介绍!


原文链接:Triangular Arbitrage With Crypto DEX’s: Part Two

DefiPlot翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。
通过 NowPayments 打赏