[Python을 활용한 주식 분석] 주봉, 월봉으로 가격 변동 범위를 파악하는 볼린저 밴드
Table of Contents
개요
이전 글에서는 이동평균선과 골든크로스/데드크로스 검출 방법에 대해 설명했습니다. 이번에는 더 장기적인 트렌드를 파악하기 위한 주봉·월봉 데이터 수집 방법과 주가 변동 범위를 통계적으로 파악하는 볼린저 밴드에 대해 설명하겠습니다.
동기
주식 투자에서는 일봉뿐만 아니라 주봉이나 월봉에서 장기적인 트렌드를 확인하는 것이 중요합니다. 단기 변동성에 흔들리지 않고 더 큰 관점에서 기업의 동향을 파악할 수 있습니다. 또한 볼린저 밴드는 이동평균선과 표준편차를 결합한 지표로 가격 변동 범위를 통계적으로 파악할 수 있습니다. 가격이 밴드의 상한선이나 하한선에 근접했을 때 매매 판단의 재료로 활용할 수 있습니다.
이전과 마찬가지로 Polars, Plotly, marimo, kand, yfinance-pl 등 Python의 모던 라이브러리를 사용하여 분석을 진행하겠습니다.
사용하는 라이브러리
라이브러리는 다음과 같습니다.
| 라이브러리 | 관련 라이브러리 | 설명 |
|---|---|---|
| polars | pandas | 데이터프레임을 고속으로 다룰 수 있는 라이브러리 |
| plotly | matplotlib | 사용자가 인터랙티브하게 그래프를 조작할 수 있는 시각화 라이브러리 |
| marimo | jupyter | py 형식으로 동작하는 노트북으로 인터랙티브하게 코드를 실행할 수 있음 |
| kand | ta-lib-python | Rust 기반의 기술적 분석 계산 라이브러리로, PYO3나 Wasm을 통해 Python이나 웹에서도 활용 가능 |
| yfinance-pl | yfinance | yfinance-rs를 래핑하여 만든 Python용 라이브러리로 Polars로 Yahoo Finance 정보를 다룰 수 있음 |
노트와 코드
marimo 노트의 HTML 버전은 여기에 있습니다. GitHub의 Python 형식 코드에도 링크합니다.
설명
주봉·월봉 데이터 수집
yfinance-pl에서는 history() 메서드의 interval 파라미터를 지정하여 일봉 이외의 데이터도 수집할 수 있습니다. 일봉은 1d, 주봉은 1wk, 월봉은 1mo를 지정합니다.
import yfinance_pl as yf
ticker = yf.Ticker("8381.T")
# 일봉 데이터 수집(기본값)
hist_daily = ticker.history(period="1y", interval="1d")
# 주봉 데이터 수집
hist_weekly = ticker.history(period="2y", interval="1wk")
# 월봉 데이터 수집
hist_monthly = ticker.history(period="5y", interval="1mo")주봉이나 월봉 데이터를 사용하면 단기 노이즈를 제거하고 더 장기적인 트렌드를 파악할 수 있습니다. 예를 들어, 주봉에서 이동평균선을 보면 수개월에서 반년 정도의 트렌드를 파악할 수 있습니다.
볼린저 밴드 계산
볼린저 밴드는 이동평균선을 중심선으로 하여 그 위아래에 표준편차를 이용한 밴드를 표시하는 지표입니다. 일반적으로 ±2σ(표준편차의 2배)를 사용합니다. 통계적으로는 가격의 약 95%가 이 밴드 내에 들어갈 것으로 예상됩니다.
kand 라이브러리를 사용하면 볼린저 밴드를 간단하게 계산할 수 있습니다.
import kand as ka
import polars as pl
import yfinance_pl as yf
ticker = yf.Ticker("8381.T")
hist = ticker.history(period="1y")
# 종가 데이터를 NumPy 배열로 변환
close = hist["close.amount"].to_numpy().astype("float64")
# 볼린저 밴드 계산(기간 20, 표준편차 2)
bbands_result = ka.bbands(close, period=20, std_dev=2.0)
# 결과를 데이터프레임에 추가
hist_with_bbands = hist.with_columns(
bb_upper=pl.Series(bbands_result.upper), # 상한 밴드(+2σ)
bb_middle=pl.Series(bbands_result.middle), # 중심선(이동평균선)
bb_lower=pl.Series(bbands_result.lower), # 하한 밴드(-2σ)
)bbands() 함수는 period(이동평균의 기간)와 std_dev(표준편차의 배수)를 지정합니다. 일반적으로 기간 20일, 표준편차 2배를 사용하지만 종목과 시간축에 따라 조정할 수 있습니다.
볼린저 밴드의 해석
볼린저 밴드는 다음과 같이 해석할 수 있습니다.
1. 밴드의 폭(변동성)
밴드의 폭은 가격의 변동성(보라틸리티)을 나타냅니다.
- 밴드 폭이 넓음: 가격 변동이 큰 상태. 트렌드가 강하거나 불안정한 상장
- 밴드 폭이 좁음: 가격 변동이 작은 상태(스퀴즈). 이후 큰 값동이 발생할 가능성이 높음
2. 밴드워크
가격이 밴드의 상한선 또는 하한선을 따라 움직이는 현상을 “밴드워크”라고 합니다.
- 상한선을 따라 움직임: 강한 상승 트렌드
- 하한선을 따라 움직임: 강한 하강 트렌드
3. 밴드에서의 이탈
- 상한 밴드를 초과: 매수 과열의 가능성. 반전의 조짐에 주의
- 하한 밴드 이하: 매도 과열의 가능성. 반발의 조짐에 주의
다만 강한 트렌드에서는 밴드를 벗어난 상태가 지속될 수도 있으므로, 다른 지표와 함께 판단하는 것이 중요합니다.
차트 시각화
Plotly를 사용하면 캔들 차트와 볼린저 밴드를 동시에 표시할 수 있습니다.
import plotly.graph_objects as go
# 데이터 준비
df_plot = hist_with_bbands.with_columns(
[
pl.col("open.amount").cast(pl.Float64),
pl.col("high.amount").cast(pl.Float64),
pl.col("low.amount").cast(pl.Float64),
pl.col("close.amount").cast(pl.Float64),
]
)
dates = df_plot["date"].to_list()
# 차트 생성
fig = go.Figure()
# 캔들 차트
fig.add_trace(go.Candlestick(
x=dates,
open=df_plot["open.amount"],
high=df_plot["high.amount"],
low=df_plot["low.amount"],
close=df_plot["close.amount"],
increasing_line_color="red",
decreasing_line_color="green",
name="주가",
))
# 볼린저 밴드 상한
fig.add_trace(go.Scatter(
x=dates,
y=df_plot["bb_upper"],
mode="lines",
name="BB상한(+2σ)",
line=dict(color="rgba(250, 128, 114, 0.5)", width=1),
))
# 볼린저 밴드 중심선
fig.add_trace(go.Scatter(
x=dates,
y=df_plot["bb_middle"],
mode="lines",
name="BB중심선(SMA20)",
line=dict(color="blue", width=1.5),
))
# 볼린저 밴드 하한
fig.add_trace(go.Scatter(
x=dates,
y=df_plot["bb_lower"],
mode="lines",
name="BB하한(-2σ)",
line=dict(color="rgba(250, 128, 114, 0.5)", width=1),
fill="tonexty", # 중심선과의 사이를 칠하기
fillcolor="rgba(250, 128, 114, 0.1)",
))
fig.update_layout(
title="주가와 볼린저 밴드",
xaxis_title="날짜",
yaxis_title="가격",
xaxis_rangeslider_visible=False,
)
fig.show()이 코드에서는 캔들 차트와 볼린저 밴드의 3개 라인(상한, 중심, 하한)을 표시합니다. fill="tonexty"를 사용하면 중심선에서 하한까지의 영역을 엷게 칠해 밴드 범위를 시각적으로 명확하게 합니다.
요약
이번에는 주봉·월봉 데이터 수집 방법과 볼린저 밴드로 가격 변동 범위를 파악하는 방법을 설명했습니다. 주봉·월봉을 사용하면 장기적인 트렌드를 확인할 수 있고, 볼린저 밴드를 사용하면 가격의 통계적 변동 범위를 파악할 수 있습니다.
이전의 이동평균선과 골든크로스·데드크로스에 볼린저 밴드를 결합하면 더욱 다각적인 분석이 가능해집니다. 앞으로도 다른 기술적 지표들을 조합하면서 Python의 모던 라이브러리를 활용한 주식 분석을 계속해 나가겠습니다.
![[Python을 활용한 주식 분석] 모던 라이브러리로 이동평균선과 골든크로스 검출하기](https://b.rmc-8.com/img/2025/12/01/5383d87b9096bc828d358edd077fef67.png)
![[Python 주식 분석] Polars로 일목균형표 계산 및 표시하기](https://b.rmc-8.com/img/2025/12/02/00541cf97f979f588ad2cad0ac6d6d7f.png)




댓글을 불러오는 중...