巧用线性近似,实现高效链上套利

598 阅读5分钟

引言

在区块链世界里,去中心化金融(DeFi)给量化交易和套利提供了很多机会,但也带来了不少挑战。我们云梦量化科技团队在链上套利的过程中,遇到了一些实际问题,比如:

  • 复杂模型的实时性挑战:在高频交易中,复杂的价格-交易量模型使得套利的数学优化难以在短时间内实现,导致计算时间的浪费和开发成本的增加。
  • 多币种套利复杂:不同交易对之间的价格关系复杂,快速发现并利用套利机会变得很有挑战性。

为了应对这些问题,我们团队成员提出了一种简单的解决方案:利用线性近似来简化价格变化的计算。这个方法并不复杂,但在实际操作中非常有效。通过将非线性的价格曲线在当前价格附近进行线性化处理,我们可以更快、更准确地估计交易价格随交易量的变化,从而优化套利策略,实现高效的链上套利。

一、在套利场景中使用线性近似的合理性

在去中心化交易所(DEX)中,自动做市商(AMM)的算法决定了交易价格曲线通常是非线性的。例如,Uniswap V2 采用恒定乘积公式 xy=kx \cdot y = k,其中 xxyy 分别代表交易对中两种代币的储备量。然而,在套利交易中,套利者通常进行小额交易,以避免对市场价格产生较大影响并降低滑点成本。

由于交易量较小,AMM 的价格曲线在当前价格附近可以被线性近似,即价格相对于交易量的变化率(斜率)在小范围内近似为常数。使用线性近似具有以下优势:

  1. 简化计算:线性模型计算简便,适合实时估算和高频套利需求。由于线性近似在小额交易中带来的误差可以忽略不计,因此满足套利策略的精度要求。
  2. 优化交易策略:该模型允许直接将价差和交易量代入公式,快速计算单笔套利利润,从而找到最优交易量,提升套利效率。
  3. 广泛适用性:线性近似方法可推广至其他 AMM 模型,降低了对不同交易机制的依赖性,减少了开发成本,便于快速扩展至更多交易对。
  4. 方便多币种套利:在多币种、三角套利等复杂场景中,线性近似方法够便捷地计算不同交易对之间的相对价格偏差,从而实现原子性套利操作。

因此,在套利场景中使用线性近似来估计价格偏差是合理且实用的。

二、以 Uniswap V2 为例的公式推导

1. 恒定乘积假设

在 Uniswap V2 中,池子的储备量遵循恒定乘积公式,即:

Rquote×Rbase=kR_{\text{quote}} \times R_{\text{base}} = k

其中,RquoteR_{\text{quote}}RbaseR_{\text{base}} 是池子的储备量,kk 是一个常数。

为了简化计算,我们定义:

Bquote=Rquote10dquoteB_{\text{quote}} = \frac{R_{\text{quote}}}{10^{d_{\text{quote}}}}
Bbase=Rbase10dbaseB_{\text{base}} = \frac{R_{\text{base}}}{10^{d_{\text{base}}}}

其中,dquoted_{\text{quote}}dbased_{\text{base}} 分别为报价代币和基础代币的小数位数(decimals)。

我们可以验证 BquoteB_{\text{quote}}BbaseB_{\text{base}} 也满足恒定乘积公式:

Bquote×Bbase=(Rquote10dquote)×(Rbase10dbase)=Rquote×Rbase10dquote+dbase=k10dquote+dbase=kB_{\text{quote}} \times B_{\text{base}} = \left(\frac{R_{\text{quote}}}{10^{d_{\text{quote}}}}\right) \times \left(\frac{R_{\text{base}}}{10^{d_{\text{base}}}}\right) = \frac{R_{\text{quote}} \times R_{\text{base}}}{10^{d_{\text{quote}} + d_{\text{base}}}} = \frac{k}{10^{d_{\text{quote}} + d_{\text{base}}}} = k'

因此,对于 BquoteB_{\text{quote}}BbaseB_{\text{base}},恒定乘积公式同样成立,只是常数 kk' 与原来的 kk 不同。

2. 无偏差汇率的计算

无偏差汇率指在交易量趋近于零时的理论汇率即当前市场不受交易影响的价格。

对于 Uniswap V2,在不考虑手续费的情况下,无偏差汇率 R0R_0 计算如下:

R0=BquoteBbaseR_0 = \frac{B_{\text{quote}}}{B_{\text{base}}}

考虑交易手续费费率 ff(例如 0.3%,则 f=0.003f = 0.003),实际的无偏差汇率应根据交易方向进行调整:

  1. 对于卖出基础代币(买入报价代币):

    R0sell=BquoteBbase×(1f)R_0^{\text{sell}} = \frac{B_{\text{quote}}}{B_{\text{base}}} \times (1 - f)
  2. 对于买入基础代币(卖出报价代币):

    R0buy=BquoteBbase÷(1f)R_0^{\text{buy}} = \frac{B_{\text{quote}}}{B_{\text{base}}} \div (1 - f)

3. 近似偏差率的推导

近似偏差率表示价格相对于交易量的变化率,即价格曲线在当前点的斜率。通过对 AMM 定价公式进行线性化处理,可以得到这一斜率。我们需要分别考虑买入和卖出两种情况。

3.1 买入基础代币(卖出报价代币)的情况

对于 Uniswap V2,考虑手续费的恒定乘积公式为:

(BbaseQbase)×(Bquote+(1f)×Qquote)=Bbase×Bquote(B_{\text{base}} - Q_{\text{base}}) \times (B_{\text{quote}} + (1 - f) \times Q_{\text{quote}}) = B_{\text{base}} \times B_{\text{quote}}

其中:

  • QbaseQ_{\text{base}}:购买的基础代币数量。
  • QquoteQ_{\text{quote}}:支付的报价代币数量。

从恒定乘积公式出发,我们可以得到:

Bquote+(1f)×Qquote=Bbase×BquoteBbaseQbaseB_{\text{quote}} + (1 - f) \times Q_{\text{quote}} = \frac{B_{\text{base}} \times B_{\text{quote}}}{B_{\text{base}} - Q_{\text{base}}}

实际成交的报价代币数量 QquoteQ_{\text{quote}} 为:

Qquote=11f(Bbase×BquoteBbaseQbaseBquote)Q_{\text{quote}} = \frac{1}{1 - f} \left(\frac{B_{\text{base}} \times B_{\text{quote}}}{B_{\text{base}} - Q_{\text{base}}} - B_{\text{quote}}\right)

实际成交价格 PactualP_{\text{actual}} 为:

Pactual=QquoteQbase=11f(BquoteBbaseQbaseBquoteQbase)P_{\text{actual}} = \frac{Q_{\text{quote}}}{Q_{\text{base}}} = \frac{1}{1 - f} \left(\frac{B_{\text{quote}}}{B_{\text{base}} - Q_{\text{base}}} - \frac{B_{\text{quote}}}{Q_{\text{base}}}\right)

通过对 PactualP_{\text{actual}} 关于 QbaseQ_{\text{base}} 求导,并在 Qbase=0Q_{\text{base}} = 0 处取值,得到买入方向的近似偏差率 kbuyk_{\text{buy}}

kbuy=1Bbasek_{\text{buy}} = \frac{1}{B_{\text{base}}}

3.2 卖出基础代币(买入报价代币)的情况

类似地,对于卖出基础代币的情况,恒定乘积公式为:

(Bbase+(1f)×Qbase)×(BquoteQquote)=Bbase×Bquote(B_{\text{base}} + (1 - f) \times Q_{\text{base}}) \times (B_{\text{quote}} - Q_{\text{quote}}) = B_{\text{base}} \times B_{\text{quote}}

从恒定乘积公式出发,我们可以得到:

BquoteQquote=Bbase×BquoteBbase+(1f)×QbaseB_{\text{quote}} - Q_{\text{quote}} = \frac{B_{\text{base}} \times B_{\text{quote}}}{B_{\text{base}} + (1 - f) \times Q_{\text{base}}}

实际成交价格 PactualP_{\text{actual}} 为:

Pactual=QquoteQbase=BquoteQbaseBbase×BquoteQbase×(Bbase+(1f)×Qbase)P_{\text{actual}} = \frac{Q_{\text{quote}}}{Q_{\text{base}}} = \frac{B_{\text{quote}}}{Q_{\text{base}}} - \frac{B_{\text{base}} \times B_{\text{quote}}}{Q_{\text{base}} \times (B_{\text{base}} + (1 - f) \times Q_{\text{base}})}

现在我们对 PactualP_{\text{actual}} 关于 QbaseQ_{\text{base}} 求导。使用商数法则和链式法则,我们可以得到:

dPactualdQbase=ddQbase(BquoteQbaseBbase×BquoteQbase×(Bbase+(1f)×Qbase))=BquoteQbase2+Bbase×Bquote×(Bbase+2(1f)×Qbase)Qbase2×(Bbase+(1f)×Qbase)2\begin{aligned} \frac{dP_{\text{actual}}}{dQ_{\text{base}}} &= \frac{d}{dQ_{\text{base}}} \left(\frac{B_{\text{quote}}}{Q_{\text{base}}} - \frac{B_{\text{base}} \times B_{\text{quote}}}{Q_{\text{base}} \times (B_{\text{base}} + (1-f) \times Q_{\text{base}})}\right) \\ &= -\frac{B_{\text{quote}}}{Q_{\text{base}}^2} + \frac{B_{\text{base}} \times B_{\text{quote}} \times (B_{\text{base}} + 2(1-f) \times Q_{\text{base}})}{Q_{\text{base}}^2 \times (B_{\text{base}} + (1-f) \times Q_{\text{base}})^2} \end{aligned}

Qbase=0Q_{\text{base}} = 0 处取值,得到卖出方向的近似偏差率 ksellk_{\text{sell}}

ksell=limQbase0dPactualdQbase=Bquote×(1f)2Bbase2k_{\text{sell}} = \lim_{Q_{\text{base}} \to 0} \frac{dP_{\text{actual}}}{dQ_{\text{base}}} = -\frac{B_{\text{quote}} \times (1 - f)^2}{B_{\text{base}}^2}

这个结果显示,ksellk_{\text{sell}} 是一个负值,意味着当卖出基础代币(增加 QbaseQ_{\text{base}})时,价格会下降。这与我们的直觉相符:当市场上某种资产的供应增加时,其价格通常会下降。

这些推导过程展示了如何从恒定乘积公式出发,得到实际成交价格的表达式,并最终推导出近似偏差率。这些结果为我们构建线性近似模型提供了理论基础。

4. 线性近似公式

综合以上推导,我们可以得到价格与交易量之间的线性近似关系:

  1. 买入基础代币(卖出报价代币):

    P(Qquote)=R0buy+kbuy×QquoteP(Q_{\text{quote}}) = R_0^{\text{buy}} + k_{\text{buy}} \times Q_{\text{quote}}
  2. 卖出基础代币(买入报价代币):

    P(Qbase)=R0sell+ksell×QbaseP(Q_{\text{base}}) = R_0^{\text{sell}} + k_{\text{sell}} \times Q_{\text{base}}

其中:

  • P(Q)P(Q):交易量为 QQ 时的实际成交价格。
  • R0buyR_0^{\text{buy}}R0sellR_0^{\text{sell}}:分别为买入和卖出方向的无偏差汇率,代表当前市场价格。
  • kbuyk_{\text{buy}}ksellk_{\text{sell}}:分别为买入和卖出方向的近似偏差率,表示价格对交易量的敏感度。

这些公式表明,在小额交易范围内,价格与交易量之间存在线性关系,但斜率和截距会根据交易方向而有所不同。

四、复杂AMM模型中的通用解法

在处理复杂的 AMM 模型时,直接推导价格偏差公式可能较为浪费开发成本。此时,可以采用更为通用的方法,通过多方向的询价来构建线性模型,从而实现价格与交易量之间的线性近似。

1. 方法步骤

  1. 获取报价:在当前池子状态下,针对买入和卖出两个方向,各选择两个较小的交易量,分别获取对应的成交价格。具体来说:

    • 买入方向
      • 交易量 Q1buyQ_{1}^{\text{buy}},成交价格 P1buyP_{1}^{\text{buy}}
      • 交易量 Q2buyQ_{2}^{\text{buy}},成交价格 P2buyP_{2}^{\text{buy}}
    • 卖出方向
      • 交易量 Q1sellQ_{1}^{\text{sell}},成交价格 P1sellP_{1}^{\text{sell}}
      • 交易量 Q2sellQ_{2}^{\text{sell}},成交价格 P2sellP_{2}^{\text{sell}}
  2. 计算斜率和截距:利用两点确定直线的方法,分别为买入和卖出方向计算近似偏差率 kk 和无偏差汇率 R0R_0

    • 买入方向

      kbuy=P2buyP1buyQ2buyQ1buyk_{\text{buy}} = \frac{P_{2}^{\text{buy}} - P_{1}^{\text{buy}}}{Q_{2}^{\text{buy}} - Q_{1}^{\text{buy}}}
      R0buy=P1buykbuy×Q1buyR_0^{\text{buy}} = P_{1}^{\text{buy}} - k_{\text{buy}} \times Q_{1}^{\text{buy}}
    • 卖出方向

      ksell=P2sellP1sellQ2sellQ1sellk_{\text{sell}} = \frac{P_{2}^{\text{sell}} - P_{1}^{\text{sell}}}{Q_{2}^{\text{sell}} - Q_{1}^{\text{sell}}}
      R0sell=P1sellksell×Q1sellR_0^{\text{sell}} = P_{1}^{\text{sell}} - k_{\text{sell}} \times Q_{1}^{\text{sell}}

2. 应用线性模型

得到 kbuyk_{\text{buy}}, R0buyR_0^{\text{buy}}, ksellk_{\text{sell}}, 和 R0sellR_0^{\text{sell}} 后,可以分别为买入和卖出方向构建价格与交易量的线性关系:

  • 买入方向

    P(Qbuy)=R0buy+kbuy×QbuyP(Q_{\text{buy}}) = R_0^{\text{buy}} + k_{\text{buy}} \times Q_{\text{buy}}
  • 卖出方向

    P(Qsell)=R0sell+ksell×QsellP(Q_{\text{sell}}) = R_0^{\text{sell}} + k_{\text{sell}} \times Q_{\text{sell}}

通过这种方法,可以分别为买入和卖出方向建立精确的线性模型,从而更准确地估计价格变化,优化套利策略。

3. 方法优势

  • 准确性:基于实际报价数据,能够反映当前市场的真实价格变化趋势。
  • 灵活性:适用于各种复杂的定价模型,无需深入了解 AMM 的内部机制。
  • 经济性:只需进行四次小额询价(买入和卖出两个方向各两次),时间和资源成本较低。
  • 适用性强:该方法不仅适用于传统的恒定乘积 AMM,还能有效应用于集中流动性 AMM 及其他复杂模型。

五、总结

在链上套利交易中,利用线性近似方法估计价格偏差具有重要的实用价值:

  • 提升效率:线性模型计算简洁,便于实时决策,加快了套利交易的响应速度。
  • 适用广泛:无论是传统的恒定乘积 AMM,还是集中流动性 AMM,甚至更复杂的模型,都能通过线性近似有效地估计价格变化,节约了开发成本。
  • 降低风险:通过精确估计价格对交易量的敏感度,套利者可以优化交易量,降低滑点和市场风险。
  • 助力复杂套利策略:在多币种、跨平台的套利策略中,线性近似方法能够快速评估不同交易对的价格偏差,支持复杂套利操作的实现。

云梦量化科技将继续深入研究和应用这些方法,不断优化链上套利策略,为客户创造更大的价值。