Python으로 볼린저밴드(Bollinger band) 구현하기

볼린저밴드(영어: Bollinger Bands)는 1980년대 존 볼린저가 개발하고 2011년 상표권 취득한 주가 기술적 분석 도구이다. 트레이딩 밴드 개념에서 발전된 볼린저 밴드와 상대지표 그리고 대역폭은 이전 거래와의 상대적 가격의 높음과 낮음을 판단하는 데 사용된다. 볼린저 밴드는 켈트너 채널과 비슷한 변동성 지표이다. 볼린저 밴드는 주가가 이동평균선 중심으로 표준편차 범위 안에서 움직인다는 전제로 개발되었다.

위키백과: https://ko.wikipedia.org/wiki/%EB%B3%BC%EB%A6%B0%EC%A0%80_%EB%B0%B4%EB%93%9C

대부분의 사이트에는 볼린저밴드 표준편차 계산에 사용되는 자유도(degrees of freedom)에 대한 언급이 없습니다.

파이썬에서 트레이딩뷰 차트와 동일한 데이터를 얻으려면 ddof=0 을 적용해야 같은 데이터를 얻으실 수 있습니다.

pip install pandas ccxt

import pandas as pd
import ccxt

# 예시) 바이낸스 선물 BTCUSDT, 1시간 봉 
bnb = ccxt.binance({'options': { 'defaultType': 'future' }}) 

def bollinger_band(length=20, factor=2.0):
    ohlcv = bnb.fetch_ohlcv(symbol="BTC/USDT", timeframe="1h", limit=500)
    df = pd.DataFrame(ohlcv, columns=['time', 'open', 'high', 'low', 'close', 'volume'])

    # 이동 평균 계산
    moving_average = df['close'].rolling(window=length).mean()
    
    # 표준편차 계산, 트레이딩뷰 차트는 ddof=0
    std_dev = df['close'].rolling(window=length).std(ddof=0) * factor

    # 상단 밴드, 하단 밴드
    upper_band = moving_average + std_dev
    lower_band = moving_average - std_dev

    df['basis'] = moving_average.round(1)
    df['upper'] = upper_band.round(1)
    df['lower'] = lower_band.round(1)

    return df

print(bollinger_band()) # 트레이딩뷰 세팅과 동일한 디폴트값 사용

트레이딩뷰 차트와 비교

basis – MA , upper – 상단 밴드, lower – 하단밴드