159 lines
6.4 KiB
Markdown
159 lines
6.4 KiB
Markdown
# DLOB stats — definicje i wizualizacja
|
||
|
||
Ten dokument opisuje metryki liczone z orderbooka DLOB (Drift Limit Order Book) oraz propozycje, jak je prezentować w naszej wizualizacji (warstwami/panelami).
|
||
|
||
## Źródła danych (tabele)
|
||
|
||
### `dlob_l2_latest` (snapshot L2, “surowy”)
|
||
|
||
Snapshot top‑N leveli orderbooka per market.
|
||
|
||
- `bids` / `asks`: tablice poziomów `{ price, size }` (wartości zwykle w “skalowanych intach” wg `PRICE_PRECISION` i `BASE_PRECISION`).
|
||
- `best_bid_price` / `best_ask_price`, `mark_price`, `oracle_price`: w praktyce do szybkiego odczytu top‑of‑book (ale najdokładniej liczyć z `bids/asks`).
|
||
- `ts`, `slot`: czas/slot źródłowego snapshota z DLOB.
|
||
- `updated_at`: kiedy worker zapisał snapshot do DB (do oceny “świeżości”).
|
||
|
||
Z tego źródła robimy: orderbook UI (paski/heat), mikro‑ceny, symulacje fill.
|
||
|
||
### `dlob_stats_latest` (agregat z L2 pod UI)
|
||
|
||
Pochodne metryki liczone na podstawie `dlob_l2_latest` (lub równoważnego L2), trzymane jako “latest” per market.
|
||
|
||
Metryki:
|
||
|
||
- `best_bid_price`, `best_ask_price` (USD): najlepszy bid/ask.
|
||
- `mid_price` (USD): `(best_bid_price + best_ask_price) / 2`.
|
||
- `spread_abs` (USD): `best_ask_price - best_bid_price`.
|
||
- `spread_bps` (bps): `(spread_abs / mid_price) * 10_000` (1 bps = 0.01%).
|
||
- `depth_levels` (liczba): ile leveli z każdej strony weszło do “depth”.
|
||
- `depth_bid_base`, `depth_ask_base` (base asset): suma size (w jednostkach bazowych) po top‑N levelach.
|
||
- `depth_bid_usd`, `depth_ask_usd` (USD): suma `size_base * price` po top‑N levelach.
|
||
- `imbalance` ([-1..1]): `(depth_bid_usd - depth_ask_usd) / (depth_bid_usd + depth_ask_usd)`; >0 = relatywnie większa płynność po bid.
|
||
- `mark_price`, `oracle_price` (USD): ceny referencyjne (mark i oracle).
|
||
- `ts`, `slot`, `updated_at`: metadane czasu/świeżości.
|
||
|
||
To jest najszybsze źródło do overlay na wykresie i do KPI w headerze.
|
||
|
||
### `dlob_depth_bps_latest` (płynność w pasmach wokół mid)
|
||
|
||
Metryki głębokości, ale nie “top‑N leveli” tylko “okno odległości od ceny” w bps.
|
||
|
||
Klucz:
|
||
|
||
- `(market_name, band_bps)` np. 5/10/20/50/100/200 bps.
|
||
|
||
Interpretacja:
|
||
|
||
- Dla danego `band_bps` sumujemy płynność tylko z poziomów, które mieszczą się w oknie ±`band_bps` wokół `mid_price`.
|
||
|
||
Metryki:
|
||
|
||
- `bid_base`, `ask_base` (base asset): suma size w oknie.
|
||
- `bid_usd`, `ask_usd` (USD): suma `size_base * price` w oknie.
|
||
- `imbalance` ([-1..1]): jak wyżej, ale per band.
|
||
- `mid_price`, `best_bid_price`, `best_ask_price` (USD): do kontekstu wyliczeń.
|
||
- `ts`, `slot`, `updated_at`, `raw`: metadane/diagnostyka.
|
||
|
||
To jest najlepsze źródło do wykresów “jak gruby jest orderbook blisko ceny”.
|
||
|
||
### `dlob_slippage_latest` (symulacja slippage vs rozmiar)
|
||
|
||
Symulacja wykonania zlecenia rynkowego po L2.
|
||
|
||
Klucz:
|
||
|
||
- `(market_name, side, size_usd)` gdzie `side ∈ {buy,sell}` a `size_usd` to predefiniowane progi (np. 100/500/1000/…).
|
||
|
||
Metryki:
|
||
|
||
- `impact_bps` (bps): wpływ wykonania vs `mid_price` (zwykle `vwap` względem mid).
|
||
- `vwap_price` (USD): średnia cena wykonania.
|
||
- `worst_price` (USD): najgorszy poziom dotknięty podczas fill.
|
||
- `filled_usd`, `filled_base`: ile realnie weszło w fill (gdy brak płynności, może być < docelowego).
|
||
- `fill_pct` (%): 100% = pełny fill.
|
||
- `levels_consumed`: ile leveli zostało “zjedzone”.
|
||
- `mid_price`, `ts`, `slot`, `updated_at`, `raw`: metadane/diagnostyka.
|
||
|
||
To jest idealne do “Dynamic Slippage” w formularzu i do wykresu slippage‑vs‑size.
|
||
|
||
## Jak nanieść na wizualizację (warstwy/panele)
|
||
|
||
Poniżej propozycja warstw, pogrupowanych tak, żeby serie w jednej warstwie były w tej samej “domenie” (jednostki i semantyka).
|
||
|
||
### Warstwa 1: Cena / Quotes (oś Y = USD, overlay na głównym wykresie)
|
||
|
||
Źródło: `dlob_stats_latest`.
|
||
|
||
- Linie: `mark_price` i `oracle_price` (referencje).
|
||
- Linie: `best_bid_price` i `best_ask_price` (top‑of‑book).
|
||
- Opcjonalnie: `mid_price` jako linia przerywana.
|
||
- Opcjonalnie: “spread band” (wypełnienie między bid i ask).
|
||
|
||
Efekt: w jednym miejscu widać gdzie jest rynek + jak szeroki jest spread.
|
||
|
||
### Warstwa 2: Spread (panel pod wykresem, oś Y = bps)
|
||
|
||
Źródło: `dlob_stats_latest`.
|
||
|
||
- Linia: `spread_bps`.
|
||
- Tooltip/secondary: `spread_abs` (USD) jako dodatkowa informacja (zwykle bez drugiej osi, żeby nie mieszać skali).
|
||
|
||
Efekt: szybkie “koszt wejścia/wyjścia” i jego zmienność.
|
||
|
||
### Warstwa 3: Płynność top‑N + imbalance (panel, oś Y = USD + opcjonalnie linia imbalance)
|
||
|
||
Źródło: `dlob_stats_latest`.
|
||
|
||
- Area: `depth_bid_usd` i `depth_ask_usd` (dwie serie, zielona/czerwona).
|
||
- Opcjonalnie: linia `imbalance` (druga oś, zakres [-1..1]) albo jako wskaźnik liczbowy.
|
||
|
||
Efekt: ile jest płynności “najbliżej” top‑of‑book (w definicji top‑N leveli).
|
||
|
||
### Warstwa 4: Płynność jako funkcja odległości (bps bands) (panel)
|
||
|
||
Źródło: `dlob_depth_bps_latest`.
|
||
|
||
Dwa czytelne warianty prezentacji:
|
||
|
||
1) Fan chart / multi‑line:
|
||
- Linie `bid_usd(band_bps)` i `ask_usd(band_bps)` dla kilku bandów (np. 10/50/200).
|
||
|
||
2) Stacked:
|
||
- Słupki/area pokazujące “ile dodaje kolejne pasmo” (np. 0–10, 10–20, 20–50 bps), osobno dla bid i ask.
|
||
|
||
Efekt: “jak szybko rośnie płynność, gdy odchodzę od mid”.
|
||
|
||
### Warstwa 5: Slippage vs size (osobny panel XY, nie timeline)
|
||
|
||
Źródło: `dlob_slippage_latest`.
|
||
|
||
- Oś X: `size_usd`.
|
||
- Oś Y: `impact_bps`.
|
||
- Dwie krzywe: `buy` i `sell`.
|
||
- Marker: aktualny “Order Value” z formularza (punkt na krzywej).
|
||
|
||
Efekt: bardzo czytelna krzywa kosztu wykonania względem rozmiaru.
|
||
|
||
### Warstwa 6: Heat / “paski” orderbooka (widok orderbook albo overlay z ograniczeniem)
|
||
|
||
Źródło: `dlob_l2_latest`.
|
||
|
||
- Paski (zielone/czerwone) per poziom ceny, intensywność ∝ `size` (jak na Drift UI).
|
||
- To najlepiej działa jako:
|
||
- osobny panel “Orderbook” (snapshot), albo
|
||
- “edge overlay” przy prawej krawędzi wykresu (bez historii).
|
||
|
||
Efekt: “gdzie stoją ściany” i jak się zmieniają.
|
||
|
||
## Uwaga o historii (“latest” vs wykres w czasie)
|
||
|
||
Tabele `*_latest` są świetne do live UI i subscriptions, ale **nie przechowują historii** do rysowania timeline (np. spread przez ostatnie 24h).
|
||
|
||
Jeśli chcemy historię:
|
||
|
||
- opcja A: dodać osobne tabele time‑series (np. `dlob_stats_ts`, `dlob_depth_bps_ts`, `dlob_slippage_ts`) i zasilać je workerem,
|
||
- opcja B: rozszerzyć ingest ticków (`drift_ticks`) o dodatkowe pola/nową tabelę eventów dla metryk orderbooka.
|
||
|
||
Wtedy warstwy 2–5 mogą być prawdziwymi wykresami “w czasie”, a nie tylko bieżącym odczytem.
|
||
|