거래량 프로파일 매매 전략

거래량 프로파일(Volume Profile)이란?

거래량 프로파일은 특정 기간 동안 각 가격대에서 체결된 거래량을 수평 히스토그램으로 표시하는 분석 기법입니다. 일반적인 거래량 차트가 시간 축을 기준으로 거래량을 보여주는 반면, 거래량 프로파일은 가격 축을 기준으로 어디에서 거래가 집중되었는지를 시각화합니다.

이 기법은 원래 시카고 선물 거래소(CME)의 피터 스타이들마이어(Peter Steidlmayer)가 개발한 마켓 프로파일(Market Profile)에서 발전한 것으로, 현재 퀀트 트레이더와 기관 투자자들 사이에서 핵심 분석 도구로 사용됩니다.

핵심 구성 요소: POC, VA, HVN, LVN

거래량 프로파일을 활용하려면 네 가지 핵심 개념을 이해해야 합니다.

  • POC(Point of Control): 가장 많은 거래량이 체결된 가격대. 시장 참여자들이 “공정 가격”으로 합의한 수준입니다.
  • VA(Value Area): 전체 거래량의 약 70%가 집중된 가격 범위. 상단을 VAH(Value Area High), 하단을 VAL(Value Area Low)이라 부릅니다.
  • HVN(High Volume Node): 거래량이 집중된 가격대로, 강한 지지/저항 역할을 합니다.
  • LVN(Low Volume Node): 거래량이 희박한 가격대로, 가격이 빠르게 통과하는 구간입니다.

파이썬으로 거래량 프로파일 계산하기

아래 코드는 바이낸스 API에서 캔들 데이터를 가져와 거래량 프로파일을 구축하는 예제입니다.

import numpy as np
import pandas as pd
import ccxt

# 바이낸스에서 1시간봉 데이터 수집
exchange = ccxt.binance()
ohlcv = exchange.fetch_ohlcv('BTC/USDT', '1h', limit=500)
df = pd.DataFrame(ohlcv, columns=['ts','open','high','low','close','volume'])

# 가격 구간(bin) 설정 — 50개 구간으로 분할
price_min, price_max = df['low'].min(), df['high'].max()
bins = np.linspace(price_min, price_max, 51)
bin_centers = (bins[:-1] + bins[1:]) / 2

# 각 캔들의 거래량을 해당 가격 범위에 균등 분배
volume_profile = np.zeros(len(bin_centers))
for _, row in df.iterrows():
    mask = (bin_centers >= row['low']) & (bin_centers <= row['high'])
    n = mask.sum()
    if n > 0:
        volume_profile[mask] += row['volume'] / n

# POC 계산
poc_idx = np.argmax(volume_profile)
poc_price = bin_centers[poc_idx]
print(f"POC (Point of Control): ${poc_price:,.0f}")

Value Area 자동 계산 알고리즘

Value Area는 POC를 중심으로 위아래로 확장하며 전체 거래량의 70%를 포함하는 범위를 찾는 방식으로 계산합니다.

def calc_value_area(bin_centers, volume_profile, pct=0.70):
    """POC 중심으로 70% 거래량 범위 계산"""
    total_vol = volume_profile.sum()
    target_vol = total_vol * pct
    poc_idx = np.argmax(volume_profile)

    upper, lower = poc_idx, poc_idx
    accumulated = volume_profile[poc_idx]

    while accumulated < target_vol:
        up_vol = volume_profile[upper + 1] if upper + 1 < len(volume_profile) else 0
        dn_vol = volume_profile[lower - 1] if lower - 1 >= 0 else 0

        if up_vol >= dn_vol:
            upper += 1
            accumulated += up_vol
        else:
            lower -= 1
            accumulated += dn_vol

    vah = bin_centers[upper]  # Value Area High
    val_ = bin_centers[lower]  # Value Area Low
    return val_, vah

val_price, vah_price = calc_value_area(bin_centers, volume_profile)
print(f"Value Area: ${val_price:,.0f} ~ ${vah_price:,.0f}")

HVN/LVN 자동 감지

HVN과 LVN은 거래량 프로파일의 로컬 극값을 찾아 판별합니다. scipy의 find_peaks 함수를 활용하면 간단합니다.

from scipy.signal import find_peaks

# HVN: 거래량 봉우리
hvn_idx, _ = find_peaks(volume_profile, prominence=volume_profile.std())
hvn_prices = bin_centers[hvn_idx]

# LVN: 거래량 골짜기 (반전시켜서 봉우리 찾기)
lvn_idx, _ = find_peaks(-volume_profile, prominence=volume_profile.std() * 0.5)
lvn_prices = bin_centers[lvn_idx]

print(f"HVN 가격대: {[f'${p:,.0f}' for p in hvn_prices]}")
print(f"LVN 가격대: {[f'${p:,.0f}' for p in lvn_prices]}")

거래량 프로파일 기반 매매 전략 3가지

전략 1: Value Area 반등 매매

가격이 VAL(Value Area Low)에 도달하면 매수, VAH(Value Area High)에 도달하면 매도하는 평균회귀 전략입니다. 시장이 레인지 국면일 때 높은 승률을 보입니다.

def va_bounce_signal(current_price, val_price, vah_price, poc_price):
    """Value Area 반등 매매 신호"""
    if current_price <= val_price:
        return 'BUY', poc_price, val_price * 0.995  # TP: POC, SL: VAL -0.5%
    elif current_price >= vah_price:
        return 'SELL', poc_price, vah_price * 1.005
    return 'HOLD', None, None

전략 2: LVN 브레이크아웃

LVN(저거래량 구간)은 가격이 빠르게 통과하는 “진공 지대”입니다. 가격이 LVN을 돌파하면 다음 HVN까지 급등/급락하는 경향이 있어 추세추종 진입에 활용합니다.

def lvn_breakout_signal(current_price, prev_price, lvn_prices, hvn_prices):
    """LVN 돌파 시 다음 HVN까지 추세추종"""
    for lvn in sorted(lvn_prices):
        if prev_price < lvn <= current_price:
            # 상방 돌파 — 다음 HVN을 목표가로
            targets = hvn_prices[hvn_prices > lvn]
            tp = targets[0] if len(targets) > 0 else current_price * 1.02
            return 'BUY', tp, lvn * 0.998
    return 'HOLD', None, None

전략 3: POC 이동 추적 (Developing POC)

실시간으로 POC가 상승 이동하면 매수 압력 우세, 하락 이동하면 매도 압력 우세로 해석합니다. 이는 기관 투자자의 포지션 구축 방향을 파악하는 데 유용합니다.

def developing_poc_signal(poc_history):
    """최근 POC 이동 방향으로 추세 판단"""
    if len(poc_history) < 3:
        return 'HOLD'
    recent = poc_history[-3:]
    if recent[-1] > recent[-2] > recent[-3]:
        return 'BUY'   # POC 연속 상승
    elif recent[-1] < recent[-2] < recent[-3]:
        return 'SELL'  # POC 연속 하락
    return 'HOLD'

통합 매매 시스템 구현

위 세 가지 전략을 결합하여 복합 신호 시스템을 구축할 수 있습니다. 각 전략의 신호를 가중 합산하여 최종 포지션을 결정합니다.

def combined_signal(price, prev_price, val_p, vah_p, poc_p,
                    lvn_prices, hvn_prices, poc_history):
    """세 전략 복합 신호 (가중 투표)"""
    score = 0
    # VA 반등 (가중치 0.4)
    sig, _, _ = va_bounce_signal(price, val_p, vah_p, poc_p)
    score += {'BUY': 0.4, 'SELL': -0.4, 'HOLD': 0}.get(sig, 0)

    # LVN 브레이크아웃 (가중치 0.35)
    sig2, _, _ = lvn_breakout_signal(price, prev_price, lvn_prices, hvn_prices)
    score += {'BUY': 0.35, 'SELL': -0.35, 'HOLD': 0}.get(sig2, 0)

    # Developing POC (가중치 0.25)
    sig3 = developing_poc_signal(poc_history)
    score += {'BUY': 0.25, 'SELL': -0.25, 'HOLD': 0}.get(sig3, 0)

    if score >= 0.5:
        return 'STRONG_BUY'
    elif score >= 0.2:
        return 'BUY'
    elif score <= -0.5:
        return 'STRONG_SELL'
    elif score <= -0.2:
        return 'SELL'
    return 'NEUTRAL'

거래량 프로파일 매매 시 주의사항

  • 시간 프레임 선택: 일간(Session) 프로파일과 주간/월간(Composite) 프로파일을 병행 분석해야 합니다. 단일 시간 프레임만 사용하면 노이즈에 취약합니다.
  • 유동성 확인: 거래량이 낮은 종목이나 시간대에는 프로파일의 신뢰도가 떨어집니다. BTC/USDT처럼 유동성이 풍부한 시장에서 효과적입니다.
  • 뉴스·이벤트 필터: FOMC, CPI 발표 등 매크로 이벤트 전후에는 프로파일이 급변하므로 이벤트 캘린더를 반드시 체크하세요.
  • 백테스트 필수: 실전 투입 전 충분한 백테스트를 진행하고, 켈리 공식으로 적절한 포지션 사이즈를 산정하세요.

마무리: 왜 거래량 프로파일인가?

대부분의 기술적 지표가 가격과 시간만을 분석하는 반면, 거래량 프로파일은 가격과 거래량의 관계를 직접 분석합니다. 이는 시장의 "합의 가격"과 "비합의 구간"을 명확히 보여주어, 지지·저항 수준을 객관적으로 판단할 수 있게 합니다.

특히 자동매매 시스템에 통합하면, 단순 이동평균이나 RSI보다 더 정교한 진입·청산 기준을 제공합니다. 거래량 프로파일을 마스터하면 시장을 "가격 차트"가 아닌 "경매 시장"으로 바라보는 관점을 갖게 됩니다.

구성 요소 의미 매매 활용
POC 최다 거래량 가격 평균회귀 목표가
VAH/VAL 70% 거래량 범위 반등 매매 진입점
HVN 고거래량 구간 지지/저항
LVN 저거래량 구간 브레이크아웃 트리거
위로 스크롤
WordPress Appliance - Powered by TurnKey Linux