VWAP·TWAP이란? 알고리즘 주문의 핵심
자동매매에서 대량 주문을 한 번에 체결하면 슬리피지(slippage)가 크게 발생합니다. 이를 해결하기 위해 기관 투자자와 퀀트 트레이더가 사용하는 대표적인 알고리즘 주문 전략이 바로 VWAP(Volume Weighted Average Price)과 TWAP(Time Weighted Average Price)입니다.
두 전략 모두 대량 주문을 작은 단위로 분할하여 시장 충격을 최소화하는 실행 알고리즘(Execution Algorithm)에 해당합니다. 이 글에서는 VWAP과 TWAP의 원리, 구현 방법, 실전 활용 팁을 상세히 정리합니다.
VWAP 전략: 거래량 가중 평균가 추종
VWAP은 일정 기간 동안의 거래량 가중 평균 가격을 의미합니다. 수식으로 표현하면 다음과 같습니다:
VWAP = Σ(가격 × 거래량) / Σ(거래량)
VWAP 알고리즘 주문은 과거 거래량 패턴을 분석하여, 거래량이 많은 시간대에 더 많은 물량을 체결시킵니다. 이렇게 하면 최종 평균 체결가가 시장 VWAP에 근접하게 됩니다.
VWAP 주문 분할 로직
실전에서 VWAP 알고리즘을 구현하는 기본 흐름은 다음과 같습니다:
- 과거 데이터 분석: 최근 5~20일간의 분봉 거래량 프로파일을 수집합니다.
- 시간대별 비중 계산: 각 시간 구간(예: 5분 단위)의 평균 거래량 비중을 산출합니다.
- 주문 분배: 전체 주문 수량을 거래량 비중에 비례하여 각 구간에 배분합니다.
- 실시간 조정: 실제 거래량이 예측과 다르면 남은 구간의 배분을 동적으로 조정합니다.
# Python VWAP 주문 분할 예시
import numpy as np
def calculate_vwap_schedule(total_qty, volume_profile):
"""거래량 프로파일 기반 VWAP 주문 스케줄 생성"""
weights = np.array(volume_profile) / sum(volume_profile)
schedule = np.round(weights * total_qty).astype(int)
# 반올림 오차 보정
diff = total_qty - schedule.sum()
schedule[np.argmax(weights)] += diff
return schedule
# 시간대별 평균 거래량 (9시~15시, 30분 단위)
volume_profile = [150, 120, 80, 60, 55, 50, 55, 60, 70, 90, 130, 180]
schedule = calculate_vwap_schedule(10000, volume_profile)
print("시간대별 주문 수량:", schedule)
TWAP 전략: 시간 균등 분할 주문
TWAP은 주문 기간을 균등한 시간 구간으로 나누고, 각 구간에 동일한 수량을 체결시키는 전략입니다. VWAP보다 구현이 단순하며, 거래량 데이터가 부족한 종목이나 24시간 운영되는 암호화폐 시장에서 특히 유용합니다.
# Python TWAP 주문 실행 예시
import time
import math
def execute_twap(total_qty, duration_sec, interval_sec, place_order_fn):
"""TWAP 알고리즘 주문 실행"""
num_slices = math.ceil(duration_sec / interval_sec)
qty_per_slice = total_qty // num_slices
remainder = total_qty % num_slices
for i in range(num_slices):
qty = qty_per_slice + (1 if i < remainder else 0)
place_order_fn(qty)
if i < num_slices - 1:
time.sleep(interval_sec)
# 1시간 동안 5분 간격으로 10,000주 분할 매수
execute_twap(10000, 3600, 300, lambda q: print(f"주문: {q}주"))
TWAP의 장단점
- 장점: 구현이 간단하고 거래량 예측 오류에 영향받지 않습니다.
- 장점: 거래량이 불규칙한 시장(암호화폐 등)에서도 안정적입니다.
- 단점: 거래량이 적은 시간대에도 동일 수량을 주문하여 슬리피지가 발생할 수 있습니다.
- 단점: 패턴이 예측 가능하여 다른 알고리즘에 의해 탐지될 수 있습니다.
VWAP vs TWAP: 어떤 전략을 선택할까?
두 전략의 선택 기준은 시장 환경과 주문 목적에 따라 달라집니다:
- 유동성이 높은 주식 시장: 거래량 패턴이 뚜렷하므로 VWAP이 유리합니다. 장 시작과 마감 시 거래량 집중 현상을 활용할 수 있습니다.
- 24시간 암호화폐 시장: 거래량 패턴이 불규칙하여 TWAP이 더 안정적입니다.
- 벤치마크 평가: 기관 투자자는 VWAP 대비 체결 성과를 평가받으므로 VWAP 전략이 필수입니다.
- 소형주·저유동성 종목: 거래량 자체가 적어 TWAP으로 시간 분산하는 것이 안전합니다.
실전 구현 시 주의사항
1. 참여율(Participation Rate) 제한
각 시간 구간에서 실제 시장 거래량의 일정 비율(보통 10~25%)을 초과하지 않도록 제한해야 합니다. 이를 참여율 제한이라 하며, 시장 충격을 방지하는 핵심 파라미터입니다.
2. 잔량 처리(Residual Handling)
주문 종료 시점에 미체결 잔량이 남으면 마지막 구간에서 공격적으로 체결하거나, 시간을 연장할지 사전에 정의해야 합니다. 자동매매 봇 리스크 관리에서 다루는 손절 로직과 연계하면 더 안전합니다.
3. 랜덤화(Randomization)
주문 타이밍과 수량에 약간의 랜덤 노이즈를 추가하면 알고리즘 탐지를 어렵게 만들 수 있습니다. 특히 HFT(고빈도 매매) 환경에서는 필수적인 기법입니다.
# 랜덤화 적용 TWAP 예시
import random
def execute_twap_randomized(total_qty, num_slices, base_interval, place_order_fn):
"""랜덤 노이즈가 적용된 TWAP 실행"""
remaining = total_qty
for i in range(num_slices):
if i == num_slices - 1:
qty = remaining
else:
base_qty = total_qty // num_slices
qty = max(1, base_qty + random.randint(-base_qty//5, base_qty//5))
qty = min(qty, remaining)
remaining -= qty
place_order_fn(qty)
# 간격에 ±20% 랜덤 적용
jitter = base_interval * random.uniform(-0.2, 0.2)
time.sleep(base_interval + jitter)
4. 실시간 모니터링과 중단 조건
알고리즘 주문 실행 중에도 시장 급변(급등락, 거래 정지 등) 시 즉시 중단할 수 있는 킬 스위치(Kill Switch)를 반드시 구현해야 합니다. 자동매매 리밸런싱 전략과 결합하면 포트폴리오 차원에서 주문을 관리할 수 있습니다.
고급 기법: Adaptive VWAP
기본 VWAP은 과거 거래량 프로파일에 의존하지만, Adaptive VWAP은 실시간 거래량을 반영하여 스케줄을 동적으로 조정합니다. 핵심 아이디어는 다음과 같습니다:
- 실제 거래량이 예측보다 많으면 → 현재 구간에서 더 많이 체결 (시장 유동성 활용)
- 실제 거래량이 예측보다 적으면 → 체결을 늦추고 다음 구간으로 이월
- 누적 체결률과 누적 거래량 비율의 괴리를 실시간으로 모니터링
# Adaptive VWAP 핵심 로직
def adaptive_vwap_adjustment(target_pct, actual_volume_pct, max_participation=0.25):
"""실시간 거래량 대비 주문 속도 조정"""
if actual_volume_pct > target_pct * 1.2:
# 거래량 많음 → 적극 체결
return min(actual_volume_pct * max_participation, target_pct * 1.5)
elif actual_volume_pct < target_pct * 0.8:
# 거래량 적음 → 보수적 체결
return target_pct * 0.7
else:
return target_pct
VWAP·TWAP 성과 측정 지표
알고리즘 주문의 성과는 다음 지표로 평가합니다:
- VWAP Slippage: 체결 평균가와 시장 VWAP의 차이. 0에 가까울수록 우수합니다.
- Implementation Shortfall: 의사결정 시점 가격 대비 실제 체결 비용의 차이입니다.
- 참여율(Participation Rate): 전체 시장 거래량 대비 알고리즘 주문 비중입니다.
- 체결률(Fill Rate): 목표 수량 대비 실제 체결된 비율입니다.
이러한 지표를 샤프 비율과 함께 분석하면 전략의 전체적인 효율성을 종합 평가할 수 있습니다.
마무리: 알고리즘 주문은 자동매매의 기본기
VWAP과 TWAP은 퀀트 트레이딩의 가장 기본적이면서도 중요한 실행 알고리즘입니다. 아무리 좋은 매매 신호를 포착해도, 주문 실행이 비효율적이면 수익이 슬리피지로 사라집니다. 알파(Alpha)를 찾는 것만큼 실행 비용을 줄이는 것이 퀀트 트레이딩 성공의 핵심입니다.
자동매매 시스템을 구축할 때 VWAP·TWAP 알고리즘을 기본 모듈로 포함시키고, 시장 특성에 맞게 파라미터를 튜닝하여 최적의 실행 성과를 달성하세요.