← Maqolalarga qaytish
August 13, 2026
5 daqiqa o'qish

Updating the Volume Curve Intraday: Does Adaptive Forecasting Actually Help?

Updating the Volume Curve Intraday: Does Adaptive Forecasting Actually Help?
#microstructure
#liquidity
#execution
#prediction
#order-book

Biz TWAP, VWAP va POV maqolasida BTCUSDT bo'yicha 90 kunlik L2 replayda uchta rejalashtiruvchini yonma-yon sinab, ataylab ochiq qoldirilgan xulosaga keldik: kriptoda hajm egri chizig'i bo'laklash emas, balki konveyerning eng zaif bo'g'inidir. O'sha maqolada ataylab sodda variant — medianaga asoslangan, hafta kuni × kun vaqti bo'yicha shartlangan, haftalik qayta moslangan va savdo kuni davomida o'zgarmaydigan egri chiziq — ishlatilgan. Natija shuni ko'rsatdiki, VWAPning TWAP ustidagi butun ustunligi prognoz sifatiga borib taqaladi: amalga oshgan hajm egri chizig'i xatosi bo'yicha shartlaganda, VWAP eng yaxshi prognozli kunlar tertsilida TWAPdan taxminan 4 b.p. ustun, eng yomon tertsilda esa farq shovqinga aylanadi.

Bu natija aniq va rad etish mumkin bo'lgan keyingi tajribani anglatadi. Agar VWAP faqat egri chiziq to'g'ri kelgan kunlarda yutsa, unda kun davomida o'zini tuzatadigan prognozchi yomon tertsildagi kunlarning bir qismini yaxshi kunlarga aylantirishi kerak. Yoki bunday bo'lmasligi ham mumkin — maqolaning qiziqarli varianti aynan shu holat bo'ladi, chunki kriptodagi yomon tertsil kaskad va yangiliklar kunlaridan iborat, ilk ikki soatdagi kuzatilgan hajm esa keyingi ikki soat haqida eng kam ma'lumot beradigan kunlar ham shulardir.

Ushbu maqolada kun ichidagi yangilovchi aynan o'sha sinov majmuasida ishga tushiriladi va statik egri chiziqqa nisbatan IS deltasining taqsimoti hamda yakuniy kvartil qiymati, faqat o'rtacha qiymat emas, hisobot qilinadi.

Nima sinovdan o'tkazilmoqda

Kuzatilgan savdo faoliyatidan oldingi yangilanishga moslashtirilgan hajm-egri

Statik egri chiziq — avvaldan berilgan qiymat: oflayn hisoblangan, har bir interval uchun kutilgan hajm ulushlaridan iborat u={u1,,uB}u = \{u_1, \ldots, u_B\} vektori. Moslashuvchan variant uni yangilanadigan avvalgi taqsimot deb qaraydi. cc ta interval o'tib, V1,,VcV_1, \ldots, V_c haqiqiy hajmlari kuzatilgach, statik egri chiziq e'tiborsiz qoldiradigan ikki yangi ma'lumot paydo bo'ladi:

  1. Darajani baholash. Agar avvalgi taqsimotga ko'ra 1..c1..c intervallar kunlik hajmning icui\sum_{i \le c} u_i qismini olib kelishi, amalda esa icVi\sum_{i\le c} V_i birlik hajm kuzatilgan bo'lsa, kunlik to'liq hajmning taxmini V^=icVi/icui\hat{V} = \sum_{i \le c} V_i \big/ \sum_{i \le c} u_i bo'ladi. Bu "bugun faol kun" yoki "bugun sust kun" signalidir va birinchi intervaldan boshlab mavjud.
  2. Shaklni tuzatish. Agar o'tgan intervallarning amaldagi shakli avvalgi shakldan tizimli ravishda og'sa, qolgan intervallar ham og'ishi mumkin. Biroq bu faqat kun ichidagi hajm egri chizig'i xatolari o'sha kun ichida avtokorrelyatsiyalangan bo'lsa to'g'ri; bu empirik savol, bepul qabul qilinadigan taxmin emas.

Quyidagi amalga oshirish (1)ni to'liq ishlatadi, (2)ni esa umuman ishlatmaydi: u tegilmagan avvalgi taqsimot dumini yangilangan umumiy hajmga qayta normallashtiradi. Bu konservativ va to'g'ri birinchi tajriba, chunki agar sof daraja yangilanishi mavjud deltaning katta qismini ushlasa, shakl mexanizmi asossiz murakkablik bo'ladi.

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

Ushbu koddagi ikki detal tajriba uchun muhim. Avvalgi taqsimot — birlashtirilgan o'rtacha emas, hafta kuniga shartlangan mediana egri chizig'i; bir likvidatsiya kaskadi o'n daqiqada kunlik hajmning 15 foizini tashkil qilishi mumkin bo'lgan bozorda bu nima uchun muhimligini VWAP maqolasining hajm egri chizig'i bo'limi tushuntiradi. Daraja yangilanishi tashqi ADV taxminiga tomon qisqartiriladi, uning og'irligi o'tgan avvalgi ulushga teng, chunki birinchi intervalda implied_total nolga yaqin songa bo'lingan bitta kuzatuvdan iborat. Qisqartirilmagan yangilovchi aynan kunning eng katta qismi hali oldinda bo'lgan paytda eng yomon ishlaydi.

Sinov majmuasi

Moslashuvchan prognozlash tadqiqot majmuasida parallel bajarish yoʻllari

TWAP/VWAP/POV sinovi bilan bir xil ishga tushiriladi, shuning uchun raqamlarni satrma-satr taqqoslash mumkin:

  • Instrument/ma'lumotlar: BTCUSDT perpetual, 90 kunlik L2 replayi (eng yuqori 20 daraja, 100 ms) va bitimlar lentasi. Hammasi UTC bo'yicha; funding vaqt belgilari qayd etiladi.
  • Asosiy buyurtmalar: 500 ta, ufq T=4T = 4 soat, oxirgi 30 kunlik ADVning 0,75 foizi, xarid tomoni, qaror narxi — boshlanishdagi mid. E'lon qilingan sinovdagi kabi tasodifiy boshlanish vaqtlari.
  • Variantlar: (A) statik, haftalik qayta moslangan egri chiziqdagi VWAP — e'lon qilingan bazaviy chiziq; (B) kun ichida yangilanadigan xuddi shu avvalgi taqsimotdagi VWAP; (C) taqqoslash asosi sifatida TWAP.
  • Ko'rsatkichlar: qaror narxiga nisbatan IS, b.p.da va komissiyalar bilan, arrivalga nisbatan — o'rtacha, mediana, standart og'ish, 95-percentil va har bir asosiy buyurtmaning yakuniy kvartilidagi IS sifatida hisobot qilinadi. VWAP slippaji faqat diagnostika sifatida qayd etiladi, hech qachon reyting mezoni emas; VWAP maqolasining benchmark bo'limi VWAP slippaji va arrival IS ikki algoritmni qarama-qarshi tartiblashi mumkinligini ko'rsatadi. Imkoniyat xarajati ham kiradigan to'liq IS parchalanishi implementation shortfall va TCA maqolasida berilgan.

Natijalar

Kerak bo'lgan joyda yordam beradimi?

Bu yerda sarlavhadagi o'rtacha qiymat eng qiziq bo'lmagan raqamdir. E'lon qilingan natija VWAP–TWAP farqi amalga oshgan hajm egri chizig'i xatosiga monoton bog'liqligini ko'rsatdi. Shuning uchun moslashuvchan variant ham xuddi shunday baholanishi kerak: 90 kunni statik prognoz bilan amalga oshgan interval hajmlari orasidagi L1L_1 masofa bo'yicha tertsillarga ajrating va har bir tertsilda adaptiv-minus-statik IS deltasini hisobot qiling.

Ikkala natija ham nashr etilishi mumkin va ular qarama-qarshi narsalarni anglatadi:

  • Delta yaxshi tertsilda jamlangan. Yangilovchi avvaldan oson bo'lgan kunlarni yanada aniqlashtirmoqda. Xarajatlar taqsimotidagi sof ta'sir kosmetik, qattiq ufqli alfa boshqaradigan asosiy buyurtma aslida to'laydigan dum esa o'zgarmaydi. Bu kun ichidagi yangilovchi eng zaif bo'g'inning yechimi emasligini, keyingi yo'nalish esa shaklni tuzatish va aktivlararo xususiyatlar ekanini ko'rsatadi.
  • Delta yomon tertsilda jamlangan. Yangilovchi yaratilgan vazifani bajaryapti: statik egri chiziq eng ko'p adashadigan kaskad va yangiliklar kunlarini ushlayapti. Bu ijro sikliga qo'shilgan holatni oqlaydigan natija bo'ladi.

Salbiy natija kutiladigan va ochiq hisobot berishga arziydigan natijadir. Kripto hajm egri chiziqlarini qiyinlashtiradigan mexanizm — kaskad — daraja siljishi emas, rejim uzilishi. Aynan shu narsa daraja yangilovchi prognozchisini mag'lub etadi: o'tgan intervallar bugun faol kun ekanini ko'rsatgan paytda faol qism tugagan bo'lishi mumkin. Bu blog nega bunday natijalarni e'lon qilishi haqida halol salbiy natija maqolasiga qarang.

Order-book qiyaligi: u biror narsa qo'shadimi?

Mavhum limit-order-kitob chuqurligi landshafti va likvidlik nishabi

Qoralama xususiyatlar to'plamidagi bir xususiyat blogning boshqa joylarida yoritilmagan: order-book qiyaligi, touchdan uzoqlashganda jamlangan chuqurlik qanchalik tez ortishi. CumVol(d)=α+βd\text{CumVol}(d) = \alpha + \beta d ni yuqoridagi KK daraja bo'yicha moslang; katta β\beta chuqurlik touch atrofida jamlanganini, kichik β\beta esa order-book bo'ylab yupqa yoyilganini bildiradi.

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 da'voning maqbul shakli faqat o'lchangan shakldir: mavjud xususiyatlar to'plamiga book_slope qo'shilishi hajm prognozini yoki yakuniy ISni AR/EWMA bazaviy chizig'idan yaxshilaydimi? Spread modeling maqolasi standartni belgilaydi — ufqni ko'rsatgan holda, oddiy bazaviy chiziqdan yuqori bo'lgan mahoratni hisobot qiling, chunki bu qatorlarda persistensiya ustun va sarlavhadagi R² asosan avtokorrelyatsiyani o'lchaydi.

Ushbu maqola ataylab nimani qayta keltirmaydi

Cheklangan miqdoriy quvur liniyasi doirasidagi tadqiqot moduli

Quyidagilarning barchasi blogda batafsil yoritilgan; ularni bu yerda qayta tushuntirish faqat zaifroq ikkinchi versiyani yaratadi:

  • Likvidlikni o'lchash. Roll estimatori (imzolangan ildiz tuzatishi va narx birliklari va daromadlar tuzog'i bilan) hamda Kyle lambdasi mashinaviy o'rganish bilan spread modeling maqolasida. Kyle lambdasi haqiqiy Binance aggTrades ma'lumotida Almgren–Chriss da doimiy ta'sir koeffitsienti sifatida ham kalibrlangan. Order-bookni supurish qiymati: slippaj va xarajat modellari.
  • Order-book xususiyatlari. Og'irliklangan mid (bu Stoikovning mikroprice'i emas — u martingale bo'yicha tuzatilgan), ko'p darajali order-book nomutanosibligi, OFI va LOB xususiyatlarining to'liq taksonomiyasi DeepLOB hamda spread modeling da.
  • Kun ichidagi naqshlar. Yopilish bo'lmagan bozor uchun aksiyalardagi U-shakl noto'g'ri model; uning o'rnini bosadigan kripto sessiyasi/funding/haftalik tuzilma va hafta kuni × kun vaqti panjarasi VWAP maqolasida. Kun vaqti siklini kodlash spread maqolasining xususiyatlar jadvalida.
  • Rejalashtirilgan voqealar. Deribitning 08:00 UTC expiry vaqtlari, AQSh makro e'lonlari 12:30/14:00 UTC, CME settlementlari — ularni bazaviy egri chiziqni ifloslantirmaslik uchun indikator sifatida ishlating; aniq kripto taqvimi VWAP maqolasida. Yuqoridagi moslashuvchan yangilovchi voqea ishlovchisi emas va undan buni kutmaslik kerak.
  • Modellar. Tozalangan va embargo qo'yilgan walk-forward CV bilan gradient boosting (oddiy TimeSeriesSplit ustma-ust forward-window target bo'ylab sizib chiqadi) spread modelingda; CNN-LSTM oilasi, 40 xususiyatli/10 darajali kirish tensori, LOBFrame va replikatsiya inqirozi muhokamasi DeepLOBda. Muhimi, daraja o'qi rekurrent qatlamdan oldin siqib yuborilmasin.
  • Child-order qarori. Passiv yoki agressiv rejim — qattiq kodlangan spread chegarasi emas, hisoblangan break-even p=δ/(Π+δ)p^* = \delta/(\Pi + \delta): child-order ijrosi taktikasi. Ishtirok darajasini nishonlash endogen: o'z filllaringiz lentaga chiqadi; tuzatish VWAP maqolasida.
  • Venue fragmentatsiyasi. Kriptoda aqlli order routing, har bir venue bo'yicha TCA scorecard esa implementation shortfallda.
  • Ishlab chiqarish kechikishi. DeepLOBning production bo'limi; spread maqolasi inference-time da'volarini allaqachon shartlaydi — 2000-round LightGBM Python'dan o'nlab mikrosekundlarda, faqat kompilyatsiya qilingan predictor bilan bir xonali mikrosekundlarda bashorat qiladi.

Adversarial dinamika alohida bo'lim emas, bitta paragrafga loyiq. Ko'rsatilgan chuqurlikning bir qismi namoyishkorona bo'ladi; uni aniqlash mexanizmlari — bekor qilish darajasi, devor qurilish tezligi, narx yaqinlashgandagi xatti-harakat va layering — navbatdagi pozitsiya va order-book devori tahlilida aniq PIQ asosidagi usul bilan qoplangan. Ushbu maqola qo'shishi mumkin bo'lgan yagona yangilik — ularni prognozchi kirishlari sifatida ko'rish: cancel-to-trade nisbati, touchdagi o'rtacha turish vaqti va paydo bo'lganidan keyin 100 ms ichida bekor qilinadigan chuqurlik ulushi, o'tgan interval signali bilan birga hajm modeliga beriladi. Ular mavjud xususiyatlar to'plamidan yuqori mahorat beradimi — bu da'vo emas, ochiq o'lchov.

Xulosa

Noaniqlikdan oʻlchangan ijro natijasigacha boʻlgan dalil yoʻli

Sinovdan o'tayotgan da'vo tor, blog esa uni rad etish shartlarini allaqachon belgilagan: VWAP maqolasi VWAPning ustunligi to'liq prognoz sifatiga bog'liqligini va prognoz eng qimmat kunlarda ishlamasligini ko'rsatgan. Kun ichidagi yangilovchi buni tuzatadi yoki tuzatmaydi; javob 500 ta asosiy buyurtmali replayning yomon tertsilidagi bitta raqam bo'ladi.

Ushbu maqola replay bilan tasdiqlanmagan holda ishlab chiqarish tizimiga b.p. qiymatini yopishtirmaydi. "Yaxshi sozlangan likvidlik prognozi 2–5 b.p. tejaydi, Sharpe 1,5 va 2,0 o'rtasidagi farq shuncha" kabi da'volar aynan deflyatsiyalangan Sharpe va ko'p martalik test maqolasi rad etadigan janrga kiradi: manbasiz, shartlarsiz va hech qachon tarqalish bilan birga berilmaydi. Bu yerda muhim raqam — eng yomon kunlar tertsilidagi yakuniy kvartil IS; u o'lchanadi yoki umuman hisobot qilinmaydi.

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

Bozordan bir qadam oldinda bo'ling

Sun'iy intellekt savdo tahlillari, bozor tahlili va platforma yangiliklari uchun bizning xabarnomaga obuna bo'ling.

Biz sizning maxfiyligingizni hurmat qilamiz. Istalgan vaqtda obunadan chiqishingiz mumkin.