밴드 & 변동성 (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: 중심선 = SMAlower: 하단밴드 = 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()
관련 문서¶
- 이동평균 — 볼린저밴드의 기반인 SMA
- 모멘텀 — 추세 강도 보조 지표
- ta.* 전체 레퍼런스 — 모든 지표 시그니처