← 기사 목록으로
August 13, 2026
5분 소요

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

TWAP, VWAP 및 POV에서 우리는 BTCUSDT L2 재생의 90일 동안 3개의 스케줄러를 모두 정면으로 실행했으며 의도적으로 열린 상처로 남겨진 결론에 도달했습니다. 암호화폐에서 볼륨 곡선은 슬라이싱이 아니라 파이프라인의 가장 약한 링크입니다. 해당 기사는 의도적으로 간단한 버전을 제공했습니다. 즉, 중앙값 기반, 요일 × 시간 곡선, 매주 재조정되고 정적으로 유지됩니다. 거래일. 그리고 TWAP에 대한 VWAP의 전체 우위는 예측 품질이라는 것을 발견했습니다. 실현된 볼륨 곡선 오류를 조건으로 VWAP는 최고의 예측 3분위수에서 TWAP를 약 4bps 능가했으며 최악의 3분위수에서는 그 격차가 소음으로 붕괴되었습니다.

그 결과는 구체적이고 위조 가능한 후속 조치를 의미합니다. 곡선이 우연히 옳은 날에만 VWAP가 승리한다면 날이 전개됨에 따라 스스로 수정하는 예측자는 나쁜 3분위일 중 일부를 좋은 날로 전환해야 합니다. 아니면 그렇지 않아야 합니다. 그리고 이 기사의 흥미로운 버전은 그렇지 않은 것입니다. 왜냐하면 암호화폐의 나쁜 삼분위수는 연속적인 날과 뉴스 날이고, 그 날은 관찰된 거래량의 처음 두 시간이 다음 두 시간에 대해 가장 적은 정보를 제공하는 날이기 때문입니다.

이 기사에서는 일중 업데이터를 구현하고 동일한 하네스에 대해 이를 실행하며 IS 델타 대 정적 곡선을 평균뿐만 아니라 분포 및 최종 사분위수와 함께 보고합니다.

테스트 대상

관찰된 거래 활동으로부터 업데이트되기 전의 적응형 거래량 곡선

정적 곡선은 사전 곡선입니다. 즉, 오프라인으로 추정된 버킷당 예상 부피 비율의 고정 벡터 u={u1,,uB}u = \{u_1, \ldots, u_B\}입니다. 적응형 버전은 이를 업데이트되기 전의 버전으로 처리합니다. cc 버킷이 경과하고 실제 볼륨 V1,,VcV_1, \ldots, V_c를 관찰한 후에는 정적 곡선이 버리는 두 가지 새로운 정보가 있습니다.

  1. 수준 추정. 이전에 버킷 1..c1..c가 하루 중 icui\sum_{i \le c} u_i 부분을 운반해야 하고 icVi\sum_{i\le c} V_i 단위를 운반해야 한다고 말한 경우 묵시적인 하루 총계는 V^=icVi/icui\hat{V} = \sum_{i \le c} V_i \big/ \sum_{i \le c} u_i입니다. 이는 오늘이 무거운 날/오늘이 죽은 날이며 첫 번째 버킷에서 사용할 수 있습니다.
  2. 모양 수정. 경과된 버킷의 실현된 모양이 이전 모양에서 체계적으로 벗어나면 나머지 버킷도 벗어날 수 있습니다. 그러나 일중 거래량 곡선 오류가 해당 날짜 내에서 자기상관되는 경우에만 해당됩니다. 이는 그 자체로 경험적 질문이며 우리가 무료로 만들 수 있는 가정이 아닙니다.

아래 구현에서는 (1)을 완전히 사용하고 (2)를 전혀 사용하지 않습니다. 즉, 변경되지 않은 이전 꼬리를 업데이트된 합계로 다시 정규화합니다. 이는 보수적인 버전이고 올바른 첫 번째 실험입니다. 왜냐하면 순수 레벨 업데이트가 이미 사용 가능한 델타의 대부분을 캡처한 경우 형상 기계는 정당하지 않은 복잡성이기 때문입니다.

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

해당 코드의 두 가지 세부 사항이 실험을 수행합니다. 사전은 풀링된 평균이 아닌 요일을 조건으로 한 중앙값 곡선입니다. 하나의 청산 캐스케이드가 10분 만에 하루 거래량의 15%가 될 수 있는 시장에서 이것이 중요한 이유는 VWAP 기사](/en/blog/post/twap-vwap-pov-execution-algorithms)의 [볼륨 곡선 섹션을 참조하세요. 그리고 레벨 업데이트는 경과된 이전 부분과 동일한 가중치를 갖는 외부 ADV 추정치로 축소됩니다. 왜냐하면 첫 번째 버킷에서 implied_total는 하나의 관측치를 0에 가까운 숫자로 나눈 값이기 때문입니다. 축소되지 않은 업데이터는 정확히 망가질 날이 가장 많이 남았을 때 최악의 작업을 수행합니다.

검증 하네스

적응형 예측 연구 도구의 병렬 실행 경로

TWAP/VWAP/POV 실행과 동일하므로 숫자는 라인별로 비교할 수 있습니다.

  • 도구/데이터: BTCUSDT 영구, 90일 L2 재생(상위 20개 레벨, 100ms) 및 거래 테이프. UTC 전체; 자금 조달 타임스탬프가 표시되었습니다.
  • 기본 주문: 500, 수평 T=4T = 4h, 후행 30일 ADV의 0.75% 크기, 매수 측, 결정 가격 = 시작 시 중간. 게시된 실행과 동일한 임의 시작 시간입니다.
  • 무기: (A) 정적 주간 수리 곡선의 VWAP — 게시된 기준선; (B) 일중 업데이트와 동일한 사전 VWAP; (C) TWAP를 바닥으로 사용합니다.
  • 측정항목: IS는 결정 가격, 수수료 포함, 도착 대비 bps로 표시됩니다. 각 부모의 평균, 중앙값, 표준 편차, 95번째 백분위수 및 최종 사분위수의 IS로 보고됩니다. VWAP 미끄러짐은 진단 목적으로만 기록되며 점수판으로는 기록되지 않습니다. VWAP 기사의 벤치마크 섹션에서는 VWAP 슬리피지 및 도착 IS가 두 알고리즘의 순위를 반대 순서로 지정하는 작업 사례를 보여줍니다. 기회 비용 항을 포함한 전체 IS 분해는 구현 부족 및 TCA를 따릅니다.

필요한 만큼 도움이 되는가?

필요한 상황에서 도움이 되는가?

여기서 헤드라인 평균은 가장 흥미롭지 않은 숫자입니다. 게시된 결과에 따르면 VWAP-TWAP 간격은 실현된 볼륨 곡선 오류에서 단조롭기 때문에 적응형 부문은 동일한 방식으로 점수를 매겨야 합니다. 즉, 정적 예측과 실현된 버킷 볼륨 사이의 L1L_1 거리로 90일을 삼분위수로 버킷화한 다음 각 삼분위수 내에서 적응형-정적 IS 델타를 보고합니다.

두 가지 결과는 모두 게시 가능하며 반대의 의미를 갖습니다.

  • 델타는 좋은 3분위수에 집중되어 있습니다. 업데이트 프로그램은 이미 쉬웠던 날들을 다듬고 있습니다. 비용 분배에 대한 순 효과는 외관상입니다. 수평적 알파 중심 부모가 실제로 지불하는 비용인 꼬리는 변경되지 않습니다. 이는 일중 업데이터가 가장 약한 링크에 대한 수정이 아니며 다음으로 살펴볼 곳은 모양 수정 및 교차 자산 경로임을 의미합니다.
  • 델타는 나쁜 삼분위수에 집중했습니다. 업데이트 프로그램은 원래 목적대로 작업을 수행하고 있습니다. 즉, 정적 곡선이 가장 잘못된 캐스케이드 및 뉴스 날짜를 포착합니다. 이는 실행 루프에 추가된 상태를 정당화하는 결과입니다.

부정적인 결과는 예상된 결과이며 명백하게 보고할 가치가 있습니다. 암호화폐 거래량 곡선을 어렵게 만드는 메커니즘(캐스케이드는 레벨 이동이 아니라 정권 중단임)은 정확히 레벨 업데이트 예측자를 패배시키는 메커니즘입니다. 경과된 버킷이 오늘 무겁다고 말할 때쯤이면 무거운 부분이 끝날 수 있습니다. 이 블로그가 해당 내용을 게시하는 이유는 정직한 부정]을 참조하세요.

오더북 기울기: 무엇을 더하는가?

추상적 지정가-오더북 깊이 환경 및 유동성 기울기

초안 기능 세트의 한 가지 기능은 이 블로그의 다른 곳에서는 다루지 않습니다. 책 경사, 터치에서 멀어질 때 누적 깊이가 얼마나 빨리 축적되는지입니다. 최고 KK 레벨 위에 CumVol(d)=α+βd\text{CumVol}(d) = \alpha + \beta d를 맞춥니다. 큰 β\beta는 터치에 깊이가 집중된다는 의미이고, 작은 β\beta는 책 전체에 얇게 퍼지는 것을 의미합니다.

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])

만들 가치가 있는 이 주장의 유일한 버전은 측정된 버전입니다. 기존 기능 세트에 book_slope를 추가하면 볼륨 예측 또는 결과 IS가 AR/EWMA 기준을 넘어 이동합니까? 확산 모델링 기사는 표준을 설정합니다. 이 시리즈는 지속성에 의해 지배되고 헤드라인 R²는 대부분 자기상관을 측정하기 때문에 지평선이 명시된 사소한 기준선 에 대한 보고 기술입니다.

이 기사에서 의도적으로 다시 도출하지 않은 것

제한된 정량적 파이프라인 내의 집중 연구 모듈

아래의 모든 내용은 이미 블로그에 더 자세히 나와 있으며 여기서 다시 설명하면 더 약한 두 번째 버전만 생성됩니다.

  • 유동성 측정. Roll의 추정기(서명된 루트 수정 및 가격 단위 대 수익률 트랩 포함) 및 Kyle의 람다: 기계 학습을 사용한 확산 모델링. Kyle의 람다는 실제 Binance aggTrades에서 Almgren-Chriss의 영구 영향 계수로 보정됩니다. Walk-the-book 스윕 비용: 슬리피지 및 비용 모델.
  • 오더북 기능. 가중 중간(스토이코프의 소액 가격이 아님, 마틴게일 조정), 다단계 장부 불균형, OFI 및 전체 LOB 기능 분류: DeepLOB스프레드 모델링.
  • 일중 패턴. 주식 U자형은 종가가 없는 시장에 대한 잘못된 모델입니다. 이를 대체하는 암호화 세션/펀딩/주간 구조와 요일 × 시간 그리드는 VWAP 기사. 주기적 시간 인코딩은 확산 기사의 기능 테이블에 있습니다.
  • 예정된 이벤트. Deribit 08:00 UTC 만료, 미국 매크로 12:30/14:00 UTC, CME 결제 — 기준 곡선을 오염시키기보다는 더미로 취급합니다. 구체적인 암호화폐 달력은 VWAP 기사. 위의 적응형 업데이터는 이벤트 핸들러가 아님 따라서 이벤트 핸들러가 되도록 요청해서는 안 됩니다.
  • 모델. 퍼지되고 금지된 워크포워드 CV(겹치는 포워드 윈도우 대상에서 일반 TimeSeriesSplit 누출)를 사용한 그래디언트 부스팅은 확산 모델링; CNN-LSTM 계열, 40개 기능/10개 수준 입력 텐서, LOBFrame 및 복제 위기에 대한 논의는 DeepLOB. 특히 레벨 축은 순환 레이어 이전에 축소되어서는 안 된다는 점에 유의하세요.
  • 하위 주문 결정. 수동적 대 공격적은 하드 코딩된 스프레드 임계값이 아닌 계산된 손익 분기점 p=δ/(Π+δ)p^* = \delta/(\Pi + \delta)입니다. 하위 주문 실행 전술. 참여율 타겟팅은 내생적입니다. 테이프에 직접 인쇄를 채우고 수정 사항은 VWAP 기사.
  • 장소 단편화. crypto의 스마트 주문 라우팅, 구현 부족의 장소별 TCA 스코어카드.
  • 제작 지연. DeepLOB의 제작 섹션; 스프레드 기사는 이미 추론 시간 주장에 적합합니다. 2000라운드 LightGBM은 Python에서 수십 마이크로초 내에 컴파일된 예측자를 사용하여 한 자릿수로 예측합니다.

적대적 역학은 섹션이 아닌 한 단락으로 구성됩니다. 표시된 깊이는 부분적으로 수행적이며 감지 메커니즘(취소율, 벽 구축 속도, 가격 접근 시 동작, 계층화)은 대기열 위치 및 벽 분석에서 구체적인 PIQ 기반 방법으로 다룹니다. 이 기사에서 추가할 수 있는 유일한 델타는 이를 예측자 입력으로 처리하는 것입니다. 거래 취소 비율, 터치 시 평균 휴식 시간, 표시된 후 100ms 이내에 취소되는 깊이 비율은 경과된 버킷 신호와 함께 볼륨 모델에 제공됩니다. 기존 기능 세트에 기술을 추가하는지 여부는 주장이 아니라 개방형 측정입니다.

결론

불확실성에서 측정된 실행 결과까지 해결하는 증거 경로

테스트 중인 주장은 범위가 좁고 블로그는 이를 위조하기 위한 조건을 이미 설정했습니다. VWAP 기사에서는 VWAP의 장점은 전적으로 예측 품질이며 비용이 가장 많이 드는 날에는 예측이 실패한다는 사실을 입증했습니다. 일중 업데이터는 이를 수정하거나 수정하지 않으며, 대답은 500개 상위 재생의 잘못된 삼분위수에 있는 숫자입니다.

이 기사에서 다루지 않는 것은 재생 없이 프로덕션 시스템에 bps 수치를 연결하는 것입니다. "잘 조정된 유동성 예측은 2~5bps를 절약하며 Sharpe 1.5와 2.0의 차이"라는 주장은 정확히 Sharpe를 축소하고 여러 테스트가 해체하기 위해 존재하는 장르입니다. 여기서 중요한 숫자는 최악의 3분위 일수에 대한 최종 사분위수 IS이며, 이는 측정되거나 보고되지 않습니다.

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

시장에서 앞서 나가세요

뉴스레터를 구독하여 독점적인 AI 트레이딩 통찰력, 시장 분석 및 플랫폼 업데이트를 받아보세요.

귀하의 개인정보를 존중합니다. 언제든지 구독을 취소할 수 있습니다.