← Zurück zu den Artikeln
August 17, 2026
5 min read

Order Flow Imbalance: The Cont-Kukanov-Stoikov Event Decomposition

Order Flow Imbalance: The Cont-Kukanov-Stoikov Event Decomposition
#microstructure
#order-flow
#imbalance
#prediction
#HFT

Die meisten aus Büchern abgeleiteten Signale in diesem Blog sind Schnappschüsse: Wie viel Volumen ruht gerade auf jeder Seite? Ein Ungleichgewicht im Auftragsfluss ist ein anderes Objekt. Dabei handelt es sich um eine Zerlegung des Aktualisierungsstroms zwischen zwei Snapshots in eine einzige signierte Menge – eine, die eine Stornierung des Gebots genauso zählt wie einen Marktverkauf.

Diese Zerlegung ist Gegenstand dieses Artikels. Konkret: die Ereignisindikatoren von Cont-Kukanov-Stoikov (2014), die es definieren, die mehrstufige Erweiterung von Xu-Gould-Howison (2019) und ihre Hauptkomponentenreduzierung sowie die Lee-Ready- und Bulk-Volumenklassifizierungsregeln, die Sie benötigen, wenn Ihr Feed die Handelsrichtung nicht kennzeichnet.

Eine einleitende Anmerkung vorweg, denn sie regelt, wie Sie jede Zahl unten lesen sollten. Das berühmte R-Quadrat von 50–65 % aus dem CKS-Papier ist eine zeitgleiche Regression: Preisänderung über ein Intervall, regressiv auf den Auftragsfluss über dasselbe Intervall. Es handelt sich um eine Zerlegung der Preisbewegungen, nicht um deren Prognose. Vergleicht man es mit der Varianz von 1–2 %, die ein tägliches Aktienrenditemodell erklärt, ist das Gleiche, und dieser Blog hat in DeepLOB und der Prognose-Gewinn-Lücke und in dem ehrlichen negativen Ergebnis ausführlich dargelegt, dass Tutorials zu Fallen werden, wenn man beides miteinander vermischt. Eine streng verzögerte OFI-Regression ist eine legitime und viel kleinere Zahl. In diesem Artikel wird nicht darüber berichtet.

Warum Orderflow, nicht Trades

Vier Orderbuchmechanismen, die zu einem vorzeichenbehafteten Flusssignal zusammenlaufen

Eine Preisänderung in einem kontinuierlichen Limit-Orderbuch erfolgt durch genau vier Mechanismen: Ein Marktkauf verbraucht ruhende Briefe; ein Marktverkauf verbraucht ruhende Gebote; eine Stornierung des Gebots entzieht die Unterstützung und lässt das Gebot sinken; Eine neue Limit-Order auf der Briefseite sorgt für zusätzlichen Widerstand. Nur die ersten beiden sind Trades. Die letzten beiden sind für jede volumenbasierte Kennzahl unsichtbar – VWAP, Bilanzvolumen, unterzeichneter Handelsfluss – und an den meisten Handelsplätzen übersteigt das Order-to-Trade-Verhältnis 10:1, sodass der unsichtbare Teil den größten Teil ausmacht. Der gesamte Nutzenanspruch von OFI besteht darin, dass alle vier Mechanismen in der gleichen Größenordnung bewertet werden. (Informationen zum Buch als Datenstruktur und zum Standard-Snapshot-Feature-Vektor 4L4L finden Sie unter DeepLOB.)

Das Cont-Kukanov-Stoikov OFI-Modell

Bid- und Ask-Übergänge in der CKS-Ereigniszerlegung

Das grundlegende Modell stammt aus der Arbeit von Cont, Kukanov und Stoikov aus dem Jahr 2014 „The Price Impact of Order Book Events“ (Journal of Financial Econmetrics).

Definieren eines Ungleichgewichts im Auftragsfluss

Berücksichtigen Sie den besten Geldkurs PtbP^b_t, den besten Briefkurs PtaP^a_t und ihre Größen QtbQ^b_t und QtaQ^a_t. Zwischen aufeinanderfolgenden Beobachtungen bei tn1t_{n-1} und tnt_n:

OFIn=enBenSOFI_n = e_n^B - e_n^S

wobei die kaufseitigen und verkaufsseitigen Ereignisbeiträge wie folgt lauten:

enB=1{Pnb>Pn1b}Qnb1{Pnb<Pn1b}Qn1b+1{Pnb=Pn1b}(QnbQn1b)e_n^B = \mathbb{1}_{\{P^b_n > P^b_{n-1}\}} Q^b_n - \mathbb{1}_{\{P^b_n < P^b_{n-1}\}} Q^b_{n-1} + \mathbb{1}_{\{P^b_n = P^b_{n-1}\}} (Q^b_n - Q^b_{n-1}) enS=1{Pna<Pn1a}Qna1{Pna>Pn1a}Qn1a+1{Pna=Pn1a}(QnaQn1a)e_n^S = \mathbb{1}_{\{P^a_n < P^a_{n-1}\}} Q^a_n - \mathbb{1}_{\{P^a_n > P^a_{n-1}\}} Q^a_{n-1} + \mathbb{1}_{\{P^a_n = P^a_{n-1}\}} (Q^a_n - Q^a_{n-1})

Im Klartext: Wenn der beste Angebotspreis steigt, entsteht neues Kaufinteresse – rechnen Sie es in voller Höhe als positiv. Wenn es sinkt, verschwindet das Kaufinteresse – subtrahieren Sie die alte Größe. Wenn der Preis unverändert bleibt, zählen nur die Größenänderungen. Die Briefseite ist das Spiegelbild.

Das Schöne daran ist, dass diese drei Indikatorzweige jeden möglichen Übergang des Buchanfangs abdecken, sodass jede Aktualisierung genau einer vorzeichenbehafteten Zahl zugeordnet wird. Keine Handelsklassifizierung, keine Seitenbezeichnungen, kein Feed auf Nachrichtenebene erforderlich – zwei aufeinanderfolgende Schnappschüsse reichen aus.

Aggregation über Intervalle

Für ein Intervall [T1,T2][T_1, T_2] mit NN Buchaktualisierungen:

OFI[T1,T2]=n=1NOFIn=n=1N(enBenS)OFI_{[T_1,T_2]} = \sum_{n=1}^{N} OFI_n = \sum_{n=1}^{N} (e_n^B - e_n^S)

Das lineare Preisauswirkungsmodell

ΔP[T1,T2]=α+βOFI[T1,T2]+ε\Delta P_{[T_1,T_2]} = \alpha + \beta \cdot OFI_{[T_1,T_2]} + \varepsilon

Dabei ist ΔP\Delta P die Änderung des Mittelpreises, β\beta der Preisauswirkungskoeffizient und ε\varepsilon das Restrauschen. Für US-Aktien über 10-Sekunden- bis 1-Minuten-Intervalle meldet CKS gleichzeitige R2R^2 von 50-65 % pro Aktie. Nochmals: gleiches Intervall, nicht zukunftsorientiert.

Querschnittsskalierung

CKS zeigte auch, dass der Wirkungskoeffizient umgekehrt mit der Tiefe skaliert:

β1Dˉ\beta \propto \frac{1}{\bar{D}}

wobei Dˉ\bar{D} das durchschnittliche Ruhevolumen beim besten Geld- und Briefkurs ist. Der gleiche Fluss treibt den Preis in einem dünnen Buch weiter in die Höhe. Dies ist der Teil des Modells, der sich zwischen verschiedenen Standorten überträgt, ohne dass die Ebene angepasst werden muss, da er eine Beziehung und nicht eine Zahl vorhersagt – und er ist direkt an Kryptopaaren unterschiedlicher Tiefe testbar.

Multi-Level-Order-Flow-Ungleichgewicht (MLOFI)

Mehrstufige Orderbuchtiefe komprimiert in ein Hauptsignal

Das Originalmodell verwendet nur die Buchoberseite. Xu, Gould und Howison (2019) haben es auf LL-Niveaus erweitert.

Definition

MLOFIn=(OFIn(1)OFIn(2)OFIn(L))\mathbf{MLOFI}_n = \begin{pmatrix} OFI_n^{(1)} \\ OFI_n^{(2)} \\ \vdots \\ OFI_n^{(L)} \end{pmatrix}

Dabei wendet OFIn()OFI_n^{(\ell)} die identische Formel mit drei Zweigen auf das \ell-te Geld-/Briefpaar an.

Preisauswirkungen auf mehreren Ebenen

ΔP=α+βTMLOFI+ε=α+=1LβOFI()+ε\Delta P = \alpha + \boldsymbol{\beta}^T \cdot \mathbf{MLOFI} + \varepsilon = \alpha + \sum_{\ell=1}^{L} \beta_\ell \cdot OFI^{(\ell)} + \varepsilon

Das veröffentlichte Ergebnis zu Nasdaq-Aktien besagt, dass jedes zusätzliche Niveau R2R^2 außerhalb der Stichprobe hinzufügt – etwa 10–15 Prozentpunkte von einem Niveau auf fünf, wobei bei zehn immer noch geringfügige Gewinne vorhanden sind. Die Koeffizienten fallen monoton ab, β1>β2>>βL|\beta_1| > |\beta_2| > \cdots > |\beta_L|: Die Oberseite des Buchs dominiert, aber tiefere Ebenen übertragen ein nicht triviales inkrementelles Signal.

Ob dies in einem Kryptobuch überlebt, ist die interessanteste offene Frage in diesem Artikel. Krypto-Bücher sind dünner und in der Tiefe weitaus unübersichtlicher, und es ist durchaus plausibel, dass die Stufen 2–5 nichts hinzufügen, wenn man ein Nasdaq-Orderbuch verlässt.

Hauptkomponentenreduzierung

OFIs benachbarter Ebenen sind stark korreliert (über 0,8 in den veröffentlichten Aktienergebnissen), sodass eine Hauptkomponentenzerlegung natürlich ist. Die gemeldete erste Komponente erfasst über 89 % der Gesamtvarianz und dient als einzelnes aggregiertes Signal:

OFIPC1=wTMLOFIOFI^{PC1} = \mathbf{w}^T \cdot \mathbf{MLOFI}

mit w\mathbf{w} dem führenden Eigenvektor der OFI-Kovarianzmatrix. Der praktische Vorteil besteht darin, dass eine kollineare Regression in einen gut konditionierten Skalar zusammengefasst wird – die Durchführung lohnt sich auch dann, wenn der Varianzanteil Ihrer Daten geringer ausfällt.

Trades klassifizieren: Kauf vs. Verkauf initiiert

Handelsereignisse getrennt in Kauf- und Verkaufsinitiierungsströme

OFI selbst benötigt keine Handelsklassifizierung. Wenn Sie es jedoch mit handelsbasierten Maßstäben vergleichen möchten oder nur über aggregierte Balken verfügen, müssen Sie die Richtung ableiten.

Zitatregel

Vergleichen Sie den Handelspreis PtP_t mit dem vorherrschenden Mittelwert Mt=Ptask+Ptbid2M_t = \frac{P^{ask}_t + P^{bid}_t}{2}:

side={+1 (buy)if Pt>Mt1 (sell)if Pt<Mt\text{side} = \begin{cases} +1 \text{ (buy)} & \text{if } P_t > M_t \\ -1 \text{ (sell)} & \text{if } P_t < M_t \end{cases}

Bei einem Handel oberhalb der Mittellinie war es wahrscheinlich, dass ein Käufer das Angebot annahm; Darunter ein Verkäufer, der das Gebot abgibt.

Der Lee-Ready-Algorithmus (1991) ist die Quote-Regel mit einem Tick-Regel-Fallback für Geschäfte genau am Mittelpunkt, wo die Quote-Regel unbestimmt ist. Die Tick-Regel – Vorzeichen der letzten Preisänderung, die die vorherige Seite bei einem Null-Tick weiterführt – ist bereits in Beyond time bars abgeleitet und implementiert, das ein funktionierendes _tick_sign() liefert. Die gemeldete Lee-Ready-Klassifizierungsgenauigkeit beträgt je nach Markt und Zeitraum 72–85 %.

Bulk-Volumen-Klassifizierung (BVC)

Wenn einzelne Geschäfte nicht zugeordnet werden können – aggregierte Balken, die meisten öffentlichen Kerzen-APIs – schätzt die Massenvolumenklassifizierung von Easley, Lopez de Prado und O'Hara den Kaufanteil des Volumens eines Balkens anhand seiner normalisierten Preisänderung:

Vtbuy=VtΦ(ΔPtσΔP)V^{buy}_t = V_t \cdot \Phi\left(\frac{\Delta P_t}{\sigma_{\Delta P}}\right)

mit Φ\Phi dem standardmäßigen normalen CDF und σΔP\sigma_{\Delta P} geschätzt aus jüngsten Preisänderungen. Weniger genau als die Klassifizierung auf Tick-Ebene, funktioniert aber bei OHLCV.

Was OFI nicht ist

Zeitgenössische Zerlegung getrennt von wahrer Vorhersage

Drei benachbarte Größen werden mit OFI verwechselt. Jedes wird an anderer Stelle in diesem Blog ausführlich behandelt; Auf die Unterschiede kommt es hier an.

Statisches Orderbuch-Ungleichgewicht (OBI) ist die Snapshot-Version – ruhendes Geldvolumen gegenüber ruhendem Briefvolumen, keine Ereignisverfolgung. Die Formel und ihre mehrstufige Form finden Sie unter Die traditionellen LOB-Funktionen von DeepLOB. Der Kontrast ist der springende Punkt bei OFI: OBI informiert Sie über den Stand des Buches, OFI erzählt Ihnen, wie es dorthin gelangt ist.

Handelsungleichgewicht (TI) und seine volumengewichteten Varianten sind signierte Handelsströme, die in [Spread-Modellierung mit maschinellem Lernen] (/en/blog/post/spread-modeling-machine-learning) als rollierende Merkmale definiert und implementiert werden. Ein veröffentlichtes Ergebnis über die Beziehung ist hier belastend: Wenn OFI und TI zusammen als Regressoren für mittlere Preisänderungen eingegeben werden, wird TI statistisch unbedeutend. Sein Inhalt wird subsumiert. Das ist der empirische Fall für die Verfolgung von Buchereignissen anstelle von Trades – die Ereignisse, die fast zu Trades wurden, enthalten die gleichen Informationen wie diejenigen, bei denen es zu Trades kam.

Der volumengewichtete Mittelwert ist ein Fair-Value-Schätzer, kein Ungleichgewichtsmaß, und er wird in DeepLOB abgedeckt – einschließlich des Namensvorbehalts, dass es sich nicht um Stoikovs Mikropreis handelt, bei dem es sich um einen Martingal-bereinigten Mt+g(I,S)M_t + g(I,S)-Schätzer handelt, der genau deshalb erstellt wurde, weil der naive gewichtete Mittelwert voreingenommen ist.

Python-Implementierung

Orderbuch-Ereignisstrom, der eine Flow-Berechnungs-Engine durchläuft

Eine direkte Implementierung der CKS-Zerlegung, verallgemeinert auf LL-Ebenen.

Kern-OFI-Berechnung

import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Optional

@dataclass
class OrderBookSnapshot:
    timestamp: float
    bid_prices: np.ndarray   # best bid at index 0, descending
    ask_prices: np.ndarray   # best ask at index 0, ascending
    bid_sizes: np.ndarray
    ask_sizes: np.ndarray

@dataclass
class OFICalculator:
    """
    Computes Order Flow Imbalance from consecutive order book snapshots.
    Supports multi-level OFI (MLOFI) up to `n_levels` deep.
    """
    n_levels: int = 5
    prev_snapshot: Optional[OrderBookSnapshot] = field(default=None, init=False)

    def compute_level_ofi(
        self,
        prev_price: float, curr_price: float,
        prev_size: float, curr_size: float,
        side: str
    ) -> float:
        """Compute single-level OFI contribution for bid or ask side."""
        if side == "bid":
            if curr_price > prev_price:
                return curr_size              # new level appeared above
            elif curr_price < prev_price:
                return -prev_size             # old level disappeared
            else:
                return curr_size - prev_size  # same level, size changed
        else:  # ask side
            if curr_price < prev_price:
                return curr_size              # new level appeared below
            elif curr_price > prev_price:
                return -prev_size             # old level disappeared
            else:
                return curr_size - prev_size  # same level, size changed

    def update(self, snapshot: OrderBookSnapshot) -> Optional[np.ndarray]:
        """
        Process new snapshot, return MLOFI vector of shape (n_levels,).
        Returns None on first call (no previous snapshot to compare).
        """
        if self.prev_snapshot is None:
            self.prev_snapshot = snapshot
            return None

        prev = self.prev_snapshot
        n = min(self.n_levels, len(snapshot.bid_prices), len(prev.bid_prices))
        ofi = np.zeros(n)

        for level in range(n):
            e_buy = self.compute_level_ofi(
                prev.bid_prices[level], snapshot.bid_prices[level],
                prev.bid_sizes[level], snapshot.bid_sizes[level],
                side="bid"
            )
            e_sell = self.compute_level_ofi(
                prev.ask_prices[level], snapshot.ask_prices[level],
                prev.ask_sizes[level], snapshot.ask_sizes[level],
                side="ask"
            )
            ofi[level] = e_buy - e_sell

        self.prev_snapshot = snapshot
        return ofi

Aggregation in Windows

@dataclass
class OFIAggregator:
    """
    Aggregates raw OFI updates into fixed time windows.
    Emits the regression inputs (aggregated MLOFI) and target (delta mid).
    """
    window_seconds: float = 10.0
    n_levels: int = 5
    calculator: OFICalculator = field(init=False)
    buffer: list = field(default_factory=list, init=False)
    window_start: float = 0.0

    def __post_init__(self):
        self.calculator = OFICalculator(n_levels=self.n_levels)

    def on_snapshot(self, snapshot: OrderBookSnapshot) -> Optional[dict]:
        """
        Feed a new order book snapshot.
        Returns aggregated window dict when a window completes, else None.
        """
        ofi_vec = self.calculator.update(snapshot)
        if ofi_vec is None:
            self.window_start = snapshot.timestamp
            return None

        if not self.buffer:
            self.window_start = snapshot.timestamp

        self.buffer.append({
            "timestamp": snapshot.timestamp,
            "ofi": ofi_vec.copy(),
            "mid": (snapshot.bid_prices[0] + snapshot.ask_prices[0]) / 2,
        })

        elapsed = snapshot.timestamp - self.window_start
        if elapsed >= self.window_seconds:
            return self._flush()
        return None

    def _flush(self) -> dict:
        """Aggregate buffered OFI updates into a single window record."""
        ofi_matrix = np.array([b["ofi"] for b in self.buffer])
        agg_ofi = ofi_matrix.sum(axis=0)  # shape: (n_levels,)

        result = {
            "window_start": self.window_start,
            "window_end": self.buffer[-1]["timestamp"],
            "n_updates": len(self.buffer),
            "mid_open": self.buffer[0]["mid"],
            "mid_close": self.buffer[-1]["mid"],
            "delta_mid": self.buffer[-1]["mid"] - self.buffer[0]["mid"],
            "ofi_level1": agg_ofi[0],
            "ofi_total": agg_ofi.sum(),
            "mlofi": agg_ofi,
        }

        self.buffer.clear()
        return result

Beachten Sie, was der Aggregator ausgibt: mlofi und delta_mid über das gleiche Fenster. Das ist die gleichzeitige Regression. Um eine Vorhersage zu erhalten, koppeln Sie die mlofi von Fenster kk mit den delta_mid von Fenster k+1k+1 und erwarten Sie eine wesentlich schlechtere Anpassung.

Handelsklassifizierung (Lee-Ready)

def classify_trades_lee_ready(
    trades: pd.DataFrame,
    quotes: pd.DataFrame
) -> pd.DataFrame:
    """
    Classify trades as buy (+1) or sell (-1) using Lee-Ready:
    quote rule first, tick rule as fallback at the midpoint.

    Parameters
    ----------
    trades : DataFrame with columns ['timestamp', 'price', 'size']
    quotes : DataFrame with columns ['timestamp', 'bid', 'ask']

    Returns
    -------
    trades with added 'side' column
    """
    trades = trades.sort_values("timestamp").copy()
    quotes = quotes.sort_values("timestamp")

    trades = pd.merge_asof(
        trades, quotes,
        on="timestamp",
        direction="backward"
    )

    trades["mid"] = (trades["bid"] + trades["ask"]) / 2

    trades["side"] = np.where(
        trades["price"] > trades["mid"], 1,
        np.where(trades["price"] < trades["mid"], -1, 0)
    )

    trades["price_diff"] = trades["price"].diff()
    tick_sign = np.sign(trades["price_diff"])
    tick_sign = tick_sign.replace(0, np.nan).ffill().fillna(1)

    midpoint_mask = trades["side"] == 0
    trades.loc[midpoint_mask, "side"] = tick_sign[midpoint_mask].astype(int)

    return trades

Normalisierung des Signals

class OFISignal:
    """
    Rolling z-score normalization of aggregated OFI.

    Deliberately does NOT convert OFI into a predicted return: that
    requires a fitted beta, and beta is venue-, pair- and regime-specific.
    Fit it on your own data before wiring this into anything.
    """
    def __init__(self, window_seconds: float = 10.0, n_levels: int = 5,
                 lookback: int = 100):
        self.aggregator = OFIAggregator(
            window_seconds=window_seconds, n_levels=n_levels,
        )
        self.lookback = lookback
        self.ofi_history: list[float] = []

    def process(self, snapshot: OrderBookSnapshot) -> Optional[dict]:
        agg = self.aggregator.on_snapshot(snapshot)
        if agg is None:
            return None

        ofi = agg["ofi_level1"]
        self.ofi_history.append(ofi)
        if len(self.ofi_history) > self.lookback:
            self.ofi_history.pop(0)

        if len(self.ofi_history) >= 20:
            arr = np.array(self.ofi_history)
            mu, sigma = arr.mean(), arr.std()
            zscore = (ofi - mu) / max(sigma, 1e-10)
        else:
            zscore = 0.0

        return {**agg, "ofi_zscore": zscore}

Wo OFI angeschlossen wird

Order-Flow-Signal zur Verbindung mit einer modularen Handelspipeline

Market Making. OFI wird als prädiktiver Skew-Begriff für den beizulegenden Zeitwert eingegeben, zusätzlich zu dem bereits abgeleiteten und codierten Bestandsskew im Avellaneda-Stoikov Market Maker: Pfair=Pmid+γflowOFIzγinvqP^{fair} = P^{mid} + \gamma_{flow} \cdot OFI_{z} - \gamma_{inv} \cdot q. Die beiden Begriffe beantworten unterschiedliche Fragen – der Flow-Term gibt an, wohin sich der Preis entwickelt, der Bestandsbegriff sagt, was Sie sich leisten können zu halten – und der veröffentlichte Artikel befasst sich mit der zweiten Frage, einschließlich der Frage, warum ein positiver Bestand beide Notierungen nach unten drückt. Ein großer OFIz|OFI_z| ist auch ein vernünftiger Auslöser für eine negative Selektion für die Abwehrreaktionen (Ausweitung, Schrumpfung, eine Seite ziehen), die in [digitale Fingerabdrücke der Händleridentifikation] (/en/blog/post/digital-fingerprint-trader-identification) und [Anomalieerkennung] (/en/blog/post/anomaly-detection-algotrading) katalogisiert sind.

Ausführung. OFI ist eine Eingabe für die Füllwahrscheinlichkeitsschätzung pp der Taktikschicht, kein separater Dringlichkeitscontroller. Die Post-versus-Cross-Entscheidung ist eine explizite Break-Even-Arithmetik – p=δ/(Π+δ)p^* = \delta/(\Pi + \delta) mit Π=s+ftfm\Pi = s + f_t - f_m – und lebt in [Taktiken zur Ausführung untergeordneter Aufträge] (/en/blog/post/child-order-execution-tactics), was auch argumentiert, dass die Taktikebene die Dringlichkeit niemals aus ihrer eigenen Sicht auf den Markt ableiten sollte, da dadurch zwei Kontrolleure entstehen, die anderer Meinung sind.

Praktische Überlegungen

Belastbares Marktsignal bewegt sich durch verrauschtes Mikrostrukturgelände

Signalhalbwertszeit und rollierende Neukalibrierung. Dies ist der OFI-spezifische Teil. Der Vorhersagegehalt von OFI zerfällt in flüssigen Instrumenten auf einer Zeitskala von Millisekunden bis Sekunden, was bedeutet, dass das Aggregationsfenster kein freier Parameter ist, sondern eine Wette auf den Horizont. Und β\beta ist keine Konstante: Es bewegt sich im Tagesverlauf, mit der Tiefe und um geplante Ereignisse herum, sodass es bei jeder Produktionsanpassung in gleitenden Fenstern neu geschätzt wird, anstatt einen Wert aus einem Backtest festzulegen.

Alles andere hier wird woanders behandelt. Latenzbudgets und die Co-Location-/FPGA-/Kernel-Bypass-Leiter: DeepLOBs Produktionsabschnitt. Das U-förmige Intraday-Liquiditätsmuster und die Statistik zur driftenden Normalisierung: Spread-Modellierung. Neukalibrierung pro Veranstaltungsort und warum ein an der Nasdaq angepasstes Modell nicht unverändert auf ein Kryptopaar übertragen wird: DeepLOB erneut, mit der Fragmentierungsseite in Smart Order Routing.

Manipulation. Eine Konsequenz ist spezifisch für dieses Modell und sollte klar dargelegt werden: Die CKS-Zerlegung gewichtet jedes Ereignis allein nach Größe, ohne eine Vorstellung von Absicht oder Beständigkeit. Die Größe einer Spoofer-Platzierung und -Unterdrückung speist sich daher konstruktionsbedingt direkt mit vollem Gewicht in das Signal ein. Erkennungsheuristiken – Stornierungsraten, Orderlaufzeiten, Wall-Verhalten bei Annäherung an den Preis – befinden sich in Warteschlangenposition und Orderbuch-Wall-Analyse; Venue-übergreifende Phantomliquidität befindet sich in Smart Order Routing.

Wichtige Erkenntnisse

Wichtige Erkenntnisse zum Auftragsfluss vereinen sich zu einem klaren Signal

  1. OFI ist eine Ereigniszerlegung, kein Schnappschuss. Die dreizweigige Indikatorformel ordnet jeden Top-of-Book-Übergang – Preiserhöhung, Preissenkung, Größenänderung – einer vorzeichenbehafteten Zahl zu, und zwar aus zwei aufeinanderfolgenden Schnappschüssen und sonst nichts.

  2. Das R-Quadrat der Überschrift ist zeitgleich. Die CKS-Zahl von 50–65 % zerlegt Preisbewegungen im gleichen Intervall; Es handelt sich nicht um eine Prognose, und es sollte nicht mit zukunftsorientierten Renditemodellen verglichen werden.

  3. Mehrstufiges OFI fügt Stufen hinzu und PCA reduziert sie. Die veröffentlichten inkrementellen R2R^2- und 89 %-Varianz-Ergebnisse stammen von Nasdaq-Aktien. Ob Tiefe bei einem Krypto-Buch noch hilft, ist hier ungetestet.

  4. OFI subsumiert Handelsungleichgewicht. Zusammengenommen bleibt TI unbedeutend – die Stornierungen, die OFI sieht und TI nicht können, machen den Unterschied.

  5. Das Modell ist blind für Absichten. Gleiche Gewichtung nach Größe ist genau das, was es fälschbar macht.

  6. In diesem Artikel wird nichts gemessen. Alle angegebenen Zahlen stammen aus der Aktienliteratur. Bevor dieses Signal Kapital berührt, muss es mit Ihren eigenen Buchdaten abgeglichen werden, eine separat gemeldete verzögerte Spezifikation und eine Prüfung, ob die Kante Gebühren und den Spread übersteht.

Weiterführende Literatur

Verbundene Mikrostrukturforschungspfade rund um ein OFI-Konzept

  • Cont, R., Kukanov, A. & Stoikov, S. (2014). „Der Preiseinfluss von Orderbuchereignissen.“ Journal of Financial Econmetrics, 12(1), 47-88.
  • Xu, K., Gould, M. & Howison, S. (2019). „Mehrstufiges Order-Flow-Ungleichgewicht in einem Limit-Orderbuch.“ arXiv:1907.06230.
  • Kolm, P., Turiel, J. & Westray, N. (2023). „Deep Order Flow Unbalance: Extrahieren von Alpha an mehreren Horizonten aus dem Limit Order Book.“ Mathematical Finance, 33(4).
  • Lee, C. & Ready, M. (1991). „Ableitung der Handelsrichtung aus Intraday-Daten.“ Journal of Finance, 46(2), 733-746.
  • Easley, D., Lopez de Prado, M. & O'Hara, M. (2012). „Strömungstoxizität und Liquidität in einer Hochfrequenzwelt.“ Review of Financial Studies, 25(5), 1457-1493.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

Dem Markt einen Schritt voraus

Abonniere unseren Newsletter für exklusive KI-Trading-Einblicke, Marktanalysen und Plattform-Updates.

Wir respektieren deine Privatsphäre. Jederzeit abbestellbar.