点击量:144
公式推导
假设当前价格是\(P_c\),我们选择在区间\([a,b]\)提供流动性\(L\),那么所需要的真实资产\(x\)和\(y\)分别是:
$$
\begin{align*}
& x = L (\frac{1}{\sqrt P_c} – \frac{1}{\sqrt P_b}) \\
& y = L (\sqrt P_c – \sqrt P_a)
\end{align*}
$$
我们定义:
- 不做LP而选择hold资产,那么hold资产的价值为:
$$
\begin{align*}
& V_{\text{hold}} = y + x * P
\end{align*}
$$
带入\(L\)和\(P_c\)可得:
$$
\begin{align*}
& V_{\text{hold}} = L (\sqrt P_c – \sqrt P_a) + L (\frac{1}{\sqrt P_c} – \frac{1}{\sqrt P_b}) \times P
\end{align*}
$$
- 做LP之后的资产价值:
$$
\begin{align*}
& V_{\text{lp}} = y’ + x’ * P
\end{align*}
$$
我们把这个公式里的\(x\),\(y\)以及\(P\)都转换成\(L\)和\(\sqrt P\)的形式:
$$
\begin{align*}
& V_{\text{lp}} = L (\sqrt P – \sqrt P_a) + P L (\frac{1}{\sqrt P} – \frac{1}{\sqrt P_b})
\end{align*}
$$
化简之后可得:
$$
\begin{align*}
& V_{\text{lp}} = 2L \sqrt P – L (\sqrt P_a + \frac{P}{\sqrt P_b})
\end{align*}
$$
但是这个公式只有在\(p_a \leq p<p_b\)的情况下才成立,而当价格超过这个区间时,一种资产会被完全换成另一种资产,且不再变化,直到价格再重新回来。考虑这两种情况,我就可以得到如下完整的公式:
$$
\begin{equation}
V_{\text{lp}}=
\begin{cases}
2L \sqrt P – L (\sqrt P_a + \frac{P}{\sqrt P_b})& P_a \leq P \le P_b \\
L (\sqrt P_b – \sqrt P_a)& P \geq P_b \\
L (\frac{1}{\sqrt P_a} – \frac{1}{\sqrt P_b}) * P & P \leq P_a \\
\end{cases}
\end{equation}
$$
根据IL的公式:
$$
\begin{align*}
& \text{IL} = \frac{V_{\text{lp}} – V_{\text{hold}}}{V_{\text{hold}}}
\end{align*}
$$
我们知道价格\(P\),\(P_a\)以及\(P_b\)都可以看成是相对于起始价格\(P_c\)的变化,于是我们可以用他们的比值来简化公式:
$$
\begin{align*}
& \frac{P}{P_c} = k \\
& \frac{P_a}{P_c} = \frac{1}{n} \\
& \frac{P_b}{P_c} = m \\
\end{align*}
$$
经过一系列带入化简后我们可以得出:
$$
\begin{equation}
\text{IL}=
\begin{cases}
\frac {2 \sqrt k – (k + 1)} {1 + k – \frac{1}{\sqrt n} – k \frac{1}{\sqrt m}}& \frac{1}{n}<= k < m \\
\frac{\sqrt m + k \frac{1}{\sqrt m} – (k + 1)}{1+k – \frac{1}{\sqrt n} – k \frac{1}{\sqrt m}}& k >= m \\
\frac{k\sqrt n + \frac{1}{\sqrt n} – (k + 1)}{1+k – \frac{1}{\sqrt n} – k \frac{1}{\sqrt m}} & k < \frac{1}{n} \\
\end{cases}
\end{equation}
$$
分析
这个公式有三个变量:\(m\),\(n\)和\(k\),不太好直接分析。为了有个直观的感受,我们从以下两个角度分析:
m = n
\(m=n\),也就意味着我们在\([\frac{P_c}{n}, n \times P_c]\)的区间内提供流动性。这样的话,我们有:
$$
\text{IL} = \frac{2 \sqrt k – (k + 1)} {k + 1} \times \frac{1}{1 – \frac{1}{\sqrt n}}
$$
上面这个公式,乘号左边的部分恰好是V2里的IL,那么右边的数则表示V3的IL是V2的多少倍,我们看下这个函数的图像:
我们可以很容易的发现:
- 即使n=2,也就是在[-50%, 200%]这样一个比较大的区间,V3的IL也是V2的3.41倍左右;
- 当n=1.1时,也就是在[-9.1%, 10%]这个区间,高达21.48倍;
- 当n=1.05,也就是在[-4.76%, 5%]这个区间,更是高达41.49倍;
如果区间继续收窄,那么IL将会持续变化大;从这个角度看,V3的IL风险还是比较大的。
对称区间
接下来,我们会从另一个维度分析下IL:我们添加流动性时,很容易选择的价格区间是上下\(r%\)的对称区间,这种对称区间不仅操作时更方便,而且还可以减少一个变量,使得分析起来更容易:
$$
\begin{align*}
& \frac{P_c – P_a}{P_c} = 1 – \frac{P_a}{P_c}= r \\
& \frac{P_b – P_c}{P_c} = \frac{P_b}{P_c} – 1 = r
\end{align*}
$$
我们可以得到\(m\),\(n\)以及\(r\)的关系:
$$
\begin{align*}
& n = \frac{1}{1 – r} \\
& m = 1 + r
\end{align*}
$$
带入上述公式可以得到:
$$
\begin{equation}
\text{IL}=
\begin{cases}
\frac {2 \sqrt k – (k + 1)} {1 + k – \sqrt(1-r) – \frac{k}{\sqrt(1+r) }}& 1-r<= k < 1+r \\
\frac{\sqrt (1+r) + \frac{k}{\sqrt(1+r)} – (k + 1)}{1+k – \sqrt (1-r) – \frac{k}{\sqrt (1+r)}}& k >= 1+r \\
\frac{k\sqrt(1-r) + \sqrt(1-r) – (k + 1)}{1+k – \sqrt(1-r) – \frac{k}{\sqrt(1+r)}} & k < 1-r \\
\end{cases}
\end{equation}
$$
以上公式看上去有点复杂,但是我们可以用一些画图工具把\(r\)变化的过程给展示出来,我们设定r的变化范围是:[0.1, 0.9],递增的步长是0.1,于是我们可以得到如下的图像:
尺度放大之后可以更清楚的看到紫色的价格区间内的变化:
上图中:
- 蓝色的线是V2的IL,绿色的线是4倍于V2 IL,三色叠加的线则是对称区间上V3的IL;
- r越大,也就是区间范围越大,曲线越接近于V2的IL;r越小,也就是区间氛围越窄,曲线会更陡峭,IL会大很多。
所以,V3做LP需要特别留意IL。
最后贡献一份简单的代码,可以实时计算出不同对称区间,价格变化时V2和V3的IL值。有兴趣的可以尝试不同的\(r\)和\(k\)值,感受下IL的变化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
export function IL_V3(r: number, k: number): number { if (1 - r <= k && k < 1 + r) { return (2 * Math.sqrt(k) - k - 1) / (1 + k - Math.sqrt(1 - r) - k / Math.sqrt(1 + r)); } else if (k >= 1 + r) { return (Math.sqrt(1 + r) + k / Math.sqrt(1 + r) - k - 1) / (1 + k - Math.sqrt(1 - r) - k / Math.sqrt(1 + r)); } else { return (k / Math.sqrt(1 - r) + Math.sqrt(1 - r) - k - 1) / (1 + k - Math.sqrt(1 - r) - k / Math.sqrt(1 + r)); } } export function IL_V2(k: number): number { return (2 * Math.sqrt(k)) / (1 + k) - 1; } function calc(r) { for (let k = 0.7; k < 1.4; k += 0.1) { const f1 = IL_V3(r, k); const f2 = IL_V2(k); console.info( 'price change:', ((k - 1) * 100).toFixed(0) + '%', 'V3 IL:', (f1 * 100).toFixed(2) + '%', 'V2 IL:', (f2 * 100).toFixed(2) + '%', 'V3/V2:', f1 / f2, ); } } |
- 在上下对称10%区间提供流动性,我们可以得到价格变化时IL的变化:
输出:
1 2 3 4 5 6 7 8 |
price change: -30% V3 IL: -16.03% V2 IL: -1.57% V3/V2: 10.216988579219143 price change: -20% V3 IL: -9.08% V2 IL: -0.62% V3/V2: 14.66884702545999 price change: -10% V3 IL: -2.83% V2 IL: -0.14% V3/V2: 20.386184805940797 price change: -0% V3 IL: -0.00% V2 IL: -0.00% V3/V2: 10.219294543357552 price change: 10% V3 IL: -2.32% V2 IL: -0.11% V3/V2: 20.486235176874388 price change: 20% V3 IL: -6.57% V2 IL: -0.41% V3/V2: 15.856403658468617 price change: 30% V3 IL: -10.45% V2 IL: -0.85% V3/V2: 12.237402741917139 |
- 在上下对称20%区间提供流动性,我们可以得到价格变化时IL的变化:
输出:
1 2 3 4 5 6 7 8 |
price change: -30% V3 IL: -13.78% V2 IL: -1.57% V3/V2: 8.779081835877726 price change: -20% V3 IL: -6.36% V2 IL: -0.62% V3/V2: 10.269513942040804 price change: -10% V3 IL: -1.43% V2 IL: -0.14% V3/V2: 10.326705843729222 price change: -0% V3 IL: -0.00% V2 IL: -0.00% V3/V2: 5.189362973050069 price change: 10% V3 IL: -1.18% V2 IL: -0.11% V3/V2: 10.426245422421873 price change: 20% V3 IL: -4.34% V2 IL: -0.41% V3/V2: 10.469824125644376 price change: 30% V3 IL: -8.14% V2 IL: -0.85% V3/V2: 9.532989427802177 |
- 在上下对称50%区间提供流动性,我们可以得到价格变化时IL的变化:
1 2 3 4 5 6 7 8 |
price change: -30% V3 IL: -6.33% V2 IL: -1.57% V3/V2: 4.03469254436696 price change: -20% V3 IL: -2.53% V2 IL: -0.62% V3/V2: 4.093737918971734 price change: -10% V3 IL: -0.57% V2 IL: -0.14% V3/V2: 4.148052318469563 price change: -0% V3 IL: -0.00% V2 IL: -0.00% V3/V2: 2.099091220370599 price change: 10% V3 IL: -0.48% V2 IL: -0.11% V3/V2: 4.244593874790152 price change: 20% V3 IL: -1.78% V2 IL: -0.41% V3/V2: 4.2876856045751355 price change: 30% V3 IL: -3.70% V2 IL: -0.85% V3/V2: 4.327801508031637 |