跳到主要內容

AS 策略

Avellaneda & Stoikov

Original model and our proposed extensions

First, let's briefly recap the core equations from the Avellaneda-Stoikov paper:

Original model

Reservation price (market price, adjusted toward your target inventory level):

r(s,q,t,\sigma)=s-q\gamma\sigma^{2}(T-t)

Optimal spread around reservation price:

\delta^{a}+\delta^{b}=\gamma\sigma^{2}(T-t)+\frac{2}{\gamma}ln(1+\frac{\gamma}{\kappa})

Where:

  • s [quote asset] = current mid price

  • q [no unit] = quantity of stocks in inventory of base asset (could be positive/negative for long/short positions)

  • \gamma [1/quote asset] = inventory risk aversion parameter

  • \sigma [quote asset] = volatility

  • T [no unit] = closing time (conveniently normalized to 1)

  • t [no unit] = current time (T is normalized = 1, so t is a time fraction)

  • \delta^{a}, \delta^{b} [quote asset]= Bid/Ask spread (they are symmetrical to reservation price → \delta^{a}=\delta^{b}

  • \kappa [1/quote asset]= Order book liquidity parameter

Proposed extensions

The paper's model is built under the following assumptions:

  1. Order amount is not defined

  2. Volatility is constant

  3. Order book statistical characterization is constant

  4. The market maker intends to maximize profit using a total inventory during a limited time horizon

Since these assumptions may not be suitable for crypto trader, we propose the following changes:

  1. Since BBGO enables traders to specify the order amount, we introduce an an additional parameter order_amount_shape_factor (\eta) that adjusts order amount given inventory position, as described in the 2018 Optimal High-Frequency Market Making paper.

  2. To account for the rapidly changing volatility that exists in crypto, we propose a volatility diff threshold which, if surpassed, will trigger recalculation of the strategy parameters vol_to_spread_multiplier.

  3. Recalculation as in point 2.

  4. Since running bot may have infinite time horizon, our solution is to have a finite closing_time (T) but with recycle of remaining time fraction together with parameter recalculation every time t=T.

Calculation of \gamma\kappa and \eta

Intro

With the original Avellaneda equations, we are faced with multiple degrees of freedom. We can pick any value for these parameters, so some constraints are needed. Since bid/ask spread to mid-price is one of the most important values for our bots, that should be a reasonable choice to build our criteria. Also, as the paper states, \gamma acts like a risk aversion parameter to inventory risk. We want a knob parameter to control that factor while meeting the spread parameters set by the user.

Calculation of \gamma

We will work under the assumption that user has set both min_spread and max_spread parameters when configuring the strategy. For the calculation of the maximum possible risk factor (\gamma), the author works with the initial spreads optimal bid/ask to mid-price (\delta^{a} and\delta^{a}), which should not be smaller than min spread nor bigger than max spread (in relationship to the mid-price).

Note: As the delta between reservation price and mid price (\Delta) and optimal spreads are functions of (t-T), for decreasing absolute value of q (approaching the target inventory level), it can be safely said that spreads of optimal bid and ask to mid-price will be decreasing as time goes by. Therefore, the following calculations will be centered at the moment t=0 where spreads are the widest possible.

The image below shows the distribution of price levels and spreads when there is an excess of inventory, so the reservation price is lower than the mid price and spreads are adjusted accordingly:

all spreads and prices

q>0 (inventory needed to be decreased)

First,

Spread\ optimal\_ask\le Spread\ optimal\_bid

To comply with maximum and minimum spreads:

\begin{align*} Spread\ optimal\_ask_{t=0}&\ge Min\ Spread \\[0.1in] Spread\ optimal\_bid_{t=0}&\le Max\ Spread \end{align*}

We will now calculate an expression for these spreads at t=0. First, the ask spread:

\begin{align*} Spread\ optimal\_ask_{t=0}&=optimal\ ask_{t=0}-s \\[0.1in] Optimal\ ask_{t=0}&=r(s,0)+\frac{(\delta^{a}_{t=0}+\delta^{b}_{t=0})}{2} \end{align*}

Replacing equations for r(s,t) and optimal spread...

Spread\ optimal\_ask_{t=0}=s-\left[s+q\gamma\sigma^{2}+\frac{1}{2}\left[ \gamma\sigma^{2}+ln(1+\frac{\gamma}{\kappa})\right]\right] \ge Min\ Spread

So expression reached is:

(\frac{1}{2}-q)\gamma\sigma^{2}+\frac{1}{2}ln(1+\frac{\gamma}{\kappa})\ge Min\ Spread

Similarly, with the bid spread, the limitation will be the maximum spread set by the user in this case:

\begin{align*} Spread\ optimal\_bid_{t=0}&=s-optimal\ bid_{t=0} \newline\\[0.1in] Spread\ optimal\_bid_{t=0}&=s-\left[ s-q\gamma \sigma^{2}-\frac{1}{2}\left(\gamma \sigma^{2}+ln(1+\frac{\gamma}{\kappa})\right)\right] \le Max \ Spread \end{align*}

Which leads to the expression:

(\frac{1}{2}+q)\gamma \sigma ^{2}+\frac{1}{2}ln(1+\frac{\gamma}{\kappa}) \le Max\ Spread

Taking both inequalities and adding them up together the following result is reached:

\begin{align*} (\frac{1}{2}-q)\gamma\sigma^{2}+\frac{1}{2}ln(1+\frac{\gamma}{\kappa})&\ge Min\ Spread \\[0.1in] -(\frac{1}{2}+q)\gamma\sigma^{2}-\frac{1}{2}ln(1+\frac{\gamma}{\kappa})&\ge -Max\ Spread \end{align*} \\[0.3in] 2q\gamma\sigma^{2} \le Max\ Spread - Min\ Spread

q<0 (inventory needed to be increased)

In the same way, for the opposite case, if q<0 the final expression reached is:

-2q\gamma\sigma^{2} \le Max\ Spread - Min\ Spread

So both cases can be treated using \|q\|, and then the following inequality for \gamma holds

\gamma \le \frac{Max\ Spread-Min\ Spread}{2\|q\|\sigma^{2}}=\gamma_{max}

As risk_factor (\gamma) is non-negative, with this maximum threshold calculated, we now have a range for all possible \gamma values. The previously mentioned knob will be a coefficient ranging from 0 to 1, which will define where within this range will \gamma be. This coefficient will be called inventory_risk_aversion (IRA).

Final equation for \gamma:

\gamma=\gamma_{max}*IRA=\frac{Max\ Spread-Min\ Spread}{2\|q\|\sigma^{2}}*IRA

Calculation of \kappa((\delta_{a}+\delta_{b})_{max})

order_book_depth_factor (\kappa) will selected so that the algorithm starts with the maximum possible spread at t=0. This decision appears arbitrary, but the argument behind it is to go through a wider range of spreads so as to maximize strategy profitability. So to start with the calculation, we will first determine the maximum possible spread at t=0.

spread_{t=0}=\frac{\delta_{a}+\delta_{b}}{2}\pm \Delta

The order furthest from the mid price will be the one where terms are added, so we calculate:

\begin{align*} \frac{\delta_{a}+\delta_{b}}{2}+ \Delta&\le Max\ Spread \\[0.1in] (\delta_{a}+\delta_{b})_{max}&=2Max\ Spread-2\Delta \\[0.05in] &=2Max\ Spread-2\|q\|\gamma\sigma^{2} \\[0.05in] &=2Max\ Spread-2\|q\|\sigma^{2}*\frac{Max\ Spread-Min\ Spread}{2\|q\|\sigma^{2}}*IRA \\[0.05in] &=(2-IRA)*Max\ Spread+IRA*Min\ Spread \end{align*}

Now, from this maximum optimal spread at time t=0, \kappa can be inferred as a function of this spread using the paper's equation for \delta_{a}+\delta_{b}

Final equation for \kappa:

(\delta_{a}+\delta_{b})_{t=0}=(2-IRA)*Max\ Spread+IRA*Min\ Spread \newline\\[0.1in] \kappa\bigg((\delta_{a}+\delta_{b})_{t=0}\bigg)=\frac{\gamma}{exp\{\frac{(\delta_{a}+\delta_{b})_{t=0}\gamma-\sigma^{2}\gamma^{2}}{2}\}-1}

Calculation of \eta

Recall that order_amount_shape_factor (\eta) is a modifier to order amount, borrowed from the 2018 Fushimi paper (see References).

eta usage

Basically from both orders submitted in the strategy proposal, the one going against reaching the target inventory will be decreased in size exponentially based on how far bot is from reaching target q. This is similar to the inventory skew approach in BBGO's pure market making strategy.

Leveraging the inventory_risk_aversion (IRA) parameter defined earlier, the amount of decay in the exponential decay function will be controlled by IRA:

q_{decay}=\frac{Total\,inventory\,in\,base\_asset}{IRA}\newline\\[0.1in]\eta=\frac{1}{q_{decay}}

What happens if IRA \to 0 \implies \gamma \to 0

We have seen what happens to reservation price and optimal spread when \gamma=\gamma_{max}. But what happens if \gamma=0?

If you read previous Avellaneda strategy post, you will know that if \gamma \to 0 (which is equivalent to \gamma \to 0), then knob is set to no inventory risk aversion. That means that user simply sets spreads symmetrical to mid-price, but can you imagine what will be the final spread values? Lets do the math...

IRA \to 0 \implies \gamma \to 0 \newline\\[0.1in] t=0 \implies (T-t)=1 \newline\\[0.3in] \lim_{\gamma \to 0} r(s,q,t=0,\sigma) = s \\[0.3in] \lim_{\gamma \to 0} \delta^{a}+\delta^{b}(q,t=0,\sigma) = \lim_{\gamma \to 0} \frac{2}{\gamma}ln(1+\frac{\gamma}{\kappa})=\lim_{\gamma \to 0} \frac{2}{\gamma} \frac{\gamma}{\kappa}=\frac{2}{\kappa}\\[0.1in]

So we know about reservation price that r(s,q,t=0,\sigma) \xrightarrow{\gamma \to 0} s and that optimal spread \delta^{a}+\delta^{b}(q,t=0,\sigma) \xrightarrow{\gamma \to 0} \frac{2}{\kappa}. Lastly, we calculate \kappa,

\begin{align*} \lim_{\gamma \to 0} \kappa((\delta_{a}+\delta_{b})_{max}) &= \lim_{\gamma \to 0}\frac{\gamma}{exp\{\frac{(\delta_{a}+\delta_{b})_{max}\gamma-\sigma^{2}\gamma^{2}}{2}\}-1}\\[0.1in] &=\lim_{\gamma \to 0} \frac{\gamma}{\{1+\frac{(\delta_{a}+\delta_{b})_{max}\gamma-\sigma^{2}\gamma^{2}}{2}\}-1}= \lim_{\gamma \to 0} \frac{\gamma}{\gamma(\frac{(\delta_{a}+\delta_{b})_{max}-\sigma^{2}\gamma}{2})}\\[0.1in] &=\lim_{\gamma \to 0} \frac{2}{((\delta_{a}+\delta_{b})_{max}-\sigma^{2}\gamma)} \\[0.1in] &= \frac{2}{(\delta_{a}+\delta_{b})_{max}} \end{align*}

This means, that if \gamma \to 0 spread around r = mid_price will be fixed

r = s\\[0.1in] If\ \gamma \to 0 \implies IRA \to 0\ \therefore\\[0.1in] (\delta_{a}+\delta_{b})=(\delta_{a}+\delta_{b})_{max}=(2-IRA)*Max\ Spread+IRA*Min\ Spread=2*Max\ Spread

So in the case \gamma \to 0 this is the same as a regular pure market making strategy with symmetrical spread = Max Spread around mid-price. In this way, pure market making strategy becomes a special case of Avellaneda market making strategy.


留言

這個網誌中的熱門文章

追求卓越 Pursuing Excellence

為什麼我想追求卓越? 一直以來,我腦中很常在想的一件事情是:如果我馬上就要死了,什麼會是我最大的遺憾?每一次我的答案都一樣:我還沒成為一個卓越的人。然而人總有一天會死,所以對我來說,人生在某種程度上就像是在跟死神和現實賽跑,我要在他們之前衝破那條名為卓越的終點線。當我知道自己已經成為一個卓越的人時,死亡和現實想對我做什麼事,我想我更能坦然應對。 所以「唯有追求極致才能卓越,體驗才能盡興」。 該如何追求卓越? 找到極限的唯一方法是跨越它。 1. 心態 「成為廢物!」 永保初心是很重要的一種心態,不管你在什麼程度,切記「求知若渴,永保傻勁」,注意是傻勁不是「傻」。最近和朋友有個口頭禪就是「我真是個廢物呢」,一開始可能純粹是打打嘴砲,但最近感觸越來越深,只有不斷地把自己的現狀錨定在 0 分、歸零在原點,才有追求卓越的可能性,我們似乎很享受當個快樂的低能兒,我覺得這狀態挺好,stay hungry stay foolish。 2. 努力 想要達到不凡,必須做到普通人們做不到的事情。 有人說透果一萬小時的努力就能精通某項技能、成為專家,個人覺得不一定正確。練習應是重質量而不是數量,「刻意練習」是一種專注、一致並且以目標為導向的訓練,只是常規、重複練習還遠遠不夠。 時間的複利效果,越是年輕越是要當時間的朋友。 讀書的時候唸過 a = (1+b)^c 複利的公式。在公司價值投資來說,時間越長,透過本金利息再投入,多年複利後,整個投資的價值就會變得很大。這就是把時間當朋友的重大價值。 若把自己當作投資的標的,原理也是一樣:如果每天都做一點努力,做一點不同,複利效果就會發揮作用,能力經驗個人價值的增長也就越快,在人生後面所有的時間都會有價值回饋,讓每天晚上結束時都比早上醒來的自己更聰明。 能用智商逃避努力嗎? 如果你想做傑出的事情,你就必須非常努力地工作。我小時候對這一點並不確定。學校作業的難度各不相同,一個人並不總是要超強度地工作才能做得好。也許,有一些方法可以通過純粹的聰明才智來避開艱苦的工作?然而現在我知道了這個問題的答案:沒有。 傑出的工作有三個要素: 天賦、練習、努力。 你具備其中兩個就可以做得不錯,但要做到最好,你需要三者:你需要有很好的個人能力,要有大量的練習,要非常努力。 更何況假設有一位與你相同天賦能力的人,一旦你的努力相對比他少,就會被他超越。 天賦和努力工作之間...

Git 注意事項

使用 Git 的一些技巧 1. git pull 的時候可以用 --rebase 比較不會有多餘的 merge point 2. 善用 squash commit,squash 完心情都很好 3. commit 之前一定要先 format code 一次,不然多出來的 reformat commit 會很難整理 4. 拆 commit,盡可能讓每個 commit 都可以 build & test,也比較好回到上游 5. 如果 local 修改的整理過的 commit tree 要 rebase 上去就只能用 rebase onto e.g., git fetch upstream git checkout -B local-rebase-branch upstream/feature/binance-futures git rebase -i upstream/main .... 改改改 git push -f origin HEAD -B 會洗掉原本就有的 local branch CS Visualized: Useful Git Commands Code Cleanup: Splitting Up git Commits In the Middle of a Branch Git rebase --onto an overview 30 天精通 Git 版本控管