Python/파이썬과 주식, 코인

[Python] 볼린저 밴드(Bollinger Bands)

컴닥 2025. 4. 27. 14:35
반응형

Python으로 알아보는 Technical Indicators

1. 이동평균선(Moving Average)
2. 볼린저 밴드(Bollinger Bands)
3. 상대강도지수(RSI, Relative Strength Index)
4. 이동평균 수렴 확산 지수(MACD)

볼린저 밴드는 John Bollinger에 의해 1980년대 개발되었다.

'주가의 변동'을
'이동평균선을 중심'으로 한
'일정한 범위(표준편차)'와
함께 보여주는 기술적 지표다. 

평균, 분산, 표준편차

1, 2, 3, 4, 5의 평균은 3이다. 

각 값에서 평균을 빼면 이를 편차라고 한다. 

분산은 각 편차의 제곱의 평균이다. 
파이썬에서 **은 제곱을 의미한다. 

((1-3)**2 + (2-3)**2 + (3-3)**2 + (4-3)**2 + (5-3)**2) / 5
= (4 + 1 + 0 + 1 + 4) / 5
= 2

3, 4, 5, 6, 7 의 평균은 5,
분산은 2임을 유추할 수 있다. 

만약 c의 평균은 5이고,
분산은 (16 + 4 + 0 + 4 + 16) / 5 = 8

1,2,3,4,5 와 3,4,5,6,7의 분산은 같고.
1,3,5,7,9의 분산은 더 크다. 

분산된 정도에 따라서 값이 달라짐을 알 수 있다. 

표준편차는 분산의 양의 제곱근이다.
(양의 제곱근 = 루트를 씌우면 된다.)

분산은 편차의 '제곱'의 평균이니까, 
과하게 큰 값이다. 
분산에 루트를 씌워주면,
각 값과 더하고 뺄 때 더 잘 어울린다. 

시그마와 표준화

1반 학생들의 중간고사와 기말고사 수학 성적을 비교해 보자.
중간고사 때 1등한 A와
기말고사 때 1등한 B라는 학생 중
누가 더 잘한 거지? 

잘 했다는 것은
평균에서 누가 더 양의 방향으로 멀어진 것인지를 의미한다고 생각할 수 있다.  

집단과 집단을 비교할 때 
각 집단의 평균을 0 표준편차를 1에 맞추면 
집단내 원소들이 평균에서 얼마나 벗어나 있는지 알기 쉽게 된다. 

각각의 원소에서
그 집단의 평균을 빼고
표준 편차로 나누면 된다. 

이를 표준화라고 한다. 

 

시그마(σ)는 표준 편차인데,
데이터가 평균(μ)으로부터 얼마나 퍼져 있는지를
나타낼 때 사용하는 단위이다.

물론 다른 단위를 쓸 수도 있었겠지만...
표준 편차가 가장 합리적이니까...

약 68%의 데이터는 μ±1σ,
95%는 μ±2σ,
99.7%는 μ±3σ 범위 안에 위치. 

볼린저 밴드

자 이제 모든 것을 이해했다면...
드디어 볼린저 밴드이다. 

보통 20일 이동평균선을 중심선으로 하여, 
2시그마 즉 95% 선을 위 아래 같이 보여준다.  

중심선: n기간 동안의 이동평균(SMA)
상단선: 중심선 + Kσ(일반적으로 K는 2배를 많이 사용함)
하단선: 중심선 - Kσ(일반적으로 K는 2배를 많이 사용함)

import pandas as pd
import requests

url = "https://api.bithumb.com/v1/candles/days?market=KRW-BTC&count=200"
headers = {"accept": "application/json"}
response = requests.get(url, headers=headers)
if response.status_code != 200:
    print(response.status_code)

df = pd.DataFrame(response.json())
df["candle_date_time_kst"] = pd.to_datetime(df["candle_date_time_kst"])
df = df.sort_values(by="candle_date_time_kst").reset_index(drop=True)

k = 2
n = 20
df_4_plot = pd.DataFrame()
df_4_plot["close"] = df["trade_price"]
df_4_plot["ma"] = df["trade_price"].rolling(n).mean()
std = df["trade_price"].rolling(n).std(ddof=0)
df_4_plot["upper"] = df_4_plot["ma"] + k * std
df_4_plot["lower"] = df_4_plot["ma"] - k * std
df_4_plot["date_time"] = df["candle_date_time_kst"]
df_4_plot.set_index("date_time", inplace=True)
df_4_plot.plot()

이 그래프에서 1차적으로 알 수 있는 것은
주가의 통계적인 위치이다. 

2차적으로 
밴드 폭(상단과 하단 밴드 간의 거리)이
변동성을 의미한다는 것을 알 수 있다.
좁은 밴드는 저변동성을,
넓은 밴드는 고변동성을 의미.

이를 이용한 전략은 다음과 같으나.. 

밴드 터치 전략 (Bounce Trading)

원리: 가격이 상단 또는 하단 밴드에 닿을 때 반전될 가능성이 높다고 가정.
매수 신호: 가격이 하단 밴드에 닿거나 근접하고, 반등 신호(예: 캔들 패턴, RSI 과매도 등)가 나타날 때 매수.
매도 신호: 가격이 상단 밴드에 닿거나 근접하고, 하락 신호(예: RSI 과매수, 캔들 패턴)가 나타날 때 매도.
주의점: 강한 추세에서는 가격이 밴드를 계속 따라갈 수 있으므로, 반전 신호를 반드시 확인.

밴드 브레이크아웃 (Breakout Trading)

원리: 밴드 폭이 좁아졌다가 가격이 상단 또는 하단 밴드를 돌파하면 강한 추세가 시작될 가능성이 높음.
매수 신호: 가격이 상단 밴드를 돌파하고 거래량이 증가할 때 매수.
매도 신호: 가격이 하단 밴드를 돌파하고 하락 추세가 확인될 때 매도 또는 공매도.
주의점: 돌파 후 추세가 지속되는지 확인하기 위해 추가 지표(MACD, 거래량) 활용.

스퀴즈(Squeeze) 전략

원리: 밴드 폭이 극도로 좁아진 상태(스퀴즈)는 변동성이 낮은 구간으로, 이후 큰 가격 움직임이 발생할 가능성이 높음.
매수/매도 신호: 스퀴즈 상태에서 가격이 상단 또는 하단 밴드를 돌파하면 해당 방향으로 매매.
도구 활용: 볼린저 밴드 폭 지표(BandWidth)나 Keltner Channel을 함께 사용해 스퀴즈를 식별.
주의점: 돌파 방향을 예측하기 어렵기 때문에 돌파 후 추세 확인이 중요.

%B 지표 활용

%B: 가격이 볼린저 밴드 내에서 어디에 위치하는지를 나타내는 지표.
%B = (현재 가격 - 하단 밴드) / (상단 밴드 - 하단 밴드)
%B > 1: 상단 밴드 위
%B < 0: 하단 밴드 아래
매수 신호: %B가 0 근처(하단 밴드)에서 상승 반전 시 매수.
매도 신호: %B가 1 근처(상단 밴드)에서 하락 반전 시 매도.
장점: 정량적 신호로 직관적 판단 가능.

M-TOP과 W-Bottom 패턴

M-TOP (매도 신호): 가격이 상단 밴드를 두 번 터치하며 M자 형태를 만들고 하락할 때 매도.
W-Bottom (매수 신호): 가격이 하단 밴드를 두 번 터치하며 W자 형태를 만들고 상승할 때 매수.
활용: 다른 지표(RSI, 스토캐스틱)로 패턴의 신뢰도 확인.

추가 팁 및 주의사항

다른 지표와 결합: 볼린저 밴드는 단독으로 사용하기보다 RSI, MACD, 스토캐스틱, 거래량 지표 등과 함께 사용하면 신호의 정확도가 높아짐.
시장 환경 고려: 범위 장(횡보)에서는 밴드 터치 전략이 유리하고, 추세 장에서는 브레이크아웃 전략이 효과적.
허위 신호 주의: 밴드 돌파나 터치가 반드시 반전이나 추세를 의미하지 않으므로, 항상 추가 확인 필요.
백테스팅: 매매 전략을 실제 적용하기 전, 과거 데이터로 테스트하여 성공률과 리스크를 평가.

반응형