Almgren-Chriss ohne Handwedeln: Optimale Ausführung, die Sie an einem Nachmittag implementieren können
Almgren und Chriss (2001), "Optimal execution of portfolio transactions" (Journal of Risk 3(2), 5–39), ist wahrscheinlich das meistzitierte Paper in der Ausführungsforschung und eines der am seltensten korrekt implementierten. Der meiste "Almgren-Chriss"-Code in freier Wildbahn ist ein TWAP-Scheduler mit einem Kommentarblock. Die meisten Blogbeiträge dazu überspringen die Herleitung, deuten vage auf eine sinh-Funktion und rühren nie den Teil an, der in der Produktion tatsächlich zählt: woher die Parameter kommen.
Dieser Artikel macht das Ganze. Die Modellannahmen, ehrlich benannt. Die geschlossene Trajektorie, hergeleitet, nicht behauptet. Die effiziente Grenze und wie man den Parameter der Risikoaversion wählt. Und die Kalibrierung der drei Inputs — temporärer Impact , permanenter Impact , Volatilität — aus Binance-Orderbuch- und Trade-Daten, mit lauffähigem Python und einer ehrlichen Diskussion darüber, warum der Fit verrauscht ist. Dies ist das intellektuelle Rückgrat von allem anderen in der Ausführung: TWAP, VWAP und POV sind Spezialfälle oder heuristische Verwandte (siehe TWAP, VWAP, POV: die Ausführungsalgorithmen, die alle einsetzen), und die modernen ML-Ansätze — Reinforcement-Learning-Scheduler und neuronale Impact-Modelle — sind Versuche, genau die Annahmen zu lockern, die wir gleich niederschreiben werden.
Der Aufbau: was das Modell tatsächlich annimmt
Sie halten Einheiten eines Assets (sagen wir, 100 BTC) und müssen bis zum Zeitpunkt vollständig liquidieren. Teilen Sie in Intervalle der Länge . Ihre Entscheidungsvariable ist die Bestandstrajektorie , wobei die Trades in Intervall ausgeführt werden.
Drei Annahmen tragen das gesamte Modell:
1. Arithmetischer Random Walk. Der ungestörte Preis folgt
wobei die i.i.d. standardnormalverteilt sind und die absolute Volatilität ist (Dollar pro Zeiteinheit, nicht Prozent). Arithmetisch, nicht geometrisch — über wenige Stunden ist der Unterschied vernachlässigbar, und der arithmetische Walk hält die Algebra linear-quadratisch. Kein Drift: Almgren und Chriss diskutieren den Driftterm, doch für eine Intraday-Liquidation ist Ihre Alpha-Schätzung über 4 Stunden fast immer Rauschen, und sie auf null zu setzen ist die ehrliche Voreinstellung.
2. Linearer permanenter Impact. : Handeln mit Rate verschiebt den Preis dauerhaft, proportional, und die Verschiebung klingt nie ab. Jede Einheit, die Sie verkaufen, drückt den Mid für immer um nach unten. Das wirkt grob, doch es gibt einen tiefen Grund, es linear zu halten: Huberman und Stanzl (2004) bewiesen, dass ein permanenter Impact, der nichtlinear in der Trade-Größe ist, Round-Trip-Strategien mit positivem Erwartungsgewinn zulässt — Preismanipulation. Linearer permanenter Impact ist keine Vereinfachung aus Bequemlichkeit; er ist die einzige arbitragefreie Wahl in dieser Modellklasse.
3. Linearer temporärer Impact. Der Preis, den Sie in Intervall tatsächlich erhalten, ist
erfasst die halbe Geld-Brief-Spanne plus Gebühren; ist die Steigung der Grenzkosten dafür, Liquidität mit Rate nachzufragen. Der temporäre Impact betrifft nur Ihre eigene Ausführung und verschwindet augenblicklich — das Orderbuch füllt sich vollständig wieder auf, bevor Ihre nächste Child-Order kommt. Jedes der drei Wörter "linear", "augenblicklich", "vollständig" ist in realen Märkten falsch, und der letzte Abschnitt handelt davon, wie falsch. Doch zunächst der Lohn dafür, sie zu akzeptieren.
Kosten und Varianz einer Trajektorie
Summieren Sie die Ausführungen, ziehen Sie sie vom anfänglichen Mark ab, und Sie erhalten den Implementation Shortfall. Sein Erwartungswert und seine Varianz über das Rauschen sind:
mit (eine Diskretisierungskorrektur, die für verschwindet).
Zwei Beobachtungen, die die meisten Implementierungen übersehen:
- Die permanenten Kosten hängen nicht von der Trajektorie ab. Bei linearem, nicht abklingendem permanentem Impact zahlen Sie denselben permanenten Tribut, egal wie Sie planen. Die Optimierung ist ausschließlich ein Ringen zwischen dem Term der temporären Kosten (der langsames, gleichmäßiges Handeln will — er wird durch minimiert, also TWAP) und dem Varianzterm (der Ihren Bestand am liebsten schon gestern los wäre — er wird durch sofortige Liquidation minimiert).
- Der Varianzterm ist bestandsgewichtet, nicht trade-gewichtet. Das Risiko läuft auf dem auf, was Sie noch halten, , nicht auf dem, was Sie handeln. Deshalb verlagert Dringlichkeit den Zeitplan nach vorne.
Die geschlossene Form: sinh, cosh und der Dringlichkeitsparameter
Almgren-Chriss minimieren die Mittelwert-Varianz-Zielfunktion
wobei die Risikoaversion in Einheiten von 1/Dollar ist. Setzen Sie für die inneren Punkte. Der temporäre Term liefert zweite Differenzen von , der Varianzterm liefert selbst, und Sie erhalten eine lineare Differenzengleichung zweiter Ordnung:
Dies ist das diskrete Analogon zu , und mit den Randbedingungen , ist die Lösung hyperbolisch:
wobei die Gleichung löst, was für kleines einfach ist.

Alles an der Strategie ist in einer einzigen Zahl verdichtet:
ist die Dringlichkeit. Ihr Kehrwert ist die charakteristische Zeit des Trades: die Zeitskala, über die es sich lohnt, Bestandsrisiko zu tragen, um Impact-Kosten zu sparen. Beachten Sie, wovon nicht abhängt: der Ordergröße und der Frist . Ob die intrinsische Zeitskala Ihres Trades 20 Minuten oder 6 Stunden beträgt, wird allein durch Risikoaversion, Volatilität und Liquidität bestimmt. Wenn , ist Ihre Frist irrelevant — das Modell liquidiert nach seinem eigenen Zeitplan, und das Ende des Horizonts bleibt ungenutzt. Wenn , bindet die Frist, und Sie machen effektiv TWAP.
Der risikoneutrale Grenzfall ist TWAP — deshalb existiert TWAP
Nehmen Sie , also . Dann gilt und
Die optimale Trajektorie degeneriert zur Geraden: gleiche Mengen in gleichen Zeitintervallen. TWAP ist keine Heuristik, die zufällig funktioniert; es ist das exakte Optimum des Almgren-Chriss-Modells für einen risikoneutralen Händler mit linearem Impact. Jedes Mal, wenn jemand TWAP einsetzt, behauptet er implizit : "Mir ist die Varianz meines Shortfalls egal, nur sein Mittelwert zählt." Das ist eine vertretbare Position für kleine Orders und kurze Horizonte. Es ist eine seltsame Position, um 5 % des Tagesvolumens über 8 Stunden in einem Asset mit 4 % Tagesvolatilität zu liquidieren, was genau der Fall ist, in dem man es trotzdem einsetzt. Der entgegengesetzte Grenzfall liefert für alle : alles im ersten Intervall abstoßen, koste es, was es wolle. Zwischen diesen Extremen interpoliert : ist kaum von TWAP zu unterscheiden, ist aggressiv nach vorne verlagert.
Die effiziente Grenze der Ausführung
Für jedes erhalten Sie eine Trajektorie, eine erwartete Kostengröße und eine Varianz . Durchläuft man , zeichnet man eine Kurve in der -Ebene nach — die effiziente Grenze der Ausführung, in direkter Analogie zu Markowitz. Sie ist konvex und fallend: weniger Varianz kostet stets mehr erwarteten Shortfall, mit stark abnehmenden Grenzerträgen. Am Grenzpunkt, der durch ein gegebenes ausgewählt wird, ist die Risikoaversion die (negative) Steigung der Tangente: .

Die Grenze formuliert die Frage "Was ist ?" — die niemand introspektiv beantworten kann — um in "Welchen Kosten-Risiko-Trade-off will ich?", die ein Desk tatsächlich beantworten kann. Drei praktische Wege, den Punkt zu wählen:
- Grenzkosten-Argumentation. Laufen Sie die Grenze ab und fragen Sie: "Wenn ich von diesem Punkt zum nächsten wechsle, zahle ich Dollar erwartete Kosten, um Dollar Standardabweichung des Shortfalls zu beseitigen — mache ich diesen Tausch?" Der Knick der Grenze ist meist bis auf einen Faktor 2 offensichtlich, und die Trajektorie reagiert bei dieser Auflösung unempfindlich auf .
- Risikobudget. Legen Sie eine maximal akzeptable Shortfall-Standardabweichung fest (z. B. "die Eintages-1-Sigma der Restposition muss unter 15 bps des Nominalvolumens bleiben") und wählen Sie die günstigste Trajektorie, die dies erfüllt. Das ist ein Nebenbedingungsproblem, dessen Lagrange-Multiplikator ist.
- Charakteristische-Zeit-Zielsetzung. Wählen Sie direkt ("diese Order sollte eine Halbwertszeit von 90 Minuten haben") und rechnen Sie zurück. Das ist es, was die meisten Praktiker implizit tun, wenn sie einen "Dringlichkeits"-Regler einstellen.
Ein durchgerechnetes Beispiel mit Zahlen, die wir im Kalibrierungsabschnitt begründen werden. Verkaufe BTC bei S_0 = \100{,}000T = 4\sigma = $600\sqrt{\text{h}}\eta = 1.0\ $\cdot\text{h}/\text{BTC}\lambda = 10^{-6}\ $^{-1}$. Dann
Der optimale Zeitplan verkauft 46,2 BTC in der ersten Stunde (TWAP: 25). Temporäre Kosten: \eta \int_0^T v(t)^2 dt \approx \3{,}290$2{,}500$53{,}000$69{,}300 bei TWAP. Für zusätzliche 0,8 bps erwartete Kosten auf das Nominalvolumen von \10 Mio. senken Sie also das Shortfall-Risiko um 23 %. Das ist der gesamte Inhalt des Modells in einem Satz: Es bepreist die Versicherung und überlässt Ihnen die Entscheidung, ob Sie sie kaufen.
Die Trajektorie selbst sind zehn Zeilen Python:
import numpy as np
def almgren_chriss(X, T, N, sigma, eta, gamma, lam):
"""Optimal liquidation trajectory (discrete AC 2001)."""
tau = T / N
eta_t = eta - 0.5 * gamma * tau # tilde-eta
kappa_t2 = lam * sigma**2 / eta_t # tilde-kappa^2
kappa = np.arccosh(0.5 * kappa_t2 * tau**2 + 1) / tau
t = np.arange(N + 1) * tau
x = X * np.sinh(kappa * (T - t)) / np.sinh(kappa * T)
n = x[:-1] - x[1:] # child order sizes
E = 0.5 * gamma * X**2 + (eta_t / tau) * np.sum(n**2)
V = sigma**2 * tau * np.sum(x[1:]**2)
return x, n, E, V
x, n, E, V = almgren_chriss(X=100, T=4, N=48, sigma=600,
eta=1.0, gamma=0.3, lam=1e-6)
print(f"first-hour qty: {n[:12].sum():.1f} BTC, "
f"E=${E:,.0f}, std=${np.sqrt(V):,.0f}")
Durchlaufen Sie lam über np.logspace(-8, -4, 50) und plotten Sie gegen — das ist Ihre Grenze, und die gesamte Entscheidungsfläche passt auf ein Diagramm, das Sie einem Risikokomitee vorlegen können.
Kalibrierung: , , aus Binance-Daten
Hier sterben 90 % der Implementierungen still. Die Trajektorienformel ist trivial; die Parameter sind es nicht. Drei Größen, drei verschiedene Schätzprobleme.

: die einfache
Absolute Volatilität pro Wurzel-Stunde, aus Mid-Preis-Renditen. Verwenden Sie 1-Minuten-Bars und skalieren Sie; bei feinerer Abtastung verzerrt Mikrostrukturrauschen (Bid-Ask-Bounce) die realisierte Varianz nach oben. Diese Schätzung ist solide — Volatilität ist der eine Parameter, den Sie richtig hinbekommen werden.
: temporärer Impact aus dem Orderbuch und aus Trades
Zwei sich ergänzende Wege. Weg A — durch das L2-Orderbuch laufen. Aus Depth-Snapshots berechnen Sie die Kosten eines hypothetischen marktausführbaren Sweeps der Größe : den VWAP der aufgezehrten Level abzüglich des Mid. Der Fit liefert den instantanen Impact pro BTC. Um in das ratenbasierte des Modells umzurechnen, müssen Sie eine Auffüllzeit des Orderbuchs annehmen (Größenordnung 10–60 s für BTCUSDT): Handeln mit Rate zehrt pro Auffüllzyklus auf, sodass . Genau diese Annahme — sofortige, vollständige Auffüllung nach einer festen Uhr — ist der Riss, durch den Obizhaeva-Wang eintritt; mehr dazu unten. Weg B — realisierte Slippage auf Partizipation regressieren. Bündeln Sie aggressiven (Taker-)Flow in 1-Minuten-Bins; regressieren Sie für jeden Bin den Taker-seitigen VWAP-minus-Open-Mid gegen die Taker-Volumenrate. Weg B misst, was der Markt Aggressoren tatsächlich berechnet hat; Weg A misst, was das ruhende Orderbuch gerade jetzt berechnen würde. Wenn beide um einen Faktor 3 auseinanderliegen, glauben Sie B für das Niveau und A für die Intraday-Form.
: permanenter Impact via Kyle-artiger Regression
Regressieren Sie Mid-Preis-Änderungen auf den vorzeichenbehafteten Netto-Taker-Flow über 5-Minuten-Fenster:
Prüfen Sie dann, dass der Impact ein Fenster später nicht zurückgesprungen ist — die nicht zurückkehrende Komponente ist auf Ihrer Handelszeitskala "permanent". Dies ist mit weitem Abstand die verrauschteste der drei.
Lauffähiger Code, der nur öffentliche Binance-REST-Endpunkte nutzt:
import requests, numpy as np, pandas as pd
B = "https://api.binance.com/api/v3"
sym = "BTCUSDT"
kl = requests.get(f"{B}/klines", params=dict(
symbol=sym, interval="1m", limit=1000)).json()
close = np.array([float(k[4]) for k in kl])
sigma = np.diff(close).std() * np.sqrt(60) # $/sqrt(h)
d = requests.get(f"{B}/depth",
params=dict(symbol=sym, limit=5000)).json()
bids = np.array(d["bids"], dtype=float) # [price, qty]
mid = (bids[0, 0] + float(d["asks"][0][0])) / 2
cq = np.cumsum(bids[:, 1]) # cum qty
cn = np.cumsum(bids[:, 0] * bids[:, 1]) # cum notional
sizes = np.linspace(0.5, 50, 40) # BTC probes
cost = [mid - np.interp(q, cq, cn) / q for q in sizes]
eps, eta_inst = np.polyfit(sizes, cost, 1)[::-1] # cost ~ eps + k*q
eta = eta_inst * (30 / 3600) # 30s refresh -> $*h/BTC
tr = requests.get(f"{B}/aggTrades",
params=dict(symbol=sym, limit=1000)).json()
df = pd.DataFrame(dict(
t=[t["T"] for t in tr],
p=[float(t["p"]) for t in tr],
q=[float(t["q"]) * (-1 if t["m"] else 1) for t in tr]))
df["bin"] = df.t // 300_000 # 5-min bins
g = df.groupby("bin").agg(dp=("p", lambda s: s.iloc[-1] - s.iloc[0]),
qn=("q", "sum"))
gamma = np.polyfit(g.qn, g.dp, 1)[0] # $/BTC
print(f"sigma={sigma:.0f} $/sqrt(h) eta={eta:.2f} $*h/BTC "
f"gamma={gamma:.3f} $/BTC")
Für die Produktion ersetzen Sie die einzelne aggTrades-Seite durch einige Tage der historischen Dumps und führen die -Regression über Tausende von Bins aus, nicht über eine Handvoll.
Warum die Krypto-Kalibrierung verrauscht ist und was man dagegen tun kann
Führen Sie die -Regression auf echten Daten aus, und Sie erhalten ein von wenigen Prozent und einen Koeffizienten, der sich zwischen den Tagen um einen Faktor 2–5 bewegt. Das ist kein Bug in Ihrem Code. Die Gründe sind strukturell:
- Endogenität. Der Flow reagiert ebenso sehr auf den Preis, wie der Preis auf den Flow reagiert. Momentum-Trader kaufen, weil der Preis gestiegen ist; eine naive OLS-Regression der Renditen auf den Flow greift deren Reaktion auf und schreibt sie dem Impact zu. Die saubere Lösung ist, Ihre eigenen Ausführungen zu verwenden (konstruktionsbedingt exogen) — die Sie erst haben, nachdem Sie eine Weile gehandelt haben.
- Konkavität. Realer Impact ist konkav in der Größe — empirisch nahe der Quadratwurzel (Almgren, Thum, Hauptmann und Li, 2005, "Direct estimation of equity market impact", fanden einen Exponenten nahe 0,6; dieselbe Konkavität ist auch in Krypto robust). Eine Gerade an eine konkave Funktion zu fitten bedeutet, dass Ihr und vom Größenbereich in der Stichprobe abhängen. Kalibrieren Sie bei den Partizipationsraten, die Sie tatsächlich handeln werden.
- Fragmentierung und Führung durch Derivate. BTCUSDT-Spot auf Binance ist nur ein Handelsplatz von vielen, und die Preisfindung findet häufig auf Perps statt. Flow, den Sie nie sehen, bewegt den Preis, auf den Sie regressieren, und bläht den Rauschterm auf.
- Regimeabhängigkeit. In der Asien-Session gemessenes beschreibt nicht die US-Eröffnung; der Impact verdoppelt sich grob, wenn sich die Volatilität verdoppelt. Kalibrieren Sie je Session und fitten Sie mindestens wöchentlich neu.
Der rettende Umstand: Die Trajektorie ist nachsichtig. , sodass ein Fehler um Faktor 2 in das nur um verschiebt, und die Kostenfunktion ist nahe dem Optimum flach. auf einen Faktor 2 genau und auf eine Größenordnung genau zu treffen, erfasst bereits den Großteil der gegenüber TWAP verfügbaren Verbesserung. Präzision zählt für Pre-Trade-Kostenschätzungen; Robustheit genügt für das Scheduling.
Wo das Modell bricht und die Paper, die es reparieren
Almgren-Chriss ist ein Gerüst, und genau zu wissen, welcher Träger tragend ist, sagt Ihnen, nach welcher Erweiterung Sie greifen sollten.
Nichtlinearer Impact — Almgren (2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk" (Applied Mathematical Finance 10, 1–18) wiederholt das Programm mit einem temporären Impact als Potenzgesetz . Für das empirisch favorisierte — das Quadratwurzelgesetz — ändern die optimalen Trajektorien ihren Charakter: Konkaver Impact bestraft Bursts weniger als linearer Impact, sodass optimale Zeitpläne bei gleichem stärker nach vorne verlagert werden. Die qualitative Struktur (Dringlichkeitsparameter, effiziente Grenze) bleibt erhalten; die sinh-Formel nicht.
Resilienz und das LOB — Obizhaeva und Wang (2013). "Optimal trading strategy and supply/demand dynamics" (Journal of Financial Markets 16(1), 1–32; das Working Paper kursierte ab 2005) ersetzt die Dichotomie temporär/permanent durch ein Limit-Orderbuch mit endlicher Tiefe und exponentiell abklingendem Impact: Ihr Trade frisst das Orderbuch, und das Orderbuch füllt sich mit der Resilienzrate wieder auf. Die AC-Annahme "temporärer Impact verschwindet augenblicklich" ist der Grenzfall . Die optimale Strategie ändert ihre Form dramatisch: ein Block-Trade zu Beginn, ein Block am Ende und eine konstante Handelsrate dazwischen — die Blöcke nutzen die Erholung des Orderbuchs aus. Wenn Ihr Child-Order-Intervall mit der Auffüllzeit des Handelsplatzes vergleichbar ist (in Krypto Sekunden bis eine Minute — was oft der Fall ist), befinden Sie sich im Obizhaeva-Wang-Territorium, nicht im Almgren-Chriss-Territorium, und der -Kniff in der obigen Kalibrierung ist Ihr Warnsignal.
Keine dynamische Arbitrage — Gatheral (2010). "No-dynamic-arbitrage and market impact" (Quantitative Finance 10(7), 749–759) fragt, welche Kombinationen aus instantaner Impact-Funktion und Abklingkern in sich konsistent sind, also keine Round-Trip-Strategie mit negativen Erwartungskosten zulassen. Die Ergebnisse sind scharf: Exponentielles Abklingen ist nur mit linearem Impact verträglich — kombinieren Sie exponentielles Abklingen mit Quadratwurzel-Impact, und das Modell lässt sich durch eine oszillierende Trade-Sequenz zu Geld pumpen; nichtlinearer Impact erfordert ein Potenzgesetz-Abklingen, mit einer Ungleichung, die die beiden Exponenten verknüpft (für Impact und Abklingen grob ). Dies ist das Paper, das man lesen sollte, bevor man einen ausgefallenen Abklingkern auf sein Impact-Modell schraubt: Die meisten Ad-hoc-Kombinationen sind heimlich arbitrierbar, was in der Praxis bedeutet, dass Ihr Optimierer die Arbitrage entdeckt und absurde oszillierende Zeitpläne produziert. Wenn Ihre "optimale" Trajektorie während einer reinen Liquidation zwischen Käufen und Verkäufen wechselt, haben Sie Gatheral verletzt, nicht Alpha entdeckt.
Die ML-Fortsetzungen. Zwei Stränge dieser Serie bauen direkt auf diesem Gerüst auf. Erstens Reinforcement-Learning-Ausführung: Sobald man zugesteht, dass Impact nichtlinear, zustandsabhängig und nur teilweise beobachtbar ist, ist die geschlossene Form dahin, und RL (ab dem Q-Learning-Paper von Nevmyvaka, Feng und Kearns aus dem Jahr 2006) ist ein naheliegender Weg, den Trajektorienraum zu durchsuchen — doch jeder ernstzunehmende RL-Ausführungsagent wird gegen die AC-Lösung gebenchmarkt und oft aus ihr heraus initialisiert. Zweitens neuronale Price-Impact-Modelle: Man ersetzt durch ein gelerntes Funktional des Orderbuchzustands und behält die Mittelwert-Varianz-Scheduling-Logik obenauf. Keine der beiden Fortsetzungen ergibt Sinn, ohne genau zu wissen, was die lineare-gaußsche Baseline ist und warum sie die Form hat, die sie hat.
Was man mitnehmen sollte
Das Modell besteht aus drei Annahmen, einer Differenzengleichung und einer Zahl. Linearer permanenter Impact (erzwungen durch Nicht-Manipulation), linearer temporärer Impact (eine Näherung, um die herum man kalibriert), arithmetisches Brownsches Rauschen. Das Optimum wägt Bestandsvarianz gegen Impact-Kosten ab, die gesamte Strategie kollabiert in die Dringlichkeit , und TWAP fällt als der degenerierte Fall heraus — was die einzelne nützlichste Tatsache im Modell ist, denn sie verwandelt "Sollten wir das per TWAP machen?" von einer Gewohnheitsfrage in eine überprüfbare Aussage über die Risikoaversion. Die eigentliche Arbeit ist die Kalibrierung: ist leicht, ist ein Faktor-2-Spiel, ist ein Forschungsprojekt, und die Trajektorie verzeiht alle drei. Implementieren Sie es an einem Nachmittag; verbringen Sie den Rest des Monats mit der Regressionsdiagnostik.
Referenzen
- Almgren, R., Chriss, N. (2001). "Optimal execution of portfolio transactions." Journal of Risk, 3(2), 5–39.
- Almgren, R. (2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk." Applied Mathematical Finance, 10(1), 1–18.
- Almgren, R., Thum, C., Hauptmann, E., Li, H. (2005). "Direct estimation of equity market impact." Risk, 18(7), 58–62.
- Huberman, G., Stanzl, W. (2004). "Price manipulation and quasi-arbitrage." Econometrica, 72(4), 1247–1275.
- Obizhaeva, A., Wang, J. (2013). "Optimal trading strategy and supply/demand dynamics." Journal of Financial Markets, 16(1), 1–32.
- Gatheral, J. (2010). "No-dynamic-arbitrage and market impact." Quantitative Finance, 10(7), 749–759.
- Nevmyvaka, Y., Feng, Y., Kearns, M. (2006). "Reinforcement learning for optimized trade execution." ICML 2006.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.