주식,가상화폐 보조지표 (파이썬 소스)

[보조지표 4] 볼린저 밴드 with 파이썬

NAKYUP 2021. 1. 31. 11:02

파이썬으로 볼린저 밴드 함수만들기 

 

<빗썸 볼린저 밴드 차트>

 

 

볼린저밴드는 가격이 이동평균선을 중심으로 표준편차 범위(상한선 및 하한선) 안에서 등락을 거듭한다는 것을 전제로 만들어진 기술적 지표로서 가격의 움직임을 포착할 수 있도록 설정된 중심선과 상단밴드 그리고 하단밴드로 구성되어 있습니다. 가격 움직임의 예상 범위를 밴드로 표현하여 시각적인 효과를 준다는 점에서 다른 보조지표들과 다른 독특한 형태의 보조지표라고 할 수 있습니다.

 

중간의 이동평균선을 중심선으로 사용하며, 상-하한 변동 폭은 중심선에 표준편차(standard deviation)를 더하거나 뺀 값을 사용합니다. 이렇게 만들어진 밴드의 변화 혹은 가격의 밴드 이탈 여부 등과 같이 가격의 변동성을 바탕으로 미래의 가격을 예측하는데 사용합니다.

 

볼린저밴드 공식

 

중심선 : n일 이동평균선

상한선 : 중심선 + (표준편차 × K)

하한선 : 중심선 - (표준편차 × K)

 

일반적으로 n값과 K값은 각각 20과 2를 주로 사용하지만, 사용자의 선호도 등에 따라 적절하게 변경하여 사용할 수 있습니다. 가격이 너무 자주 상-하한 선에 부딪힌다면 좀 더 긴 이동평균 값을 필요로 할 수 있으며, 반대로 상-하한 선에 잘 닿지 않는다면 보다 짧은 이동평균 값이 필요할 수 있습니다.

 

통계학적으로 보자면 정규분포를 이루는 특정 집단에서 평균 2 표준편차 이내에 사건이 발생할 확률은 약 95%입니다. 이를 볼린저밴드에 대입해보면, 가격이 볼린저밴드 안에 있을 확률은 95%에 달하며, 볼린저밴드 상 표준편차의 2배 이상이나 이하로 이탈할 확률은 고작 5%에 불과하다는 것을 알 수 있습니다. 하지만, 이는 실제 거래에서 그대로 적용되는 것은 아닙니다. 왜냐하면, 주식의 가격이나 환율은 절대로 정규분포를 이루고 있지 않으며, 제대로 된 표준편차 마저 구할 수 없기 때문입니다.

 

그럼에도 볼린저밴드가 많은 전문 투자자들 사이에서 인기가 있는 것은, 그만큼 단순하고 이해하기 편하기 때문입니다. 또한, 다소 한계가 있다 하더라도 가격이 일정한 확률로 어떤 구간에 놓일 것이라고 예측하는데 높은 효용성을 갖기 때문이기도 합니다.

볼린저 밴드 함수를 파이썬으로 구현해보겠습니다. 

(기본 데이터 프레임(df) 생성은 '가상화폐 일봉 데이터 불러오기'에서 확인해주세요.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
w= 20 # 기준 이동평균일 
k= 2 # 기준 상수
 
#중심선 (MBB) : n일 이동평균선
df["mbb"]=df["종가"].rolling(w).mean()
df["MA20_std"]=df["종가"].rolling(w).std()
 
#상한선 (UBB) : 중심선 + (표준편차 × K)
#하한선 (LBB) : 중심선 - (표준편차 × K)
df["ubb"]=df.apply(lambda x: x["mbb"]+k*x["MA20_std"],1)
df["lbb"]=df.apply(lambda x: x["mbb"]-k*x["MA20_std"],1)
 
# df[['종가','mbb', 'ubb', 'lbb']][-200:].plot.line()
 
#df[["mbb","MA20_std","ubb","lbb"]].fillna(0, inplace=True)
 
# 밴드를 이탈했다가 진입할 때 거래    
bb_sign=[]
for i in range(len(df)):
    if i<20:
        bb_sign.append("대기")
    elif df.loc[i-1,"종가"]>=df.loc[i-1,"ubb"and df.loc[i,"종가"]<df.loc[i,"ubb"]:
        bb_sign.append("매도")
    elif df.loc[i-1,"종가"]<df.loc[i-1,"lbb"and df.loc[i,"종가"]<df.loc[i,"lbb"]:
        bb_sign.append("매수")
    else:
        bb_sign.append("대기")
 
df["bb_sign"]=bb_sign
cs

11번 라인까지 실행했을 때, df 형태는 아래 그림과 같습니다. mbb, MA20_std, ubb, lbb가 잘 계산되어 있습니다.

볼린저 밴드 실행 이미지 (Jupyter notebook) - 2021.2.9 12시

 

 

그래프로 중심선, 상한선, 하한선, 그리고 종가를 나타내보겠습니다.

1
df[['mbb','ubb','lbb','close_price']].plot.line(subplots=False)
cs
 

 

 

반응형