这是 Omer Arbnom Yanar 的一篇客座文章,他是一位独立研究者。他在本文中表达了对网格交易的看法,这并不代表是 DeGate DAO 的观点。但欢迎你在 DeGate 上进行免费的网格策略交易。
在当今的金融世界中,有许多交易策略迎合不同风险水平的交易者。有些策略需要交易者全身心投入,而其他策略则可以自行运行。网格交易是一种容易自动化的策略。
在这篇文章中,我们将讨论网格交易的主要方面,并在理论上和基于过去的价格数据比较网格交易头寸和集中流动性头寸。以下是内容列表:
网格交易的基本理念是在价格图表上设置一个网格,并根据该网格进行买入和卖出订单。网格交易有两种主要方式。第一种被称为逆势网格交易。在这种方法中,您会根据当前趋势放置买入和卖出订单。这种方法涉及在价格上升时卖出,价格下跌时买入。当价格在一定范围内上下波动时,这种方法运作良好,让您以低价买入和高价卖出。第二种方法被称为趋势网格交易。在这种方法中,您会下单跟随趋势。当价格上涨时,您会持续买入,增加您的投资。当价格下跌时,您开始卖出。这种方法会创建大量的趋势跟随头寸,需要及时采取行动以确保在趋势变化时获利。这使得它更难以完全自动化。在这篇文章中,我们将重点关注逆势方法,我们将其称为普通网格交易。
为了更好地理解普通网格交易,让我们举个例子。假设我们有一个设置,在 1300 美元到 1306 美元之间有 6 个网格。当价格从下方触及一个网格时,它会触发一个卖出订单,那个网格就成为一个新的等待线。同时,一个新的买入订单会被放置在之前的等待线上。如果价格从上方触及一个网格,就会触发一个买入订单,设置一个新的等待线,然后在之前的等待线上放置一个卖出订单。
每格数量是指在通过网格时交易的资产数量。例如,如果每个网格交易 1 个 ETH,Alice 需要初始的 3 个 ETH 和 3903 个 USDC(将每个网格的 1302、1301 和 1300 加起来)来建立她的网格交易设置。通过设置这个网格,Alice 因价格波动获得了 3 个 USDC 的利润。
网格交易与在 AMM 池中提供集中流动性(例如 Uniswap V3)有一些相似之处,其中头寸设置在特定范围内。这种相似性从 DEX 和用户的角度来看都成立。
从 DEX 的角度来看,向 AMM 池中添加流动性通过减少滑点来增强交易效率,这要归功于 X*Y=K 公式。类似地,建立网格交易头寸通过放置限价订单在每个网格点添加流动性,有助于市场参与者进行有效的交易。
从用户的角度来看,这两种策略都通过在特定的价格范围内交易获得盈利的机会。在池子中提供流动性可以从该范围内的所有交易中获得费用,而网格交易的利润来自网格水平上的价格波动。然而,这两种方法都容易受到临时损失的影响。这是因为它们涉及在价格上涨时卖出资产,在价格下跌时买入资产,这可能导致头寸的总价值低于简单持有资产的价值。然而,如果价格回到起点,价格变化带来的损失就会被抵消,利润就会实现。然而,并不能保证价格会回归,因此持仓者必须积极管理潜在的损失。
流动性提供者和网格交易者都面临临时损失的风险,但损失程度并不相同。假设 Alice 建立了一个流动性头寸,而 Bob 在相同的价格范围内并以相等的投资采用了网格交易策略。在这种情况下,Bob 可能会遭受较小的临时损失。这是因为随着价格上涨,像 Alice 这样的流动性提供者会在每次增量价格变化时卖出他们的资产,而像 Bob 这样的网格交易者则等待特定的价格点执行他们的销售。同样,在价格下跌时,Alice 不断地回购,但 Bob 等待预定的价格进行购买。这种战略上的差异是为什么在类似条件下,网格交易者通常面临比流动性提供者更少的临时损失的原因。
此外,两种持仓者的盈利驱动因素存在明显的差异。对于流动性提供者来说,交易量对于产生费用收入至关重要。相反,对于像 Bob 这样的网格交易者,交易量的影响较小;他们的利润取决于网格内的价格波动,这使得他们可以低买高卖。
然而,优化网格大小和价格范围并不是一件简单的事情。增加网格数量可能会导致更多的交易,但也可能会降低每个网格的利润,因为交易规模减小,网格宽度变窄。此外,如果没有价格波动,增加交易次数可能会导致更高的平均成本。例如,直接以 $2200 购买 1 个 ETH 比以 $2250 购买 0.5 个 ETH 再以 $2200 购买另外 0.5 个 ETH 更具成本效益。相反,如果价格在 $2200-2250 左右波动,包含更多网格的策略会获得更好的结果。因此,最佳的网格设置严重依赖于当前的市场条件。值得注意的是,做市商费用也会起一定作用,尽管许多订单簿型 DEX 不收取做市商费用。
现在,让我们谈谈风险和潜在损失。假设 ETH 价格为 2500 美元,Alice 在 2000 美元到 3000 美元之间设置了一个网格交易范围,包括 100 个网格,每个网格交易 0.1 个 ETH。为了放置卖单,她需要 5 个 ETH(50*0.1),而买单则需要 11225 美元,计算方法为 0.1 *(2490+2480+...+2010+2000)。假设 Alice 设置了止损订单分别在 3000.01 美元和 1999.99 美元,以限制价格超出范围时的损失。她在 2000 美元至 3000 美元范围内面临的主要风险是临时损失。
在我们深入计算之前,让我们先了解一下什么是临时损失。假设价格上涨到 2800 美元,填补了她 30 个卖单,意味着她以 2510 到 2800 的价格范围卖出了 0.1 个 ETH。结果,她以 3 个 ETH(0.130)换取了 7965 美元的 USDC。因此,她以 7965 美元的价格卖出了她的 3 个 ETH。考虑到当前价格为 2800 美元,她的损失为 435 美元(32800-7965)。
为了概括 Alice 的网格交易策略中临时损失的概念,考虑她在 2510 美元至 2800 美元价格范围内的一系列卖单,跨越了 29 个网格。如果 Alice 在初始网格价格 2510 美元时不卖出 0.1 个 ETH,而是等到 2800 美元时再卖出,她将获得 29 个网格 *(10*0.1)=29 美元的利润。这个错失的利润代表了她第一笔交易的临时损失,总额为 29 美元。随着 Alice 继续在每个后续网格中卖出,每笔交易的临时损失会逐渐减少 1 美元,最终导致总临时损失为 435 美元,计算方法是 29+28+27+...+2+1。重要的是要注意,最后一笔交易不会增加临时损失,这表明随着每个网格的通过,临时损失会减少。这个原则适用于价格方向的正负变动,确保了对于正价格变动和负价格变动,计算方法的对称性。
进一步概括,让 'd' 表示网格价格之间的差距,'q' 表示每个网格的数量。如果价格从起始点移动 'n' 个网格,那么当前的临时损失是 dq(1+2+...+n-1) = dq(n-1)n/2。因此,如果距离起始点最远的网格是 'm' 个网格,最大损失将是 dq*(m-1)m/2。在给定的例子中, 'd' 是 10, 'q' 是 0.1, 'm' 是 50,那么在设置了止损订单的情况下,Alice 可能面临的最大临时损失是 100.104950/2 = 1225 美元。
现在,让我们考虑在价格随机波动的情况下的盈利情景。在建模随机价格波动之前,重要的是要注意,如果卖单在买单之后立即执行,Alice 将获得 d*q 美元的利润,其中'd' 是网格之间的差异,'q' 是每个网格的数量。如果这些配对不是连续的,例如,如果多个买单被下跌趋势触发,那么没有价格反转允许 Alice 卖出她购买的资产,她就会面临临时损失。然而,如果价格恢复,她本质上是以高一格的价格卖出了每个购买的资产,从而减少了损失。这个原则也适用于上涨趋势。下面的示例演示了如何匹配买入和卖出点。
此外,请注意,网格之间的价格波动对我们来说并不重要,因为在这些区域内不会发生交易。我们的重点仅在于受价格变化影响的网格。让我们为随机价格波动开发一个简化模型。为了方便理解,我们假设网格数量为偶数,起始位置在中心,买单和卖单平衡。这个模型可以用于不对称的起始位置。在这个设置中,如果价格从下方到达一个网格,Alice 卖出资产;如果价格从上方到达一个网格,她买入资产。由于我们的兴趣在于价格变化的方向和受影响的具体网格水平,我们可以使用 -1 和 1 的序列来总结价格变动。序列的长度对应于价格触及的网格数量。为了构建这个序列,我们观察价格的变动:移动到起始点上方的第一个网格被标记为 1,移动到更低的网格被标记为 -1。这种方法使我们能够将价格动态性封装在一个 -1 和 1 的序列中,简化了我们的分析。让我们重新讨论之前的例子来说明这一点。
在这种情况下,到达了六个网格,所以序列将由六个元素组成。我们的序列,代表这些移动,将是[-1, 1, 1, -1, -1, 1]。
当我们使用一系列 -1 和 1 来表示位置时,一个重要的因素要考虑范围。有些序列可能会暗示价格波动超出我们指定的范围。要识别这种情况,我们需要检查序列的累积和。这使我们能够跟踪价格变动穿过的每个网格。例如,考虑序列[1, 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1]的部分和。部分和的第 n 项是原始序列的前 n 项的和。在这种情况下,累积和是[1, 2, 1, 0, -1, 0, 1, 2, 1, 0, 1, 0, 1, 0, 1, 2, 1, 2],表示价格在起始点以下两个网格范围内波动,并在起始点以上三个网格范围内波动。
使用 -1,1 序列的盈亏计算示例
很明显,对于给定的网格设置,任何价格变动都可以用序列来表示。尽管单个序列可能对应多个价格变动,但这并不影响我们,因为我们的重点仅在于价格触及的网格。因此,通过分析序列,我们可以预测网格设置和价格变动的每一个可能的结果。让我们探讨如何根据其序列计算头寸的盈亏(PnL)。为了保持一致性,我们将以 Alice 的设置为例。初始价格设定为 2500 美元,在 2000 美元至 3000 美元的范围内,分布在 100 个网格上。每个网格持有 0.1 个 ETH 的数量,初始余额包括 5 个 ETH 和 11225 美元的 USDC。
考虑一个 -1 和 1 的序列,如[1, 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1],有 18 个项,其中 10 个是 1,8 个是 -1。通过配对 1 和 -1,我们剩下两个未配对的 1,表示完成了 8 次交易,最终价格比起始点高了 2 个网格。由于每个网格代表 10 美元的变动,而 Alice 每个网格交易 0.1 个 ETH,她每笔交易赚取 1 美元,总共赚取了 8 美元的利润。
要计算盈亏(PnL),让我们从 Alice 的初始资产开始:以 2500 美元的价格持有 5 个 ETH 和 11225 美元的 USDC,总价值为 23725 美元。如果最终价格比起始价格高 2 个网格,介于 2520 美元和 2530 美元之间,我们假设为 2520 美元。卖出了 0.2 个 ETH 后,她的最终资产是 4.8 个 ETH 和 11728 美元的 USDC,她的头寸价值为 23824 美元,再加上 8 美元的交易利润,总价值为 23832 美元。因此,她从这项策略中的 PnL 是 107 美元。
考虑到临时损失,如果 Alice 简单地持有她的初始资产,以 2520 美元的 ETH 价格,她的价值将为 23825 美元。因此,与仅仅持有相比,她的策略产生了 1 美元的临时损失和 100 美元的利润,使她的策略比仅仅持有更有盈利性,净收益为 99 美元来自价格波动和 8 美元来自交易,使她的策略比仅仅持有盈利了 7%。
分析使用 Python 的 -1,1 序列
上面的示例说明了网格交易策略如何胜过简单持有,尽管情况并非总是如此。为了探索各种情景,我准备了一个 GitHub 仓库(https://github.com/arbnom/Grid-Trading-Strategy-Analysis),其中包含三个 Python 脚本,考虑到价格范围之外的止损订单,为不同的交易结果提供见解。
第一个脚本,“longest_valid_subsequence_result.py”,分析给定位置的情况,包括 -1,1 序列、初始网格位置、网格数量、每个网格的数量和网格之间的距离等参数。它首先检查价格是否超出范围;如果是,脚本将确定范围内的最长子序列。然后计算序列的长度和总和,接着根据总和和 -1,1 配对的实现利润计算临时损失。结果表示实现利润与临时损失之间的差异,提供了持有和采用网格策略而不是头寸的盈亏(PnL)之间的比较。要确定 PnL,我们必须结合价格数据,我们将很快解决这个问题。
“longest_valid_subsequence_result.py”专门评估了单个位置的结果。对于更广泛的分析,我们需要额外的数据。术语“期望”指的是结果的加权平均值,其中权重是这些结果的概率。例如,在一个游戏中,掷一个公平的六面骰子可以赢得相当数量的 ETH,期望结果是 3.5 个 ETH,表示如果游戏玩多次的话,平均收益是多少。
第二个和第三个脚本计算了随机网格交易头寸的期望,接受诸如网格数量、命中网格、每个网格的数量和网格之间的距离之类的输入。“average_sequence_upto_length.py”生成范围内和指定长度的所有序列,分析它们与持有的结果并对结果进行平均。
而“average_sequence_fixed_length.py”执行类似的功能,但专注于固定长度的序列,对策略结果与持有进行了彻底的检查。
这些工具在我们知道网格设置和价格变动的序列长度时很有用,它们可以让我们在各种市场条件下估计交易策略的预期结果。然而,它们简化了市场动态,假设每种情况都是等可能发生的,忽略了趋势行为。尽管存在这种限制,这些方法仍然可以发现有价值的见解。
例如,如果序列长度超过了网格数量,那么预期结果会一直保持正值。这是因为潜在的临时损失受到网格数量的限制,计算方法为 dq(n-1)n/2,其中 d 是网格间距,q 是每个网格的数量,n 是从起始位置到终点位置的网格数。由于从开始到结束的最大步数是网格数,而对于长度为 L 的序列,实现利润等于 dq(L-n)/2,所以在保持网格数量的情况下延长序列长度会增加实现利润。
另一个有趣的点是,如果序列长度等于或小于网格数量,则预期结果将为零,这一点可以通过组合学来证明。对于长度为 k 的序列,从起始位置可能的步数是 k、k-2、k-4、k-6 等。这个原则适用于“average_sequence_fixed_length.py”和“average_sequence_upto_length.py”。
因此,让价格触及的网格数多于总网格数会将预期结果从中性转变为正值,对于假设市场运动是随机的交易者来说是有利的。然而,随着序列变得越来越长,计算需求也越来越高,因为可能的序列数量增加了。
让我们来探讨如何计算盈亏(PnL)。我建立了一个 GitHub 仓库,可以根据历史数据进行策略回测,网址是 https://github.com/arbnom/Grid-Trading-Backtest-Tool。为了计算头寸的 PnL,我们需要详细信息,如价格历史、价格范围、网格数量、每个网格的数量,以及持有头寸的持续时间。该仓库包括两个部分:一个是具有止损条件的策略,另一个是没有止损条件的策略。
专注于带有止损条件的代码,我们从“calc_of_grids.py”开始,该脚本根据网格范围和数量确定网格值。这一步骤奠定了基础。接下来,我们根据价格数据生成反映价格变动的 -1,1 序列。
“generate_with_stoploss.py”首先概述了网格范围。然后,利用价格数据,它根据价格触及更高网格时标记为'1',当价格跌破网格时标记为'-1',生成 -1,1 序列。如果价格超出预定义范围,序列生成就会停止。相比之下,没有止损条件的对应代码会等待价格重新进入范围后再继续序列。最后,它通过考虑计划订单和每个网格的数量来估算所需的初始资产。
这种方法提供了一种结构化的方法来分析网格交易策略的潜在结果,考虑了特定价格范围内的波动,并采用止损策略来降低风险。
一旦我们有了 -1,1 序列,计算 PnL 就变得简单了。“result_with_stoploss.py”脚本首先使用初始资产金额和初始价格确定头寸的初始价值。然后,在每次交易后,它更新 ETH 和 USDC 的价值,对应于序列中的每个元素。利用序列和网格值,脚本还计算最终的 ETH 价格,简化了确定头寸最终价值的过程。PnL 是最终值与初始值之间的差异。为了进行更全面的分析,该脚本还计算了临时损失和实现利润。
此外,我们还有一个名为“debug_with_stoploss.py”的诊断脚本,执行与“result_with_stoploss.py”相同的计算,但同时输出每一步。这个功能特别有用,可以帮助识别和解决可能出现的任何问题。
这些分析中使用的数据来自 TradingView,并涉及到币安交易所的 ETH/USDC 交易对,时间跨度从 2024 年 01 月 22 日 00:00:00Z 到 2024 年 02 月 07 日 15:49:00Z。要更新数据集,从 2024 年 02 月 07 日 15:45:00Z 开始,格式为时间、开盘价、最高价、最低价、收盘价、成交量和成交量 MA。我对每一分钟的最高价和最低价进行了平均。要将这些数据转换为所需的格式,您可以使用 Python 或另一种编程语言。有了 GPT-4,您可以直接输入数据,它将生成所需的 CSV 文件。
对于 Uniswap V3 的流动性提供者而言,其类似于管理一个网格交易头寸。通过开发了一个用于回测网格交易策略的工具,我们现在可以将其绩效与 Uniswap V3 的绩效进行比较。为了获取 Uniswap 数据,我利用了 Revert Finance。Revert Finance 的一个小缺点是,它每小时更新一次数据,而我们的 CSV 文件包含按分钟计的价格信息。然而,在较长的分析周期内,这种差异变得可以忽略不计。
在我们进行比较之前,设定我们的期望非常重要。假设价格保持在范围内,Uniswap V3 的效率随着范围变窄而提高。范围越窄,提供的流动性用于交易的比例就越高,从而产生手续费收入。相反,网格交易头寸的表现取决于实现利润的数量、网格之间的距离和每个网格的数量。如果缩小范围,即使实现利润的数量增加,也可能会通过减少网格之间的距离和每个网格的数量而对网格交易头寸产生负面影响。然而,我们不能一概而论,因为 UniV3 的效率受到交易量的显着影响。如果交易量明显较低,则在狭窄范围内持有头寸可能会产生与高交易量的广泛头寸相当的利润。同样,网格交易的表现与价格波动密切相关。如果市场波动不足,即 -1,1 序列较短,网格之间的间距和每个网格的数量可能对 PnL 几乎没有影响。
为了比较 Uniswap V3 和网格交易,我考虑了四种不同的持续时间:14 天、7 天、48 小时和 24 小时,每种情况下有三种范围类型:安全、中性和激进。安全范围确保价格始终保持在范围内,中性范围意味着价格偶尔会超出范围,而激进范围则是如此狭窄,以至于价格经常会超出范围。鉴于这些策略的性质,精确地对齐初始金额是具有挑战性的,但我设法将它们保持在 0.03% 的差异范围内,这意味着如果一个头寸的初始价值为 $50,000,另一个头寸的初始价值在 $49,985 到 $50,015 之间。
对于 Uniswap V3 的流动性提供者而言,其类似于管理一个网格交易头寸。通过开发了一个用于回测网格交易策略的工具,我们现在可以将其绩效与 Uniswap V3 的绩效进行比较。为了获取 Uniswap 数据,我利用了 Revert Finance。Revert Finance 的一个小缺点是,它每小时更新一次数据,而我们的 CSV 文件包含按分钟计的价格信息。然而,在较长的分析周期内,这种差异变得可以忽略不计。
在我们进行比较之前,设定我们的期望非常重要。假设价格保持在范围内,Uniswap V3 的效率随着范围变窄而提高。范围越窄,提供的流动性用于交易的比例就越高,从而产生手续费收入。相反,网格交易头寸的表现取决于实现利润的数量、网格之间的距离和每个网格的数量。如果缩小范围,即使实现利润的数量增加,也可能会通过减少网格之间的距离和每个网格的数量而对网格交易头寸产生负面影响。然而,我们不能一概而论,因为 UniV3 的效率受到交易量的显着影响。如果交易量明显较低,则在狭窄范围内持有头寸可能会产生与高交易量的广泛头寸相当的利润。同样,网格交易的表现与价格波动密切相关。如果市场波动不足,即 -1,1 序列较短,网格之间的间距和每个网格的数量可能对 PnL 几乎没有影响。
为了比较 Uniswap V3 和网格交易,我考虑了四种不同的持续时间:14 天、7 天、48 小时和 24 小时,每种情况下有三种范围类型:安全、中性和激进。安全范围确保价格始终保持在范围内,中性范围意味着价格偶尔会超出范围,而激进范围则是如此狭窄,以至于价格经常会超出范围。鉴于这些策略的性质,精确地对齐初始金额是具有挑战性的,但我设法将它们保持在 0.03% 的差异范围内,这意味着如果一个头寸的初始价值为 $50,000,另一个头寸的初始价值在 $49,985 到 $50,015 之间。
我首先将呈现一个仅比较 PnL 的表格,详细的仓位信息将在文章末尾提供。让我们来看一下 PnL 对比表格。
以上分析表明,总体上网格交易在所考察的时间段内表现优异,这表明价格波动在这些时期内发挥了比交易量更重要的作用。然而,仅凭这些数据还不足以得出网格交易在整体上更为优越的结论。七周的分析突显了当 Uniswap V3 设置为高交易量范围时可以表现出色。由此可以推断,如果能准确预测高交易量范围,Uniswap V3 往往会产生更好的结果;否则,网格交易策略是一个可行的替代方案。
对于那些对比较感兴趣的人,我提供了两种策略的详细分析。需要注意的是,Revert Finance 根据初始金额到最终金额的 USD 价值变化计算了临时损失。然而,准确评估临时损失需要将初始资产金额的当前价值与最终金额进行比较。因此,在下面的表格中,临时损失已经被准确重新计算。
这份分析提供了对网格交易和 Uniswap V3 策略的细致观点,考虑到它们对市场动态(如交易量和价格波动)的依赖性。所提供的表格旨在促进全面比较,包括对准确测量临时损失的修正。
14 天 - 安全
14 天 - 中性
14 天 - 激进
7 天 - 安全
7 天 - 中性
7 天 - 激进
48 小时 - 安全
48 小时 - 中性
48 小时 - 激进
24 小时 - 安全
24 小时 - 中性
24 小时 - 激进
总结一下,我们从头到尾地研究了网格交易,将其与 Uniswap V3 等集中流动性进行了比较,并利用过去的价格数据来看它们的表现。我们发现,网格交易可以运作良好,特别是当价格持续上下波动时。但并不总是最佳选择。我们的七周研究表明,当交易量很大时,Uniswap V3 的表现可能更好。
那么,主要观点是什么?那就是网格交易和集中流动性都有可能成功。关键在于市场的行为。如果你擅长预测何时会有大量交易,那么 Uniswap V3 可能更好。但如果市场波动很大,那么网格交易可能是更好的选择。
最终,一切都取决于对市场的预测,选择最适合当前情况的策略。这篇文章应该能帮助你开始找出何时以及选择哪种策略。
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。