αAlphaware
QUANT6분 읽기

볼린저밴드 읽는 법: 밴드 터치와 스퀴즈가 말해주는 것과 말해주지 않는 것

볼린저밴드의 계산과 기본값, %B와 BandWidth, 밴드 터치·밴드 워크·스퀴즈의 의미를 존 볼린저의 규칙과 실행 가능한 코드로 정리합니다.

볼린저밴드 읽는 법: 밴드 터치와 스퀴즈가 말해주는 것과 말해주지 않는 것

업데이트: 2026년 11월 3일. 볼린저밴드의 계산, 밴드 터치와 스퀴즈를 해석할 때의 조건을 다룹니다. 차트와 숫자는 가상 데이터로 만든 설명용 예시이며, 매매 성과를 측정한 결과가 아닙니다.

볼린저밴드는 최근 변동성에 맞춰 폭이 바뀌는 범위다

볼린저밴드(Bollinger Bands)는 존 볼린저(John Bollinger)가 1980년대에 만든 지표입니다. 이동평균 위아래에 일정한 비율이나 폭으로 긋는 고정 밴드와 달리, 밴드 폭을 최근 가격의 표준편차로 정합니다. 그래서 변동성이 커지면 밴드가 넓어지고 작아지면 좁아집니다.

따라서 볼린저밴드가 직접 보여주는 것은 두 가지입니다. 현재 가격이 최근 평균에서 상대적으로 얼마나 떨어져 있는지, 그리고 최근 변동성이 과거보다 큰지 작은지입니다. 가격이 앞으로 어디로 갈지는 보여주지 않습니다.

가상 가격과 20기간 SMA, 상단 밴드(+2σ), 하단 밴드(−2σ)가 그려지며 'Volatility Squeeze' 구간과 'Volatility Breakout' 시점이 표시되는 애니메이션
가상 데이터로 그린 차트. 변동성이 줄어 밴드가 좁아진 구간 뒤에 밴드가 넓어지는 과정을 보여줍니다. 이 예시의 확장 방향은 데이터를 만들 때 정한 것이며, 스퀴즈가 방향을 알려준다는 뜻이 아닙니다.

기본값은 20기간 평균과 2표준편차다

볼린저가 기본값으로 제시한 설정은 20기간과 2표준편차입니다.

선 계산
중심선 20기간 단순이동평균(SMA)
상단 밴드 중심선 + 2 × 20기간 표준편차
하단 밴드 중심선 − 2 × 20기간 표준편차

볼린저는 두 보조 지표도 정의했습니다. %B는 가격이 밴드 안 어디에 있는지를 나타내며, 하단 밴드에서 0, 중심선에서 0.5, 상단 밴드에서 1입니다. 밴드 밖이면 0보다 작거나 1보다 큽니다. BandWidth는 밴드 폭을 중심선으로 나눈 값으로, 가격 수준이 다른 시기나 종목의 변동성을 비교할 수 있게 합니다.

%B        = (가격 − 하단 밴드) / (상단 밴드 − 하단 밴드)
BandWidth = (상단 밴드 − 하단 밴드) / 중심선
중심선·상단 밴드·하단 밴드의 계산식, Band Width = Upper − Lower, 좁은 밴드(Squeeze)와 넓은 밴드(Expansion)를 비교한 볼린저밴드 구성 다이어그램
직접 그린 구성도. 그림의 Band Width는 상단과 하단의 차이(절대 폭)이며, 볼린저의 BandWidth 지표는 이 값을 중심선으로 나눕니다.

“2표준편차면 가격의 약 95%가 밴드 안에 있다”는 설명은 가격이 정규분포를 따른다는 가정에서 나온 숫자입니다. 가격은 그 가정을 따르지 않으며, StockCharts ChartSchool은 볼린저의 설명을 인용해 밴드가 가격 움직임의 88–89% 정도를 담는다고 소개합니다. 볼린저 자신도 이 계산에서 통계적 결론을 끌어내지 말라고 경고합니다. 또 표준편차를 n으로 나누는지, n − 1로 나누는지는 플랫폼마다 다를 수 있고, n − 1을 쓰면 밴드가 조금 넓어집니다. 아래 코드는 n으로 나눕니다.

import numpy as np
import pandas as pd

def bollinger(close, n=20, k=2.0):
    mid = close.rolling(n).mean()
    sd = close.rolling(n).std(ddof=0)      # divide by n; some platforms use n - 1
    upper, lower = mid + k * sd, mid - k * sd
    return pd.DataFrame({
        "mid": mid, "upper": upper, "lower": lower,
        "pct_b": (close - lower) / (upper - lower),
        "bandwidth": (upper - lower) / mid,
    })

rng = np.random.default_rng(7)
quiet = 100 + rng.normal(0, 0.2, 60)
loud = 100 + rng.normal(0, 2.0, 60)
close = pd.Series(np.r_[quiet, loud])
bb = bollinger(close)

# BandWidth follows recent volatility: much narrower in the quiet block.
assert bb["bandwidth"].iloc[40:60].mean() * 5 < bb["bandwidth"].iloc[100:].mean()

# %B is 0 at the lower band, 0.5 at the middle, 1 at the upper band.
row = bb.iloc[-1]
assert np.isclose((row["mid"] - row["lower"]) / (row["upper"] - row["lower"]), 0.5)

# A trending series spends many closes at or above the upper band ("walking the band").
trend = bollinger(pd.Series(100 + np.arange(80.0) + rng.normal(0, 0.3, 80)))
assert (trend["pct_b"].iloc[20:] > 0.9).mean() > 0.5

# The n - 1 convention gives slightly wider bands than the n convention.
s = close.iloc[:20]
assert s.std(ddof=1) > s.std(ddof=0)

밴드 터치는 매매 신호가 아니다

“상단 밴드에 닿으면 매도, 하단 밴드에 닿으면 매수”는 가장 흔한 오해입니다. 볼린저의 규칙은 이렇게 말합니다. 밴드에 닿은 것은 닿은 것일 뿐 신호가 아니며, 밴드 밖에서 마감한 종가는 처음에는 반전이 아니라 지속 신호로 봐야 합니다. 많은 변동성 돌파 시스템이 이 생각에 기대고 있습니다.

강한 상승 추세에서는 가격이 상단 밴드를 따라 여러 번 닿으며 올라가는 “밴드 워크(walking the bands)“가 나타납니다. 위 코드의 세 번째 검증이 그 예입니다. 일정하게 오르는 가상 가격에서는 대부분의 종가에서 %B가 0.9를 넘습니다. 이때 상단 밴드 터치를 매도 근거로 쓰면 추세와 반대로 거래하게 됩니다. 하락 추세에서는 하단 밴드에서 같은 일이 일어납니다.

밴드 터치를 쓰려면 “시장이 추세장인지 박스권인지”를 별도의 조건으로 정의해야 합니다. 그 조건 자체도 사후에 고르면 결과가 부풀려지므로, 미리 정한 규칙으로 검증해야 합니다.

스퀴즈는 변동성 수축을 알릴 뿐 방향은 알려주지 않는다

밴드 폭이 자기 과거에 비해 크게 좁아진 상태를 스퀴즈(Squeeze)라고 부릅니다. 볼린저는 BandWidth의 가장 흔한 용도가 스퀴즈를 찾는 것이라고 설명합니다.

다만 스퀴즈는 방향을 알려주지 않습니다. 밴드가 좁아진 뒤 위로 갈지 아래로 갈지는 볼린저밴드만으로는 알 수 없고, 확장이 언제 올지도 정해져 있지 않습니다. 스퀴즈를 규칙으로 쓰려면 “BandWidth가 최근 N기간 최저일 때”처럼 기준을 숫자로 정하고, 이탈 방향을 무엇으로 판단하는지도 함께 고정해야 합니다.

밴드가 넓어진다는 것은 변동성이 이미 커졌다는 관찰입니다. 그것이 추세의 시작인지 끝인지는 밴드 폭만으로 판단할 수 없습니다.

조합은 서로 다른 정보를 주는 지표로 한다

볼린저는 볼린저밴드를 다른 지표와 함께 쓰되, 서로 직접 연관되지 않은 지표를 고르라고 권합니다. 모멘텀 지표 하나와 거래량 지표 하나는 서로 보완할 수 있지만, 같은 가격에서 계산한 모멘텀 지표 두 개는 하나보다 나을 것이 없다는 것입니다. 하단 밴드 터치와 RSI 30 이하가 동시에 나왔다고 신뢰도가 두 배가 되지는 않습니다. 둘 다 최근 가격이 크게 내렸다는 같은 사실을 반영하기 때문입니다.

ChartSchool이 소개하는 볼린저의 W 바닥(W-Bottom)은 밴드를 조건으로 정의한 예입니다. 검증 가능한 규칙으로 옮기면 다음과 같습니다.

  1. 첫 저점이 하단 밴드 근처나 밖에서 만들어진다.
  2. 가격이 중심선 쪽으로 반등한다.
  3. 두 번째 저점은 첫 저점보다 낮지만 하단 밴드 안쪽에서 멈춘다(%B가 0보다 큼).
  4. 두 번째 저점에서 강하게 반등해 반등 고점을 넘는다.

이렇게 정의하면 형태를 주관적으로 고르는 일을 줄일 수 있습니다. 하지만 이 규칙이 거짓 신호를 걸러낸다거나 수익을 낸다는 근거는 이 글의 출처에 없습니다. 손절 위치, 신호 수, 비용을 포함해 따로 검증해야 합니다.

기간과 배수는 함께 움직여야 한다

20과 2는 기본값이지 정답이 아닙니다. 볼린저는 시장과 목적에 따라 다른 값이 필요할 수 있다고 하면서, 기간을 늘리면 표준편차 배수도 늘리고 줄이면 배수도 줄이라고 권합니다. 그의 예시는 20기간에 2, 50기간에 2.1, 10기간에 1.9입니다. 기간만 바꾸고 배수를 그대로 두면 밴드 밖으로 나가는 빈도가 달라져 신호의 의미가 바뀝니다.

시간프레임도 따로 다뤄야 합니다. 일봉에서 스퀴즈인 구간이 1시간봉에서는 이미 한쪽으로 움직이고 있을 수 있습니다. 여러 기간·배수·시간프레임을 시험했다면 가장 좋은 조합을 바로 채택하지 말고, 과적합 방지 칼럼의 워크포워드 검증으로 선택 과정까지 다시 확인합니다. 변동성을 가격 단위의 손절 거리로 바꾸는 방법은 ATR 칼럼에서 다룹니다.

자료와 적용 범위

반응

이 브리프가 도움이 됐나요?

구독

새 글 받아보기

새 브리프가 올라가면 이메일로 보냅니다. RSS와 X도 그대로 있습니다.

구독하기
같은 카테고리 더 보기QUANT →