Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。

这个里面有一些重要参数:

很直观,可以直接取值的有:

s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)
q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

当然T-t也是可以直接定义的,但是对于连续合约,7*24小时交易的数字货币市场,如何来定义这个T,在计算中如何处理。

需要计算的值有:

(sigma)σ = market volatility (市场波动率,可以用std标准差来表示)

(gamma) γ = inventory risk aversion parameter 这个翻译过来就是 规避库存风险的参数,当他取值很大的时候,我们按照公式一计算的预定价格就和中间价差距就远。
(kappa卡帕)  κ = order book liquidity parameter 这个是一个评估订单本,订单密度参数。也就是K值越大,参与买卖的人比较多,出价也比较均衡,订单量也比较大。

\delta^{a}+\delta^{b}=\gamma\sigma^{2}(T-t)+\frac{2}{\gamma}ln(1+\frac{\gamma}{\kappa})  称为最优价差

Bid/Ask spread (\delta^{a}=\delta^{b}),也就是bid_spread 和 asd_spread是相等的。

所以我们AS做决策的价格就是:

bid_price=预定价格-最优价差/2 =s-q\gamma\sigma^{2}(T-t)-0.5\gamma\sigma^{2}(T-t)-\frac{1}{\gamma}ln(1+\frac{\gamma}{\kappa})

ask_price=预订价格+最优价差/2=s-q\gamma\sigma^{2}(T-t)+0.5\gamma\sigma^{2}(T-t)+\frac{1}{\gamma}ln(1+\frac{\gamma}{\kappa})

本文的模型是在以下假设下建立的:

未定义订单金额

波动性是恒定的

订单统计特征不变

做市商打算在有限的T时间范围内使用总库存q实现利润最大化

由于这些假设可能不适合加密市场,我们建议进行以下更改:

一、由于Hummingbot使交易员能够指定订单金额,因此我们引入了一个额外的参数order_amount_shape_factor(η艾塔),该参数根据库存状况调整订单金额,如2018年最佳高频做市论文所述。

二、为了解释加密中存在的快速变化的波动率,我们提出了一个波动率差异阈值,如果超过该阈值,将触发策略参数vol_To_sprespread_multiplier的重新计算。

三、按第2点重新计算。

四、由于运行bot可能有无限的时间范围,我们的解决方案是有一个有限的closing_time(T),但要循环剩余的时间分数T,并在每次t=T时重新计算参数。举个例子,T设定 1H,当运行bot 1小时后,我们再次设定剩余分钟还有60分钟,这样bot 就可以在运行中去平衡我们的仓位,以及计算出以上几个希腊字母参数。

使用原始的AS方程,我们面临多个超参数。我们可以为这些参数选择任何值,因此需要一些约束。由于买卖价差到中间价是我们机器人最重要的价值之一,这应该是建立我们标准的合理选择。此外,正如论文所述,gamma( γ)就像库存风险的风险规避参数。我们需要一个旋钮参数来控制该因子,同时满足用户设置的spread参数。

如何计算gamma( γ)

我们将假设用户在配置策略时设置了min_spread和max_spread参数。为了计算最大可能风险因子(gamma   γ),作者使用初始价差最优买入/卖出中间价( \delta^{a}+\delta^{b} ),其不应小于最小价差,也不应大于最大价差(与中间价相关)。

注:由于保留价和中间价之间的差值(deltaΔ)和最优价差是(T-t)的函数,为了降低q的绝对值(接近目标库存水平),可以肯定地说,最优出价和要求中间价的价差将随着时间的推移而减少。因此,以下计算将以t=0的时刻为中心,其中价差是最宽的(也就是启动机器人不久,我们报价和midprice偏离最大,以便于买到股票,临近T时刻,我们要抛弃货,这样动态控制仓位)。

下图显示了库存过剩时的价格水平和价差分布,因此预定价格低于中间价格,价差会相应调整:

q>0 (inventory needed to be decreased),也就是需要减仓

开始:

Spread\ optimal\_ask\le Spread\ optimal\_bidSpread

要符合最大和最小价差:(也就是ask的报价更低一些,bid的报价更远离reserve price,这样可以卖掉一些库存,购入库存的概率更低一些)

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

现在我们将计算t=0时这些价差的表达式。首先,ask价差:

\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

因此,得出的表达式为:

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

同样,在这种情况下,对于bid_spread,限制将是用户设置的最大价差:

\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*}

这就引出了一个表达式:

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

将两个不等式相加,得出以下结果:(可以观察统计min spread和max spread来进行反推 gamma这个值,因为sigma 和q值是不变的,这个时间是需要去库存情况 )

\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)

同样,对于相反的情况,如果q<0,则得出的最终表达式为:(可以观察统计min spread和max spread来进行反推 gamma这个值,因为sigma 和q值是不变的,这个时间是需要增加库存情况 )

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

所以这两种情况都可以用q来处理,然后伽马γ的下列不等式成立:

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

由于风险系数(gamma γ)为非负值,通过计算此最大阈值,我们现在有了所有可能的 gamma-γ值的范围。前面提到的旋钮将是一个从0到1的系数,它将定义γ在这个范围内的位置。该系数称为inventory_risk_aversion(IRA)。(观察统计min spread和max spread,这样分子不变,然后查看sigma最小波动,以及我们最小持仓的时候,这个时候gamma的值就最大了,同理,当波动率最大,库存最大gamma就取得最小值,然后 max sigma 乘以IRA系数,这个系数就可以一个通过bid  ask 发出的报价来调整库存的系数)

最终方程式 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 κ),以便算法从t=0时的最大可能价差开始。这个决定似乎是任意的,但其背后的论点是通过更大范围的价差来实现策略盈利能力的最大化。因此,从计算开始,我们将首先确定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*}

现在,从t=0时的最大最优价差来看,kappa  κ可以用本文的公式推断为该spread的函数:

\delta_{a}+\delta_{b}:

(\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   η

还记得order_amount_shape_factor( η)是订单金额的修饰符,借用自2018年Fushimi论文(见参考文献)

基本上,从策略提案中提交的两份订单来看,不利于达到目标库存的订单将根据机器人距离目标q的距离呈指数级减少。这与hummingbot 纯做市策略中的库存倾斜方法类似。

利用前面定义的inventory_risk_aversion(IRA)参数,指数衰减函数中的衰减量将由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γ→0 (which is equivalent to \gamma \to 0γ→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:

\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γ→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\ Spreadr=s

因此,在gamma为0的情况下,这与常规的纯做市策略相同,对称价差=中间价附近的最大价差。这样,纯做市策略就成为Avellaneda做市策略的特例。

终于搞完毕,撒花,下次搞代码!!

猜你喜欢

转载自blog.csdn.net/weixin_42480337/article/details/127126300