Today we implement the order placement strategy in Almgren and Chriss (2000) s.t. for a certain order size \(Q\), we can estimate the probability to perform the optimal strategy in the paper within time horizon of \(T\).

Mathematical Formulation

It is tolerable[1] in HFT that we assume stock price evolves according to the discrete time arithmetic Brownian motion:

\[\begin{cases} dS(t) = \mu dt + \sigma dW(t),\\\\ dQ(t) = -\dot{Q}(t)dt \end{cases}\]

where \(Q(t)\) is the quantity of stock we still need to order at time \(t\). Now let \(\eta\) denote the linear coefficient for temporary market impact, and let \(\lambda\) denote the penalty coefficient for risks. To minimize the cost function

\[ C = \eta \int_0^T \dot{Q}^2(t) dt + \lambda\sigma\int_0^T Q(t) dt \]

we have the unique solution given by

\[ Q^*(t) = Q\cdot \left(1 - \frac{t}{T^*}\right)^2 \]

where \(Q\equiv Q(0)\) is the total and initial quantity to execute, and the optimal liquidation horizon \(T^*\) is given by

\[ T^* = \sqrt{\frac{4Q\eta}{\lambda\sigma}}. \]

Here, \(\eta\) and \(\lambda\) are exogenous parameters and \(\sigma\) is estimated from the price time series (see the previous post) within \(K\) time units, given by

\[ \hat{\sigma}^2 = \frac{\sum_{i=1}^n (\Delta_i - \hat{\mu}_{\Delta})^2}{(n-1)\tau} \]

where \(\\{\Delta_i\\}\) are the first order differences of the stock price using \(\tau\) as sample period, \(n\equiv\lfloor K / \tau\rfloor\) is the length of the array, and

\[ \hat{\mu}_{\Delta} = \frac{\sum_{i=1}^n \Delta_i}{n}. \]

Notice that \(\hat{\sigma}^2\) is proved asymptotically normal with variance

\[ Var(\hat{\sigma}^2) = \frac{2\sigma^4}{n}. \]

Now that we know

\[ \hat{\sigma}^2 \equiv \frac{16Q^2\eta^2}{\lambda^2 \hat{T}^4} \overset{d}{\to} \mathcal{N}\left(\sigma^2, \frac{2\sigma^4}{n}\right) \]

which yields

\[ \frac{16Q^2\eta^2}{\lambda^2\hat{\sigma}^2\hat{T}^4}\overset{d}{\to}\mathcal{N}\left(1, \frac{2}{n}\right), \]

to keep consistency of parameters, with \(n\equiv \lfloor K/\tau\rfloor \to\infty\) we can also write

\[ \frac{16Q^2\eta^2}{\lambda^2\hat{\sigma}^2\hat{T}^4}\overset{d}{\to}\mathcal{N}\left(1, \frac{2\tau}{K}\right). \]

with which we can estimate the probability of successful strategy performance. Specifically, the execution strategy is given above, and the expected cost of trading is

\[ C^* = \eta \int_0^{T^*} \left(\frac{2Q}{T}\left(1 - \frac{t}{T^*}\right)\right)^2 dt + \lambda\sigma\int_0^{T^*} Q\cdot \left(1 - \frac{t}{T^*}\right) dt = \frac{4\eta Q^2}{3T^*} + \frac{\lambda \sigma QT^*}{3} = \frac{4}{3}\sqrt{\eta\lambda\sigma Q^3}. \]

Implementation

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
import numpy as np
from scipy.stats import norm


def generate_abm(mu, sigma, K, S0):
np.random.seed(222)
dS = mu - sigma**2 / 2 + sigma * np.random.normal(size=K)
S = np.cumsum(np.append(S0, dS))
return S


class OrderExecution:
def __init__(self, S, tau):
delta = S[tau::tau] - S[:-tau:tau]
self.sigma2 = ((delta - delta.mean())**2).sum() / (len(delta) - 1) / tau
self.tau = tau
self.K = len(S)

def info(self, Q, T, eta, lmd):
statistic = 16 * Q**2 * eta**2 / lmd**2 / self.sigma2 / T**4
prob = 1 - norm.cdf(statistic, loc=1, scale=2 * self.tau / self.K)
retn = np.sqrt(eta * lmd * self.sigma2**.5 * Q**3) * 4 / 3
return retn, prob


S = generate_abm(0.002, 0.06, 50000, 100)
OE = OrderExecution(S, 10)
OE.info(10, 3.6405, 0.02, 1)
(1.465147881156472, 0.8431842483948604)

which means there's a probability of 84.3% that we can perform our order placement strategy of size 10 within 3.6405 time units and minimize the trading cost of 1.47 at optimum.


  1. 1.Over long-􏰊term 􏰛investment􏰔 time scales or in extremely volatile markets􏰁 it is important to consider geometric rather than arithmetic Brownian motion􏰟; this corresponds to letting \(\sigma\)􏰮 scale with \(S\)􏰘 But over the short-􏰊term 􏰛trading􏰔 time horizons of interest the total fractional price changes are small􏰁 and the di􏰈fference between arithmetic and geometric Brownian motions is negligible. (Almgren and Chriss, 2000) ↩︎