Updating the Volume Curve Intraday: Does Adaptive Forecasting Actually Help?
In TWAP, VWAP und POV haben wir alle drei Scheduler 90 Tage lang BTCUSDT L2-Wiederholungen direkt gegenübergestellt und sind zu einer Schlussfolgerung gekommen, die absichtlich als offene Wunde belassen wurde: Bei Kryptowährungen ist die Volumenkurve das schwächste Glied der Pipeline, nicht das Slicing. In diesem Artikel wurde absichtlich die einfache Version geliefert – a Medianbasierte, Wochentag × Tageszeit-Kurve, wöchentliche Anpassung, über den Handelstag hinweg statisch gehalten. Und es wurde festgestellt, dass der gesamte Vorteil von VWAP gegenüber TWAP auf der Prognosequalität beruht: Bedingt durch den realisierten Volumenkurvenfehler schlägt VWAP TWAP am besten prognostizierten Terzil der Tage um etwa 4 Basispunkte, und der Abstand kollabiert in Rauschen am schlechtesten Terzil.
Dieses Ergebnis impliziert eine spezifische, falsifizierbare Folgemaßnahme. Wenn der VWAP nur an Tagen gewinnt, an denen die Kurve gerade richtig war, dann sollte ein Prognostiker, der sich im Laufe des Tages korrigiert, einige der schlechten Terziltage in gute umwandeln. Oder es sollte nicht – und die interessante Version dieses Artikels ist die, in der dies nicht der Fall ist, denn das schlechte Terzil in Krypto sind Kaskadentage und Nachrichtentage, und das sind genau die Tage, an denen die ersten zwei Stunden des beobachteten Volumens am wenigsten aussagekräftig über die nächsten beiden sind.
In diesem Artikel wird der Intraday-Updater implementiert, mit dem identischen Kabelbaum ausgeführt und das IS-Delta im Vergleich zur statischen Kurve gemeldet – mit der Verteilung und der letzten Quartilzahl, nicht nur dem Mittelwert.
Was wird getestet?

Die statische Kurve ist ein Prior: ein fester Vektor der erwarteten Volumenanteile pro Eimer, offline geschätzt. Die adaptive Version behandelt es als Vorabaktualisierung. Nach Buckets sind abgelaufen und Sie haben tatsächliche Volumina beobachtet haben Sie zwei neue Informationen, die die statische Kurve wegwirft:
- Eine Schätzung des Niveaus. Wenn der Prior „Eimer“ sagt hätte Bruchteil tragen sollen des Tages und sie trugen Einheiten beträgt die implizite Ganztagessumme . Dies ist ein Signal „Heute ist ein schwerer Tag“ / „Heute ist ein toter Tag“ und es ist ab dem ersten Bucket verfügbar.
- Eine Formkorrektur. Wenn die realisierte Form der verstrichenen Buckets systematisch von der vorherigen Form abweicht, können auch die verbleibenden Buckets abweichen – aber nur, wenn Intraday-Volumenkurvenfehler innerhalb des Tages autokorreliert sind, was an sich eine empirische Frage und keine Annahme ist, die wir kostenlos treffen können.
Die folgende Implementierung verwendet (1) vollständig und (2) überhaupt nicht: Sie normalisiert den unberührten vorherigen Schwanz auf die aktualisierte Gesamtsumme. Das ist die konservative Version, und es ist das richtige erste Experiment, denn wenn das reine Level-Update bereits den größten Teil des verfügbaren Deltas erfasst, ist die Formmaschinerie ungerechtfertigt komplex.
import numpy as np
from typing import Optional
class AdaptiveVolumePredictor:
"""
Bayesian-style adaptive volume profile predictor.
Combines a prior (the offline day-of-week x time-of-day curve)
with volume observed so far today to produce an updated forecast
for the remaining buckets.
"""
def __init__(self, historical_profiles: np.ndarray):
"""
Args:
historical_profiles: shape (n_days, n_buckets), each row sums to 1.0.
Use the median-based, day-of-week-conditioned curve from the
TWAP/VWAP/POV article -- a pooled mean curve is misspecified
and will make the adaptive version look better than it is by
giving it a weaker baseline to beat.
"""
self.prior_profile = np.median(historical_profiles, axis=0)
self.prior_profile /= self.prior_profile.sum()
self.prior_iqr = np.subtract(*np.percentile(historical_profiles, [75, 25], axis=0))
self.n_buckets = len(self.prior_profile)
def predict(
self,
observed_volumes: np.ndarray,
current_bucket: int,
total_volume_estimate: Optional[float] = None,
) -> np.ndarray:
"""
Predict absolute volume for every bucket: realized values for elapsed
buckets, forecasts for the remainder.
Args:
observed_volumes: actual volumes in buckets 0..current_bucket-1
current_bucket: index of the current bucket (0-based)
total_volume_estimate: external ADV estimate (optional prior on level)
"""
profile = np.zeros(self.n_buckets)
if current_bucket == 0:
base = total_volume_estimate if total_volume_estimate else 1.0
return self.prior_profile * base
profile[:current_bucket] = observed_volumes[:current_bucket]
observed_total = observed_volumes[:current_bucket].sum()
expected_fraction_so_far = self.prior_profile[:current_bucket].sum()
if expected_fraction_so_far > 0.01:
implied_total = observed_total / expected_fraction_so_far
else:
implied_total = observed_total * self.n_buckets
if total_volume_estimate:
w_obs = expected_fraction_so_far
implied_total = w_obs * implied_total + (1 - w_obs) * total_volume_estimate
remaining_prior = self.prior_profile[current_bucket:]
remaining_sum = remaining_prior.sum()
if remaining_sum > 0:
remaining_volume = max(0.0, implied_total - observed_total)
profile[current_bucket:] = remaining_prior / remaining_sum * remaining_volume
return profile
Zwei Details in diesem Code tragen das Experiment. Der Prior ist die vom Wochentag abhängige Median-Kurve, kein gepoolter Mittelwert – warum das in einem Markt wichtig ist, in dem eine Liquidationskaskade 15 % des Tagesvolumens in zehn Minuten ausmachen kann, finden Sie im Volume-Curve-Abschnitt des VWAP-Artikels. Und die Levelaktualisierung wird auf eine externe ADV-Schätzung reduziert mit einer Gewichtung, die dem verstrichenen vorherigen Bruchteil entspricht, da sie sich im ersten Bucket befindet implied_total ist eine Beobachtung dividiert durch eine Zahl nahe Null. Ein nicht verkleinerter Updater verrichtet seine schlechteste Arbeit genau dann, wenn er den größten Teil des Tages zu ruinieren hat.
Geschirr

Identisch mit der Ausführung von TWAP/VWAP/POV, daher sind die Zahlen Zeile für Zeile vergleichbar:
- Instrument/Daten: BTCUSDT unbefristet, 90 Tage L2-Wiedergabe (Top-20-Level, 100 ms) plus Handelsband. durchgehend UTC; Finanzierungszeitstempel markiert.
- Übergeordnete Bestellungen: 500, Horizont h, Größe 0,75 % des nachlaufenden 30-Tage-ADV, Kaufseite, Entscheidungspreis = Mitte zu Beginn. Gleiche zufällige Startzeiten wie beim veröffentlichten Lauf.
- Waffen: (A) VWAP auf der statischen wöchentlichen Refit-Kurve – der veröffentlichten Basislinie; (B) VWAP auf dem gleichen Stand mit Intraday-Aktualisierung; (C) TWAP als Boden.
- Metriken: IS in Basispunkten des Entscheidungspreises, inklusive Gebühren, im Vergleich zur Ankunft – angegeben als Mittelwert, Median, Standardabweichung, 95. Perzentil und IS des letzten Quartils jedes Elternteils. VWAP-Schlupf wird nur zu Diagnosezwecken protokolliert, niemals als Anzeigetafel; Der Benchmark-Abschnitt des VWAP-Artikels zeigt einen Fall, bei dem VWAP Slippage und Arrival IS zwei Algorithmen in entgegengesetzter Reihenfolge einstufen. Die vollständige IS-Zerlegung, einschließlich des Opportunitätskosten-Terms, folgt Implementierungsdefizit und TCA.
Ergebnisse
Hilft es dort, wo es muss?
Der Mittelwert der Schlagzeile ist hier die am wenigsten interessante Zahl. Das veröffentlichte Ergebnis ergab, dass die VWAP-TWAP-Lücke im realisierten Volumenkurvenfehler monoton ist, sodass der adaptive Arm auf die gleiche Weise bewertet werden muss: Die 90 Tage werden in Terzile unterteilt Abstand zwischen der statischen Prognose und den realisierten Bucket-Volumina, dann melden Sie das adaptive-minus-statische IS-Delta innerhalb jedes Terzils.
Die beiden Ergebnisse sind beide veröffentlichbar und bedeuten das Gegenteil:
- Delta konzentriert sich auf das gute Terzil. Der Updater verfeinert Tage, die bereits einfach waren. Der Nettoeffekt auf die Kostenverteilung ist kosmetischer Natur; Das Tail – das ist, was ein Alpha-getriebener Elternteil mit hartem Horizont tatsächlich zahlt – bleibt unverändert. Dies würde bedeuten, dass der Intraday-Updater nicht die Lösung für das schwächste Glied ist und dass die Shape-Correction- und Cross-Asset-Routen als nächstes zu suchen sind.
- Delta konzentriert sich auf das schlechte Terzil. Der Updater erledigt die Aufgabe, für die er entwickelt wurde: Er erfasst die Kaskade und Nachrichtentage, an denen die statische Kurve am meisten falsch ist. Dies ist das Ergebnis, das den hinzugefügten Status in der Ausführungsschleife rechtfertigen würde.
Ein negatives Ergebnis ist erwartungsgemäß und es lohnt sich, es deutlich zu melden. Der Mechanismus, der die Krypto-Volumenkurven hart macht – eine Kaskade ist ein Regimebruch, kein Levelwechsel –, ist genau der Mechanismus, der einen Level-Update-Prognostiker zunichte macht: Wenn die verstrichenen Buckets Ihnen sagen, dass der heutige Tag schwer ist, könnte der schwere Teil vorbei sein. Sehen Sie sich das ehrliche Negativ an, um zu erfahren, warum dieser Blog diese veröffentlicht.
Book Slope: Bringt es etwas?

Eine Funktion im Funktionsentwurfsentwurf wird an anderer Stelle in diesem Blog nicht behandelt: Buchneigung, wie schnell sich die kumulative Tiefe ansammelt, wenn man sich von der Berührung entfernt. Fit übertrieben Ebenen; groß bedeutet, dass die Tiefe bei Berührung konzentriert ist, klein bedeutet, dass es dünn über das Buch verteilt ist.
def book_slope(prices: np.ndarray, volumes: np.ndarray, mid: float) -> float:
"""Slope of cumulative depth vs. distance from mid. One side only."""
distances = np.abs(prices - mid)
return float(np.polyfit(distances, np.cumsum(volumes), 1)[0])
Die einzige Version dieser Behauptung, die es wert ist, aufgestellt zu werden, ist eine maßvolle: fügt hinzu book_slope Verschieben Sie die Volumenprognose oder den resultierenden IS auf den vorhandenen Funktionsumfang über eine AR/EWMA-Basislinie hinaus? Der Artikel zur Spread-Modellierung legt den Standard fest – berichten Sie über Fähigkeiten über einer trivialen Basislinie mit dem angegebenen Horizont, da diese Reihen von Persistenz dominiert werden und ein Überschriften-R² hauptsächlich die Autokorrelation misst.
Was dieser Artikel bewusst nicht wiedergibt

Alles Folgende ist bereits ausführlicher im Blog aufgeführt, und eine erneute Erläuterung hier würde nur zu einer schwächeren zweiten Version führen:
- Liquiditätsmessung. Rolls Schätzer (mit dem Signed-Root-Fix und der Preiseinheiten-gegen-Rendite-Falle) und Kyles Lambda: Spread-Modellierung mit maschinellem Lernen. Kyles Lambda ist auch auf echte Binance-AggTrades als Permanent-Impact-Koeffizient in Almgren-Chriss kalibriert. Walk-the-Book-Sweep-Kosten: Slippage- und Kostenmodelle.
- Orderbuchfunktionen. Die gewichtete Mitte (die nicht Stoikovs Mikropreis ist – dieser ist martingalbereinigt), das mehrstufige Buchungleichgewicht, OFI und die vollständige Taxonomie der LOB-Funktionen: DeepLOB und Spread-Modellierung.
- Intraday-Muster. Die Aktien-U-Form ist das falsche Modell für einen Markt ohne Schlusskurs; Die Kryptositzungs-/Finanzierungs-/Wochenstruktur, die sie ersetzt, sowie das Wochentag × Tageszeitraster finden Sie im VWAP-Artikel. Die zyklische Tageszeitkodierung befindet sich in der Funktionstabelle des Spread-Artikels.
- Geplante Ereignisse. Deribit-Abläufe um 08:00 UTC, US-Makro um 12:30/14:00 UTC, CME-Abrechnungen – behandeln Sie sie als Dummies, anstatt zuzulassen, dass sie die Basiskurve verunreinigen; Der konkrete Krypto-Kalender ist im VWAP-Artikel zu finden. Der oben genannte adaptive Updater ist kein Ereignishandler und sollte auch nicht dazu aufgefordert werden.
- Modelle. Steigungsverstärkung mit bereinigtem, mit einem Embargo belegten Walk-Forward-CV (eine Ebene
TimeSeriesSplitLecks über das überlappende Vorwärtsfensterziel) befindet sich in Spread Modeling; Die CNN-LSTM-Familie, der 40-Features/10-Level-Eingabetensor, LOBFrame und die Replikationskrisendiskussion finden Sie in DeepLOB. Beachten Sie insbesondere, dass die Ebenenachse nicht vor der wiederkehrenden Ebene ausgeblendet werden darf. - Die Entscheidung über die untergeordnete Reihenfolge. Passiv vs. aggressiv ist ein berechneter Break-Even , kein fest codierter Spread-Schwellenwert: Taktiken zur Ausführung untergeordneter Aufträge. Das Targeting der Teilnahmerate ist endogen – Ihre eigenen Ausfüllungen werden auf das Band gedruckt – und die Korrektur finden Sie im VWAP-Artikel.
- Fragmentierung des Veranstaltungsortes. Intelligentes Order-Routing in Krypto, mit der TCA-Scorecard pro Veranstaltungsort in Implementierungsdefizit.
- Produktionslatenz. DeepLOBs Produktionsbereich; Beachten Sie, dass der Spread-Artikel bereits Inferenzzeitansprüche qualifiziert – ein 2000-Runden-LightGBM sagt in zig Mikrosekunden von Python aus voraus, einstellige nur mit einem kompilierten Prädiktor.
Gegnerische Dynamik verdient einen Absatz statt eines Abschnitts. Die angezeigte Tiefe ist teilweise performativ, und die Erkennungsmechanismen – Abbruchrate, Geschwindigkeit des Wandaufbaus, Verhalten bei Preisannäherungen, Schichtung – werden mit einer konkreten PIQ-basierten Methode in Warteschlangenpositions- und Wandanalyse abgedeckt. Das einzige Delta, das dieser Artikel hinzufügen könnte, besteht darin, sie als Prognoseeingaben zu behandeln: Abbruch-zu-Trade-Verhältnis, mittlere Ruhezeit bei Berührung und der Bruchteil der Tiefe, der innerhalb von 100 ms nach dem Erscheinen abgebrochen wird, zusammen mit dem Signal des verstrichenen Eimers in das Volumenmodell eingespeist. Ob sie Fähigkeiten über den vorhandenen Funktionsumfang hinaus hinzufügen, ist eine offene Messung, keine Behauptung.
Fazit

Die zu prüfende Behauptung ist eng gefasst und der Blog hat bereits die Voraussetzungen für ihre Fälschung geschaffen: Der VWAP-Artikel stellte fest, dass der Vorteil von VWAP ausschließlich in der Prognosequalität liegt und dass die Prognose an den Tagen fehlschlägt, die am meisten kosten. Ein Intraday-Updater behebt das entweder oder nicht, und die Antwort ist eine Zahl im schlechten Terzil einer Wiederholung mit 500 Eltern.
In diesem Artikel geht es nicht darum, eine BPS-Zahl ohne eine dahinter liegende Wiedergabe an ein Produktionssystem anzuhängen. Behauptungen der Form „Eine gut abgestimmte Liquiditätsvorhersage spart 2–5 Basispunkte, der Unterschied zwischen einem Sharpe von 1,5 und 2,0“ sind genau das Genre, das deflationierter Sharpe und Mehrfachtests zerlegen kann: unbegründet, bedingungslos und niemals von der Streuung begleitet. Die Zahl, die hier zählt, ist der letzte Quartil-IS am schlechtesten Terzil der Tage, und er wird entweder gemessen oder nicht gemeldet.
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.