Updating the Volume Curve Intraday: Does Adaptive Forecasting Actually Help?
En TWAP, VWAP y POV ejecutamos los tres programadores cara a cara durante 90 días de repetición BTCUSDT L2 y llegamos a una conclusión que se dejó deliberadamente como una herida abierta: en criptografía, la curva de volumen es el eslabón más débil del proceso, no el corte. Ese artículo envió la versión simple a propósito: una basada en la mediana, Curva día de la semana × hora del día, reajustada semanalmente, mantenida estática durante el día de negociación. Y descubrió que toda la ventaja del VWAP sobre el TWAP es la calidad del pronóstico: condicionado al error realizado en la curva de volumen, el VWAP supera al TWAP por aproximadamente 4 puntos básicos en el tercil de días con el mejor pronóstico, y la brecha se convierte en ruido en el peor tercil.
Ese resultado implica un seguimiento específico y falsificable. Si VWAP sólo gana en los días en que la curva resultó correcta, entonces un pronosticador que se corrija a medida que avanza el día debería convertir algunos de los días del tercil malo en buenos. O no debería, y la versión interesante de este artículo es aquella en la que no lo hace, porque el tercil malo en criptografía son los días en cascada y los días de noticias, y esos son exactamente los días en los que las dos primeras horas de volumen observado son las menos informativas sobre las dos siguientes.
Este artículo implementa el actualizador intradiario, lo ejecuta con el mismo arnés e informa el delta IS versus la curva estática, con la distribución y el número del cuartil final, no solo la media.
¿Qué se está probando?

La curva estática es un a priori: un vector fijo de fracciones de volumen esperadas por cubo, estimadas fuera de línea. La versión adaptativa lo trata como una versión previa a la actualización. Después Los períodos han transcurrido y usted ha observado volúmenes reales. , tienes dos piezas de información nueva que la curva estática descarta:
- Una estimación de nivel. Si el anterior dice cubos debería haber llevado la fracción del día y llevaban unidades, el total implícito de un día completo es . Esta es una señal de hoy es un día pesado/hoy es un día muerto y está disponible desde el primer segmento.
- Una corrección de forma. Si la forma observada de los segmentos transcurridos se desvía sistemáticamente de la forma anterior, los segmentos restantes también pueden desviarse, pero solo si los errores de la curva de volumen intradía se autocorrelacionan dentro del día, lo cual es en sí mismo una cuestión empírica y no una suposición que podamos hacer de forma gratuita.
La siguiente implementación utiliza (1) completamente y (2) no utiliza nada: vuelve a normalizar la cola anterior intacta en el total actualizado. Esa es la versión conservadora, y es el primer experimento correcto, porque si la actualización de nivel puro ya captura la mayor parte del delta disponible, entonces la maquinaria de forma es una complejidad injustificada.
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
Dos detalles en ese código llevan el experimento. La anterior es la curva mediana condicionada al día de la semana, no una media agrupada; para saber por qué eso es importante en un mercado donde una cascada de liquidación puede representar el 15% del volumen de un día en diez minutos, consulte la sección de curva de volumen del artículo de VWAP. Y la actualización de nivel se reduce hacia una estimación ADV externa con un peso igual a la fracción anterior transcurrida, porque en el primer segmento implied_total es una observación dividida por un número cercano a cero. Un actualizador no reducido hace su peor trabajo exactamente cuando le queda más día por arruinar.
Arnés

Idéntico a la ejecución de TWAP/VWAP/POV, por lo que los números son comparables línea por línea:
- Instrumento/datos: BTCUSDT perpetuo, 90 días de repetición L2 (20 niveles superiores, 100 ms) más la cinta de operaciones. UTC en todo momento; marcas de tiempo de financiación marcadas.
- Pedidos de padres: 500, horizonte h, tamaño 0,75% del ADV final de 30 días, lado de compra, precio de decisión = medio al inicio. Las mismas horas de inicio aleatorias que la ejecución publicada.
- Brazos: (A) VWAP en la curva estática de reajuste semanal: la línea de base publicada; (B) VWAP del mismo anterior con actualización intradiaria; (C) TWAP como piso.
- Métricas: IS en puntos básicos del precio de decisión, tarifas incluidas, versus llegada; se informa como media, mediana, desviación estándar, percentil 95 e IS del cuartil final de cada padre. El deslizamiento del VWAP se registra únicamente como diagnóstico, nunca como marcador; la sección de referencia del artículo de VWAP muestra un caso trabajado donde el deslizamiento y la llegada de VWAP IS clasifican dos algoritmos en órdenes opuestos. La descomposición completa del IS, incluido el término de costo de oportunidad, sigue a déficit de implementación y TCA.
Resultados
¿Ayuda donde es necesario?
La media del titular es el número menos interesante aquí. El resultado publicado estableció que la brecha VWAP-TWAP es monótona en el error realizado de la curva de volumen, por lo que el brazo adaptativo debe calificarse de la misma manera: agrupar los 90 días en terciles por distancia entre el pronóstico estático y los volúmenes de cubeta realizados, luego informe el delta de IS adaptativo menos estático dentro de cada tercil.
Los dos resultados son publicables y significan cosas opuestas:
- Delta concentrada en el tercil bueno. El actualizador está refinando los días que ya eran fáciles. El efecto neto sobre la distribución de costos es cosmético; la cola, que es lo que realmente paga un padre con horizonte duro impulsado por alfa, no ha cambiado. Esto diría que el actualizador intradiario no es la solución para el eslabón más débil, y las rutas de corrección de forma y de activos cruzados son donde buscar a continuación.
- Delta concentrada en el tercil malo. El actualizador está haciendo el trabajo para el que fue creado: detectar la cascada y los días de noticias en los que la curva estática es más incorrecta. Este es el resultado que justificaría el estado agregado en el ciclo de ejecución.
Un resultado negativo es lo esperado y vale la pena informarlo claramente. El mecanismo que dificulta las curvas de volumen de las criptomonedas (una cascada es una ruptura del régimen, no un cambio de nivel) es precisamente el mecanismo que derrota a un pronosticador de actualización de niveles: para cuando los cubos transcurridos le indiquen que hoy es pesado, la parte pesada puede haber terminado. Consulte el negativo honesto para saber por qué este blog los publica.
Libro pendiente: ¿aporta algo?

Una característica del borrador del conjunto de características no se trata en ninguna otra parte de este blog: pendiente del libro, la rapidez con la que se acumula la profundidad acumulada a medida que te alejas del tacto. Adaptar por encima niveles; grande significa que la profundidad se concentra al tacto, pequeña significa que está esparcido por todo el libro.
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])
La única versión de esta afirmación que vale la pena hacer es mesurada: ¿agregar book_slope al conjunto de características existente mover el pronóstico de volumen, o el IS resultante, más allá de una línea base AR/EWMA? El artículo sobre modelado extendido establece el estándar: informar la habilidad arriba de una línea de base trivial con el horizonte indicado, porque estas series están dominadas por la persistencia y un título R² mide principalmente la autocorrelación.
Lo que este artículo deliberadamente no vuelve a derivar

Todo lo que aparece a continuación ya está en el blog con mayor profundidad, y volver a explicarlo aquí sólo crearía una segunda versión más débil:
- Medición de liquidez. Estimador de Roll (con la solución de raíz firmada y la trampa de precio-unidades-vs-rendimiento) y lambda de Kyle: modelado de spread con aprendizaje automático. La lambda de Kyle también está calibrada en Binance aggTrades reales como el coeficiente de impacto permanente en Almgren-Chriss. Costo de barrido basado en el libro: modelos de costo y deslizamiento.
- Características del libro de pedidos. El medio ponderado (que no es el microprecio de Stoikov; ese está ajustado por martingala), el desequilibrio del libro de niveles múltiples, OFI y la taxonomía completa de características de LOB: DeepLOB y modelado extendido.
- Patrones intradiarios. La forma de U de las acciones es el modelo equivocado para un mercado sin cierre; la sesión criptográfica/financiación/estructura semanal que la reemplaza, más la cuadrícula de día de la semana × hora del día, se encuentran en el artículo VWAP. La codificación cíclica de la hora del día se encuentra en la tabla de características del artículo difundido.
- Eventos programados. Vencimientos de Deribit a las 08:00 UTC, macro de EE. UU. a las 12:30/14:00 UTC, liquidaciones de CME: trátelos como muñecos en lugar de permitir que contaminen la curva de referencia; El calendario criptográfico concreto se encuentra en el artículo VWAP. El actualizador adaptativo anterior no es un controlador de eventos y no se le debe pedir que lo sea.
- Modelos. Aumento de gradiente con CV de avance purgado y embargado (un simple
TimeSeriesSplitfiltraciones en el objetivo de la ventana delantera superpuesta) se encuentra en modelado de difusión; la familia CNN-LSTM, el tensor de entrada de 40 funciones/10 niveles, LOBFrame y la discusión sobre la crisis de replicación se encuentran en DeepLOB. Tenga en cuenta en particular que el eje de nivel no debe contraerse antes de la capa recurrente. - La decisión de orden secundaria. Pasivo versus agresivo es un punto de equilibrio calculado , no un umbral de propagación codificado: tácticas de ejecución de órdenes secundarias. La focalización en la tasa de participación es endógena (sus propios rellenos se imprimen en la cinta) y la corrección se encuentra en el artículo VWAP.
- Fragmentación del lugar. Enrutamiento de pedidos inteligente en cripto, con el cuadro de mando de TCA por lugar en déficit de implementación.
- Latencia de producción. Sección de producción de DeepLOB; tenga en cuenta que el artículo publicado ya califica las afirmaciones de tiempo de inferencia: un LightGBM de 2000 rondas predice en decenas de microsegundos desde Python, solo un dígito con un predictor compilado.
La dinámica de confrontación merece un párrafo en lugar de una sección. La profundidad mostrada es en parte performativa, y los mecanismos de detección (tasa de cancelación, velocidad de construcción de muros, comportamiento a medida que se acerca el precio, estratificación) se tratan con un método concreto basado en PIQ en análisis de posición de cola y muro. El único delta que este artículo podría agregar es tratarlos como entradas del pronosticador: relación de cancelación a intercambio, tiempo medio de descanso al tacto y la fracción de profundidad que se cancela dentro de los 100 ms de aparecer, alimentada al modelo de volumen junto con la señal del cubo transcurrido. Si añaden habilidades al conjunto de características existentes es una medida abierta, no una afirmación.
Conclusión

La afirmación bajo prueba es limitada y el blog ya ha establecido las condiciones para falsificarla: el artículo VWAP estableció que la ventaja de VWAP es enteramente la calidad del pronóstico y que el pronóstico falla en los días que cuestan más. Un actualizador intradiario soluciona esto o no, y la respuesta es un número en el tercil malo de una repetición de 500 padres.
Lo que este artículo no hará es adjuntar una cifra de bps a un sistema de producción sin una repetición detrás. Afirmaciones del tipo "una predicción de liquidez bien ajustada ahorra entre 2 y 5 puntos básicos, la diferencia entre un Sharpe de 1,5 y 2,0" son exactamente el género que Sharpe deflactado y pruebas múltiples existe para desmantelar: sin fuentes, sin condiciones y nunca acompañadas de dispersión. El número que importa aquí es el IS del último cuartil del peor tercil de días, y se mide o no se informa.
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.