CurveのStableSwap公式の導出


ブロックチェーン (DeFi) 上でトークン同士を交換するための仕組みであるAMMでは、多くの場合Uniswapの定数積公式 (constant product formula) が利用されます。

※参考：[DeFi (分散型金融) での流動性マイニングにおける impermanent loss (変動損失) の導出](https://qiita.com/visvirial/items/c669584914953cab1102)

定数積公式を用いたAMMは汎用性を持ち多くのDEXで利用されるようになりましたが、同じ価格を持つことが期待されるトークン同士のペア (例えばドルステーブルコイン同士や、ETHとstETHなど) で定数積公式を用いると価格が鋭敏に反応してしまい不利な価格で約定してしまいがちです (スリッページ)。

そこで考え出されたのがCurveが用い始めた「[StableSwap](https://curve.fi/files/stableswap-paper.pdf)」と呼ばれる公式です。

この記事ではトークン価格が同じになることが期待されるトークン同士のAMMで用いられるStableSwap公式の導出を行います。



# 準備

AMMのプールが対応しているトークンのリストを $\\{ X_1, \cdots, X_n \\}$ とします。

また各トークン $X_i$ のプール内に存在する流動性 (コインの枚数) を $x_i$ とそれぞれおきます。

AMMにおいてはプールに預けられているコインの枚数は任意ではなく、ある関数 $f(x_1, \cdots, x_n)$ をあらかじめ定義し

$$
f(x_1, \cdots, x_n) = 0
$$

が必ず成り立つようにコインの枚数を制限します。

この関数 $f$ の形が定数積の形であれば定数積公式のAMMであり、StableSwapの形をしていればStableSwap公式のAMMとなります。

また、トークン同士の交換レートは $x_i$ コインの $x_j$ に対する価格として

$$
p_{i, j} := -\frac{dx_i}{dx_j}
$$

で与えられます (演習問題①)。



# 定数和公式

定数和公式 (constant sum formula) では各トークンの数量に重み $w_i$ を掛けて総和をしたものが定数となる、すなわち

$$
\sum_i w_i x_i = \text{(const.)}
$$

となります。

このとき、トークンの価格は常に一定となります (演習問題②)。

トークンの価格が一定ですので一見するとこれをStableSwap公式とすればいいようにも思えますが、現実的には不適です。

なぜならば、例えばドルステーブルコインのUSDTなどであっても、信用不安や受給の一時的な不均衡などから外部市場にて1ドルではない価格で取引される (デペグする) 可能性があるからです。

もしドルステーブルコインがデペグした場合には、アービトラージによってこのプールからは外部市場にてより高い価格をつけているトークンがすべて払い出されてしまい、流動性が枯渇してしまいます。

例え価格の不均衡が一時的なものであったとしても、外部市場で不均衡な価格をつけている間に流動性供給者のポジションが不利な方向へ寄ってしまうのはあまりよろしくないですし、もし不均衡が続くのであればある程度の価格の不均衡もAMMのプール内で反映される仕組みがあるべきです。




# 定数積公式

定数積公式 (constant product formula) はUniswapなど多くのAMMで用いられている公式です。

定数積公式では、定数和公式のときには総和が一定だったのに対し、総乗が一定となります。

$$
\prod_i x_i^{w_i} = \text{(const.)}
$$

多くの場合には重みは $w_i = 1$ と設定し、その場合のトークン価格は

$$
p_{i, j} = \frac{x_i}{x_j}
$$

となります (演習問題③)。

この場合、トークン価格はプールに預けられているそれぞれのコインの枚数に比例することになりますが、そうすると例えばロックされている流動性の1%のコインを交換しようとするとおおむね1%のスリッページが発生してしまうことになります。

ステーブルコイン同士のプールを例として考えると、総流動性のたった1%を交換した場合であっても交換レートが0.99ドル (売り注文の場合) または1.01ドル (買い注文の場合) となってしまい、総流動性の大きさのわりにはかなりの大きなスリッページとなってしまうことが分かります。

従って、トークン価格が同じになると期待されるペアで定数積公式を用いるのもあまり歓迎できるものではありません。



# StableSwap公式

さて、以上で定数和公式と定数積公式をみたわけですが、どちらも一長一短がありました。

定数和公式ではトークン価格は一定とできるもののトークン価格の微妙なデペグには対応できない、定数積公式ではトークン価格のデペグには対応できるもののトークン価格が一定とならない、といった具合です。

しかし、これらは互いに補完関係にあるため、これらの「いいとこ取り」をしてあげるとなんだか良さそうな気がしますね。

そこでプールの設定時の全トークンの枚数を合計したものを表す定数として $D$ を導入し、定数和公式と定数積公式をそれぞれ

$$
\sum_i x_i = D
$$

$$
\prod_i x_i = \left( \frac{D}{n} \right)^n
$$

と書きます。

ここで $\chi$ を「定数和 (価格が一定) ぽさの度合い (レバレッジ)」として導入し、次のように定数和公式と定数積公式の二つの公式の足し算として公式を設定してみます。

$$
\chi D^{n-1} \sum_i x_i + \prod_i x_i = \chi D^n + \left( \frac{D}{n} \right)^n \quad \cdots \quad \text{(1)}
$$

なお、$\chi$ を無次元量にするために総和の係数に $D^{n-1}$ を掛けることで次元調整を行っています。

こうすることで定数和公式の持つ「価格が一定」という特徴と、定数積公式の持つ「価格の柔軟性」の両方を取り込むことができます。

しかし残念ながら、この公式のままでは価格が一定の範囲内しか表現することができません。

これを示すために実際に適当なパラメータを入れてトークン数が2個の場合を[WolframAlphaを用いてプロット](https://www.wolframalpha.com/input?i=Plot%5B10%28x%2By%29+%2B+xy+%3D+100%2C+%7Bx%2C+0%2C+20%7D%2C+%7By%2C+0%2C+20%7D%5D&lang=ja)したものが以下のグラフとなります。

![Plot-10-x-y-xy-100-x-0-20-y-0-20-Wolfram-Alpha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121446/edd40bff-6690-c75c-2b7b-06003f3a9b5a.png)

（式をよく見れば分かることではありますが、この式は $x$ と $y$ の高々二次式ですので、双曲線を平行移動したものになります。）

もう少しのところでしたが、どこを調整すればよいでしょうか？

価格が $1$ に近いところは定数和公式に近く ($\chi \rightarrow \infty$) なり、価格が $1$ から離れた場合には定数積公式に近く ($\chi \rightarrow 0$) なればよさそうです。

これを表現するために $\chi$ を $\prod x_i$ によって変わる変数にしてしまいましょう。

$$
\chi = \frac{A \prod_i x_i}{(D/n)^n} \quad \cdots \quad \text{(2)}
$$

次元を調整するためにいろいろと項を加えていますが、本質的にはこれは $\chi$ を $\prod_i x_i$ に比例するようにしているだけです。

この $\chi$ を (1) に代入することで

$$
A n^n \sum_i x_i + D = A D n^n + \frac{D^{n+1}}{n^n \prod_i x_i} \quad \cdots \quad \text{(3)}
$$

を得ます (演習問題④)。

この式こそがCurveの発明したStableSwap公式となります。

公式だけを見ると少し複雑ですが、思考過程を追っていけばかなり自然な導入であることが分かっていただけたと思います。

ただ、式が複雑なため解析的にこの式からトークン価格やスリッページ、プールにトークンを出し入れしたときのLPトークンのシェアなどを計算するのは困難です。

興味のある読者はぜひ挑戦してみてください。（私は途中で挫折しました。）

「じゃあ実際のCurveのコントラクトではどうやって計算してるの？」と思いCurveのスマートコントラクトを読んでみたのですが、解析的に解くのは諦めてNewton法を用いて数値的に解くということをしていました。

こういうこと (実際のスマコンでは数値的に解いていること) は[StableSwapのホワイトペーパー](https://curve.fi/files/stableswap-paper.pdf)には書いてないですし、ちょっとググった感じでも情報が見つからなかったので調べるのに苦労しました。

しかしちゃんと数理的に解説している記事は日本語ではもちろん皆無ですし、英語でもそういった詳細が記載されているものは見つかりませんでしたので、Curve以外でStableSwapを使っているAMMの作者はどうやってスマコンを書いたんですかね……。

ワンチャンちゃんと理解せずCurveのスマコンをコピペしてるだけって可能性もある気がしています。

さて、与太話はこれくらいにして締めたいと思います。

最後に演習問題を載せましたので、より深い理解のためにもぜひ解いてみてくださいね！

ではでは！




# 演習問題

## ①トークンの交換レート

AMMにおけるトークンの交換レートが

$$
p_{i, j} := -\frac{dx_i}{dx_j}
$$

で与えられる理由を述べよ。

## ②定数和公式におけるトークンの交換レート

定数和公式において、トークン価格は

$$
p_{i, j} = \frac{w_j}{w_i}
$$

で与えられることを示せ。

## ③定数積公式におけるトークンの交換レート

定数積公式において、トークン価格は

$$
p_{i, j} = \frac{w_j}{w_i} \cdot \frac{x_i}{x_j}
$$

で与えられることを示せ。

## ④StableSwap公式の導出

(1)式に(2)式を代入することで(3)式になることを確かめよ。