"주가는 속여도 거래량은 못 속입니다." 특정 기간 동안 하락한 날보다 상승한 날의 거래량이 얼마나 압도적인지를 백분율로 나타내어 시장의 과열과 침체를 짚어내는 에너지 지표예요.
1. 탄생 배경: 가격의 허상과 거래량의 실체
기술적 분석의 역사에서 거래량은 언제나 가격에 선행하거나 가격의 진위 여부를 판별하는 가장 강력한 도구로 여겨졌습니다. 하지만 기존의 누적 거래량 지표인 OBV(On-Balance Volume)는 계산을 시작하는 기준점에 따라 수치가 무한정 커지거나 작아져서, 현재 수치가 객관적으로 어느 정도 수준인지 가늠하기 어렵다는 수리적 약점이 있었습니다.
거래량 비율(VR, Volume Ratio)은 이러한 OBV의 '절대값 문제'를 해결하기 위해 탄생했습니다. 특정 시점부터 더해가는 방식이 아니라, 일정 기간 내에서 상승 에너지가 하락 에너지보다 몇 배나 강한지를 비율로 환산함으로써 지표의 객관성을 확보했습니다. 이를 통해 트레이더들은 주가가 오를 때 실린 거래량이 단순한 노이즈인지, 아니면 강력한 매수 세력의 유입인지를 통계적으로 구분할 수 있게 되었습니다.
2. 수리적 원리와 계산 구조 (상세 해부)
VR의 수식은 단순히 거래량을 더하는 것이 아니라, 일정 기간(보통 20일) 동안의 거래량을 그날의 주가 향방에 따라 세 가지 주머니(U, D, S)에 나누어 담는 정밀한 분류 작업에서 시작합니다.
1) 거래량의 성격 분류
매일의 거래량을 전일 종가 대비 당일 종가의 위치에 따라 다음과 같이 정의합니다.
- U (Up Volume): 금일 종가 > 전일 종가인 날의 거래량 합계
- D (Down Volume): 금일 종가 < 전일 종가인 날의 거래량 합계
- S (Stay Volume): 금일 종가 = 전일 종가인 날의 거래량 합계
2) 보합일 거래량(S)의 수리적 처리
VR 수식의 가장 영리한 부분은 보합일 거래량(S)을 처리하는 방식입니다. 시장의 에너지를 편향되지 않게 평가하기 위해, 보합일의 거래량은 상승 에너지와 하락 에너지에 각각 절반씩 배분합니다. 이는 주가가 변동하지 않은 날의 거래량에도 잠재적인 매수·매도 공방이 숨어있다는 통계적 가정을 바탕으로 합니다.
3) 최종 계산 공식
분류된 에너지 주머니를 활용하여 다음과 같이 비율을 산출합니다.
VR이 100%라면 상승과 하락의 에너지가 균형을 이룬 상태이며, 200%라면 상승 에너지가 하락 에너지보다 2배 더 강력하다는 수리적 증거가 됩니다.
3. 차트로 보는 지표의 특성
함께 분석한 SK하이닉스의 사례를 통해 VR이 포착하는 대중의 심리 변화를 확인해 보겠습니다.

- 매수 신호 (빨간 화살표 ▲): VR이 70% 이하로 떨어지는 구간입니다. 이는 시장에 극심한 공포가 지배하며 매도 에너지가 바닥을 드러냈음을 의미합니다. 수리적으로 반등의 확률이 매우 높은 지점입니다.
- 매도 신호 (파란 화살표 ▼): VR이 450%를 초과하는 구간입니다. 대중의 광기가 폭발하며 매수 에너지가 정점에 달했음을 나타냅니다. 단기적인 상투권일 가능성이 크므로 주의가 필요합니다.
4. 장점 및 한계
- 장점: 거래량이라는 선행 데이터를 사용하므로 가격 지표보다 바닥권을 포착하는 속도가 매우 빠릅니다.
- 한계: 강한 상승 추세에서는 VR이 450% 이상에서 한참을 머물며 상승하는 현상이 발생하므로, 과열권에서의 매도 타점은 추세 지표와 반드시 병행해서 판단해야 합니다.
5. 파이썬 구현
독자들이 본인의 stock.db를 활용해 직접 거래량 에너지를 분류하고 VR을 산출해 볼 수 있는 코드입니다.
def calculate_vr(df, window=20):
data = df.copy()
# 전일 대비 종가 차이 계산
data['diff'] = data['close'].diff()
# 주가 향방에 따른 거래량 분류 (Up, Down, Stay)
data['U'] = np.where(data['diff'] > 0, data['volume'], 0)
data['D'] = np.where(data['diff'] < 0, data['volume'], 0)
data['S'] = np.where(data['diff'] == 0, data['volume'], 0)
# 설정 기간 동안의 합계 산출
u_sum = data['U'].rolling(window=window).sum()
d_sum = data['D'].rolling(window=window).sum()
s_sum = data['S'].rolling(window=window).sum()
# VR 공식 적용
data['VR'] = ((u_sum + s_sum / 2) / (d_sum + s_sum / 2)) * 100
return data
6. 실전 Tip 및 요약
VR 매매의 핵심은 대중과 반대로 움직이는 역발상에 있습니다. 모두가 공포에 질려 VR이 70% 아래로 고꾸라질 때, 오히려 거래량 에너지는 새로운 반등을 준비하고 있습니다. 거래량의 에너지가 바닥을 치고 고개를 들 때, 주가의 반등도 비로소 시작됩니다.
*본 포스팅은 기술적 지표의 수리적 이해를 돕기 위한 참고 자료이며, 투자 결과에 대한 책임은 투자자 본인에게 있습니다.*
'기술지표' 카테고리의 다른 글
| 모멘텀(MOM) 지표 파이썬 구현 및 주가 가속도 측정 방법 [지표 백과 012] (1) | 2026.02.21 |
|---|---|
| 파라볼릭 SAR 지표 추세 전환 확인 및 시스템 트레이딩 손절 기준 [지표 백과 011] (0) | 2026.02.21 |
| 엔벨로프(Envelope) 지표 중심선 회귀 원리 및 단기 낙폭과대 매매 [지표 백과 009] (0) | 2026.02.18 |
| 스토캐스틱(Stochastic) 파동을 활용한 슬로우/패스트 실전 매매 [지표 백과 008] (0) | 2026.02.18 |
| 가중 이동평균선(WMA) 계산 원리 및 SMA, EMA와의 차이점 [지표 백과 007] (0) | 2026.02.17 |