콘텐츠로 이동

밴드 & 변동성 (Bands & Volatility)

밴드 지표는 가격의 정상적인 변동 범위를 시각화하고, 변동성 지표는 가격 변동의 크기를 측정합니다.

ta.bbands()

볼린저밴드 (Bollinger Bands)

이동평균을 중심으로 표준편차 기반의 상하단 밴드를 형성합니다.

ta.bbands(source, period, std_dev) → (TSeries, TSeries, TSeries)

파라미터:

이름 타입 기본값 설명
source TSeries 입력 시계열
period int 20 SMA 기간
std_dev float 2.0 표준편차 배수

반환값: (upper, mid, lower) — 3개의 TSeries 튜플

  • upper: 상단밴드 = SMA + (표준편차 x std_dev)
  • mid: 중심선 = SMA
  • lower: 하단밴드 = SMA - (표준편차 x std_dev)

예제:

c = chart("1D")
upper, mid, lower = ta.bbands(c.close, 20, 2.0)

c.line("BB Upper", upper, color="red")
c.line("BB Mid", mid, color="gray")
c.line("BB Lower", lower, color="green")

# 볼린저밴드 전략
if c.close[0] < lower[0]:
    buy(tag="하단밴드 이탈 — 반등 기대")
elif c.close[0] > upper[0]:
    sell(tag="상단밴드 이탈 — 과열")
else:
    hold()

볼린저밴드 수축/확장 (Squeeze)

c = chart("1D")
upper, mid, lower = ta.bbands(c.close, 20, 2.0)

# 밴드 폭 계산
band_width = (upper - lower) / mid

# 밴드 폭이 줄어들면 변동성 수축 → 큰 움직임 예고
avg_width = ta.sma(band_width, 50)

if band_width[0] < avg_width[0] * 0.5:
    log("볼린저밴드 스퀴즈 — 변동성 확대 임박")
    if c.close > mid:
        buy(tag="스퀴즈 + 중심선 위 = 상방 돌파 기대")

%B 활용

c = chart("1D")
upper, mid, lower = ta.bbands(c.close, 20, 2.0)

# %B = (종가 - 하단) / (상단 - 하단)
pctb = (c.close[0] - lower[0]) / (upper[0] - lower[0])

if pctb < 0:
    log(f"%B = {pctb:.2f} — 하단밴드 아래")
elif pctb > 1:
    log(f"%B = {pctb:.2f} — 상단밴드 위")

ta.atr()

평균진정범위 (Average True Range)

가격의 변동 폭을 측정하는 변동성 지표입니다. 스탑로스와 포지션 사이징에 자주 사용됩니다.

ta.atr(high, low, close, period) → TSeries

파라미터:

이름 타입 기본값 설명
high TSeries 고가 시계열
low TSeries 저가 시계열
close TSeries 종가 시계열
period int 14 평균 기간

반환값: TSeries

예제:

c = chart("1D")
atr = ta.atr(c.high, c.low, c.close, 14)

c.line("ATR", atr, color="orange")

# ATR 기반 변동성 판단
avg_atr = ta.sma(atr, 50)

if atr[0] > avg_atr[0] * 1.5:
    log("높은 변동성 — 주의")
elif atr[0] < avg_atr[0] * 0.5:
    log("낮은 변동성 — 돌파 가능성")

ATR 기반 손절 수준

c = chart("1D")
atr = ta.atr(c.high, c.low, c.close, 14)

# 2 ATR 손절 수준
stop_loss = c.close[0] - atr[0] * 2
take_profit = c.close[0] + atr[0] * 3

log(f"진입: {c.close[0]}, 손절: {stop_loss:.0f}, 목표: {take_profit:.0f}")

if c.close[0] < stop_loss:
    sell(tag=f"ATR 기반 손절 도달")

ta.stdev()

표준편차 (Standard Deviation)

가격의 분산 정도를 측정합니다.

ta.stdev(source, period) → TSeries

파라미터:

이름 타입 설명
source TSeries 입력 시계열
period int 계산 기간

반환값: TSeries

예제:

c = chart("1D")
std = ta.stdev(c.close, 20)

c.line("StDev", std, color="cyan")

# 표준편차가 낮으면 횡보 → 돌파 대기
avg_std = ta.sma(std, 50)
if std[0] < avg_std[0] * 0.5:
    log("낮은 변동성 횡보 구간")

밴드 + 변동성 복합 전략

version("1.0")
description("볼린저밴드 + ATR 전략")

c = chart("1D")

# 볼린저밴드
upper, mid, lower = ta.bbands(c.close, 20, 2.0)
c.line("BB Upper", upper, color="red")
c.line("BB Mid", mid, color="gray")
c.line("BB Lower", lower, color="green")

# ATR
atr = ta.atr(c.high, c.low, c.close, 14)
avg_atr = ta.sma(atr, 50)

# 변동성이 낮은 상태에서 밴드 이탈 시 추세 추종
low_vol = atr[0] < avg_atr[0] * 0.8

if c.close[0] > upper[0] and low_vol:
    buy(tag="스퀴즈 후 상단밴드 돌파")
elif c.close[0] < lower[0] and low_vol:
    sell(tag="스퀴즈 후 하단밴드 이탈")
else:
    hold()

관련 문서