Updating the Volume Curve Intraday: Does Adaptive Forecasting Actually Help?
TWAP, VWAP ve POV'de, üç programlayıcıyı da 90 günlük BTCUSDT L2 tekrarı üzerinde kafa kafaya çalıştırdık ve kasıtlı olarak açık bir yara olarak bırakılan bir sonuca ulaştık: kriptoda hacim eğrisi, dilimleme değil, boru hattının en zayıf halkasıdır. Bu makale, basit sürümü bilerek gönderdi - bir medyan temelli, haftanın günü × günün saati eğrisi, haftalık olarak yeniden düzenlenir, işlem günü boyunca sabit kalır. Ve VWAP'ın TWAP üzerindeki tüm üstünlüğünün tahmin kalitesi olduğunu buldu: Gerçekleşen hacim eğrisi hatasına bağlı olarak VWAP, en iyi tahmin edilen üç ayda bir TWAP'ı kabaca 4 baz puan geçiyor ve boşluk en kötü üçte birlik dilimde gürültüye dönüşüyor.
Bu sonuç spesifik, yanlışlanabilir bir takip anlamına gelir. VWAP yalnızca eğrinin doğru gittiği günlerde kazanırsa, o zaman gün ilerledikçe kendini düzelten bir tahmincinin bazı kötü-üçlü günleri iyi günlere dönüştürmesi gerekir. Ya da yapmamalı — ve bu makalenin ilginç versiyonu, bunun olmadığı versiyondur, çünkü kriptodaki kötü üçlü, ardı ardına gelen günler ve haber günleridir ve bunlar tam olarak ilk iki saatlik gözlem hacminin sonraki iki saat hakkında en az bilgi verici olduğu günlerdir.
Bu makale, gün içi güncelleyiciyi uygular, onu aynı donanımda çalıştırır ve IS deltasına karşı statik eğriyi rapor eder - yalnızca ortalamayla değil, dağılım ve son çeyrek sayısıyla birlikte.
Ne test ediliyor

Statik eğri bir öncüldür: sabit bir vektör paket başına beklenen hacim oranları, çevrimdışı olarak tahmin ediliyor. Uyarlanabilir sürüm, bunu güncellenecek bir ön işlem olarak ele alır. Sonrasında kovaların süresi doldu ve gerçek hacimleri gözlemlediniz , statik eğrinin attığı iki yeni bilgiye sahipsiniz:
- Seviye tahmini. Önceki kişi kova diyorsa kesir taşımalıydı günün ve taşıdılar birimler, ima edilen tam gün toplamı . Bu, bugün-yoğun bir gün / bugün-ölü bir gün sinyalidir ve ilk kovadan itibaren mevcuttur.
- Bir şekil düzeltmesi. Geçen kovaların gerçek şekli önceki şekilden sistematik olarak saparsa, geri kalan kovalar da sapabilir - ancak yalnızca gün içi hacim eğrisi hataları gün içinde otomatik olarak ilişkilendirilirse, bu başlı başına ampirik bir sorudur ve ücretsiz olarak yapabileceğimiz bir varsayım değildir.
Aşağıdaki uygulama (1)'i tamamen ve (2)'yi hiç kullanmaz: dokunulmamış önceki kuyruğu güncellenmiş toplama göre yeniden normalleştirir. Bu muhafazakar versiyondur ve doğru ilk deneydir, çünkü eğer saf seviye güncellemesi mevcut deltanın çoğunu zaten yakalıyorsa, o zaman şekil mekanizması gerekçesiz bir karmaşıklıktır.
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
Bu koddaki iki ayrıntı deneyi taşıyor. Önceki, toplu bir ortalama değil, haftanın gününe göre koşullandırılan medyan eğrisidir - bir tasfiye kademesinin on dakika içinde bir günlük hacmin %15'i olabileceği bir pazarda bunun neden önemli olduğu için, VWAP makalesinin hacim eğrisi bölümüne bakın. Ve seviye güncellemesi harici bir ADV tahminine doğru küçültülür ve ağırlığı önceki geçen kesire eşit olur, çünkü ilk grupta implied_total bir gözlemin sıfıra yakın bir sayıya bölünmesidir. Küçülmemiş bir güncelleyici en kötü işini tam da mahvolacak en fazla günü kaldığında yapar.
Koşum takımı

TWAP/VWAP/POV çalıştırmasıyla aynı olduğundan sayılar satır satır karşılaştırılabilir:
- Araç/veri: Sürekli BTCUSDT, 90 günlük L2 tekrarı (ilk 20 seviye, 100 ms) artı işlem bandı. UTC boyunca; finansman zaman damgaları işaretlendi.
- Ana siparişler: 500, ufuk h, takip eden 30 günlük ADV'nin %0,75'i, satın alma tarafı, karar fiyatı = başlangıç ortası. Yayınlanan çalıştırmayla aynı rastgele başlangıç saatleri.
- Silahlar: (A) Statik haftalık yenileme eğrisinde VWAP — yayınlanan temel değer; (B) Gün içi güncellemeyle aynı gün VWAP; (C) Zemin olarak TWAP.
- Ölçümler: Ücretler dahil karar fiyatının bps cinsinden IS cinsinden varışa karşı - ortalama, medyan, standart sapma, 95'inci yüzdelik dilim ve her bir ebeveynin son çeyreğinin IS'si olarak rapor edilir. VWAP kayması yalnızca teşhis amaçlı olarak günlüğe kaydedilir, hiçbir zaman puan tablosu olarak kaydedilmez; VWAP makalesinin karşılaştırma bölümü, VWAP kayması ve varışının IS'nin iki algoritmayı zıt sıralarda sıraladığı, çalışılmış bir durumu gösterir. Fırsat-maliyet terimini de içeren tam IS ayrıştırması, uygulama eksikliği ve TCA'yı takip eder.
Sonuçlar
İhtiyaç duyduğu yerde yardımcı oluyor mu?
Başlık ortalaması buradaki en az ilginç sayıdır. Yayınlanan sonuç, gerçekleşen hacim eğrisi hatasında VWAP-TWAP boşluğunun monoton olduğunu, dolayısıyla uyarlanabilir kolun da aynı şekilde puanlanması gerektiğini ortaya koydu: 90 günü üçte birlik dilimlere ayırın statik tahmin ile gerçekleşen kova hacimleri arasındaki mesafeyi hesaplayın, ardından her bir üçte birlik dilimdeki uyarlanabilir eksi statik IS deltasını raporlayın.
Her iki sonuç da yayınlanabilir ve zıt anlamlara gelir:
- Delta iyi üçte birlik kısımda yoğunlaştı. Güncelleyici, zaten kolay olan günleri iyileştiriyor. Maliyet dağılımı üzerindeki net etki kozmetiktir; zorlu ufuklara sahip alfa güdümlü bir ebeveynin gerçekte ödediği kuyruk ise değişmedi. Bu, gün içi güncelleyicinin en zayıf halka için çözüm olmadığını ve şekil düzeltme ve çapraz varlık rotalarının bundan sonra bakılması gereken yerler olduğunu gösterir.
- Delta, kötü üçte birlik kısımda yoğunlaştı. Güncelleyici, inşa edildiği işi yapıyor: statik eğrinin en yanlış olduğu kademeleri ve haber günlerini yakalamak. Bu, yürütme döngüsüne eklenen durumu haklı çıkaracak sonuçtur.
Negatif bir sonuç beklenen bir sonuçtur ve açıkça rapor edilmeye değerdir. Kripto hacmi eğrilerini zorlaştıran mekanizma (kademeli bir seviye değişimi değil rejim bozulmasıdır) tam olarak seviye güncelleme tahmincisini alt eden mekanizmadır: Geçen kovalar size bugünün ağır olduğunu söylediğinde, ağır kısım bitmiş olabilir. Bu blogun bunları neden yayınladığını öğrenmek için dürüst olumsuzluklara bakın.
Kitap eğimi: bir şey katıyor mu?

Taslak özellik setindeki bir özellik bu blogun başka bir yerinde ele alınmıyor: kitap eğimi, dokunmadan uzaklaştıkça kümülatif derinliğin ne kadar hızlı biriktiği. Yerleştirmek üstte seviyeler; büyük derinliğin dokunuşta yoğunlaştığı anlamına gelir, küçük kitap boyunca ince bir şekilde yayıldığı anlamına gelir.
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])
Bu iddianın dile getirilmeye değer tek versiyonu ölçülü bir versiyondur: book_slope mevcut özellik setine göre hacim tahminini veya sonuçta ortaya çıkan IS'yi AR/EWMA temel çizgisinin ötesine taşıyabilir misiniz? Yayılmış modelleme makalesi standardı belirliyor - raporlama becerisi, belirtilen ufku içeren önemsiz bir temel çizginin yukarısında çünkü bu seriler kalıcılığın hakimiyetindedir ve R² başlığı çoğunlukla otokorelasyonu ölçer.
Bu makalenin kasıtlı olarak yeniden türetmediği şey

Aşağıdaki her şey zaten blogda daha ayrıntılı olarak yer alıyor ve bunları burada yeniden açıklamak yalnızca daha zayıf bir ikinci versiyon yaratacaktır:
- Likidite ölçümü. Roll'un tahmincisi (imzalı kök düzeltmesi ve fiyat birimlerine karşı getiri tuzağıyla birlikte) ve Kyle'ın lambdası: makine öğrenimiyle yayılma modellemesi. Kyle'ın lambdası aynı zamanda gerçek Binance aggTrades üzerinde Almgren-Chriss kalıcı etki katsayısı olarak kalibre edilmiştir. Kitapta yer alan tarama maliyeti: kayma ve maliyet modelleri.
- Sipariş defteri özellikleri. Ağırlıklı orta (ki bu Stoikov'un mikro fiyatı değildir - bu martingale ayarlıdır), çok düzeyli kitap dengesizliği, OFI ve tam LOB özelliği sınıflandırması: DeepLOB ve spread modelleme.
- Gün içi formasyonlar. Hisse senedi U-şekli, kapanışı olmayan bir piyasa için yanlış modeldir; onun yerine geçen kripto oturumu/finansman/haftalık yapı ve haftanın günü × günün saati tablosu VWAP makalesinde bulunmaktadır. Döngüsel günün saati kodlaması, yayılmış makalenin özellik tablosunda yer almaktadır.
- Planlanmış etkinlikler. Deribit 08:00 UTC'nin sona ermesi, 12:30/14:00 UTC'deki ABD makrosu, CME yerleşimleri — bunları temel eğriyi kirletmelerine izin vermek yerine kukla olarak değerlendirin; somut kripto takvimini VWAP makalesinde bulabilirsiniz. Yukarıdaki uyarlanabilir güncelleyici bir olay işleyicisi değildir ve böyle olması istenmemelidir.
- Modeller. Tasfiye edilmiş, ambargolu ileriye dönük CV (sade bir CV) ile gradyan artırma
TimeSeriesSplitörtüşen ileri pencere hedefi boyunca sızıntılar) yayılma modellemede; CNN-LSTM ailesi, 40 özellik/10 seviyeli giriş tensörü, LOBFrame ve çoğaltma krizi tartışması DeepLOB'tadır. Özellikle seviye ekseninin tekrarlayan katmandan önce daraltılmaması gerektiğine dikkat edin. - Çocuk siparişi kararı. Pasif ve agresif hesaplanmış bir başabaş noktasıdır , sabit kodlanmış bir yayılma eşiği değil: alt sipariş yürütme taktikleri. Katılım oranı hedefleme içseldir; kendi doldurmalarınız kasete yazdırılır ve düzeltme VWAP makalesinde bulunur.
- Mekan parçalanması. Kriptoda akıllı sipariş yönlendirme, uygulama eksikliği içinde mekan başına TCA puan kartıyla.
- Üretim gecikmesi. DeepLOB'un üretim bölümü; yayılmış makalenin zaten çıkarım süresi iddialarını nitelendirdiğini unutmayın - 2000 turluk bir LightGBM, Python'dan onlarca mikrosaniyede yalnızca derlenmiş bir tahminciyle tek haneli tahminlerde bulunur.
Çekişmeli dinamikler bir bölüm yerine bir paragrafı hak ediyor. Görüntülenen derinlik kısmen performansa dayalıdır ve tespit mekaniği (iptal oranı, duvar oluşturma hızı, fiyat yaklaşırken davranış, katmanlama) kuyruk konumu ve duvar analizinde somut bir PIQ tabanlı yöntemle ele alınır. Bu makalenin ekleyebileceği tek fark, bunları tahminci girdileri: iptal-işlem oranı, dokunuşta ortalama dinlenme süresi ve geçen kova sinyaliyle birlikte hacim modeline beslenen, göründükten sonra 100 ms içinde iptal edilen derinlik fraksiyonu olarak ele almaktır. Mevcut özellik kümesinin üzerine beceri ekleyip eklemedikleri açık bir ölçümdür, bir iddia değil.
Sonuç

Test edilen iddia dar kapsamlıdır ve blog, bu iddiayı çarpıtmak için gereken koşulları zaten oluşturmuştur: VWAP makalesi, VWAP'ın üstünlüğünün tamamen tahmin kalitesinde olduğunu ve tahminin en maliyetli günlerde başarısız olduğunu tespit etti. Bir gün içi güncelleyici bunu ya düzeltir ya da düzeltmez ve cevap, 500 ebeveynlik tekrarın kötü üçte birindeki bir sayıdır.
Bu makalenin yapmayacağı şey, bir üretim sistemine arkasında tekrar oynatımı olmayan bir bps rakamı eklemektir. "İyi ayarlanmış likidite tahmini 2-5 baz puan tasarruf sağlar, 1,5 ile 2,0 Sharpe arasındaki fark" biçimindeki iddialar, tam olarak deflated Sharpe ve çoklu testin ortadan kaldırmak için var olduğu türdür: kaynaksız, koşulsuz ve hiçbir zaman dağılım eşlik etmez. Burada önemli olan sayı, günlerin en kötü üçte birindeki son çeyrekteki IS'dir ve ya ölçülür ya da raporlanmaz.
Yazarlar
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.