본문 바로가기
Python

파이썬을 이용한 가상 화폐 매매 전략 - Bollinger Band

by 아짱이아빠 2021. 9. 4. 20:11
반응형

Bollinger Band를 만드는 파이썬 코드를 알아보고 Bollinger Band로 가상 화폐 매매를 했을 때 수익을 낼 수 있는지 알아본다.

먼저 Bollinger Band란 무엇이고 어떻게 매매에 이용할 수 있는지 알아본다.

[볼린저 밴드(Bollinger Band)]

볼린저 밴드는 주가와 함께 표시되고 상한선과 중심선, 하한선으로 이루어진다.
주가의 이동평균선인 중심선을 기준으로 상한선과 하한선의 폭이 주가의 추세에 따라 변동하는 특징이 있다.
그래서 볼린저 밴드는 주가의 변동성을 나타내는 보조지표이기도 하다.

볼린저 밴드(Bollinger Band) 구성
볼린저 밴드(Bollinger Band) 구성

 

[볼린저 밴드를 이용한 매매전략]

볼린저 밴드는 주가는 상한선과 하한선 이내에 움직이는 확률이 95%가 넘는다는 것을 전제로 한다.
그렇게 때문에 하한선을 벗어나면 밴드 안쪽으로 올라오려 하고 상한선을 넘어가도 다시 밴드 안쪽으로 내려오려는 특성이 있다.
그래서 테스트를 해볼 기본 전략은 다음과 같다.
코인의 가격이 하한선 밑으로 내려갈 때 매수를 하고 코인의 가격이 상한선을 넘을 때 매도를 한다.
그러나 매수를 했는데 계속 하락세일 경우 손해가 될 수 있으니 반등의 기미가 보일 때 매수를 하기 위해 이전 종가가 하한선을 내려갔고 현재 가격은 하한선보다 높아질 때 매수를 한다.

이외에도 많은 전략을 만들 수 있지만 일단 가장 기본적인 것에 대한 테스트를 해보겠다.


[파이썬 코드 - 볼린저 밴드 구현]

이전 포스트에서 주가나 가상 화폐의 데이터를 불러와서 시각화하는 내용은 많이 얘기했으므로 여기서는 이러한 부분은 생략하고 바로 볼린저 밴드 구현 코드로 넘어가도록 하겠다.

data['Moving Average'] = data['Close'].rolling(window=20, min_periods=1).mean() data['Standard Deviation'] = data['Close'].rolling(window=20, min_periods=1).std() data['Upper BollingerBand'] = data['Moving Average'] + (data['Standard Deviation'] * 2) data['Lower BollingerBand'] = data['Moving Average'] - (data['Standard Deviation'] * 2)


주식의 주가나 가상 화폐 가격 데이터를 불러와서 “data”에 저장이 되었다.
data에서 20일 이동평균선을 .rolling 함수로 구하여 “Moving Average” column에 저장한다.
표준편차는 .std 함수로 쉽게 구하며 상한선과 하한선은 앞에서의 이동평균선에 2배 수한 표준편차를 더하거나 빼서 구한다.

이를 시각화하면 아래와 같다.
아래의 그림은 가상 화폐 에이다(ADA)의 2021년 1월부터 현재까지의 데이터이다.

에이다(ADA)의 볼린저 밴드
에이다(ADA)의 볼린저 밴드


그림에서는 하한선 밑으로 가격이 처음 내려간 부분에서 매수가 되고 이후 본격적으로 상승세가 시작되는 부분에서 상한선을 가격이 넘어 매도가 될 것이다.

위 그림에서는 한 번의 매매만 일어날 것으로 예측되는데 이는 볼린저 밴드 구현 코드를 설명하기 위한 것이고 실제 매매의 backtesting은 분 봉 데이터를 바탕으로 하며 이보다는 많은 매매가 일어날 것이다.

반응형



[Backtesting - 볼린저 밴드]

여기서도 backtesting을 하는 자세한 코드는 생략하도록 하겠다.
Backtesting에 대한 자세한 내용은 아래의 글에 있으니 참고하면 되겠다.

 

 

SMA와 MACD 이용 Python 가상화폐 자동매매(2/2)-backtesting

지난번에 알아본 자동매매 프로그램을 backtesting 하는 방법과 그 결과에 대한 분석을 해보겠다. 먼저 backtesting 코드를 알아본 후 dp이다(ADA)와 이더리움클래식(ETC)에 대해 자동매매 프로그램의 누

superhky.tistory.com



먼저 테스트를 할 ADA 코인의 2021년 9월 2일 14시 40분부터 9월 3일 23시 40분까지의 가격과 볼린저 밴드를 시각화하면 다음과 같다.
이 시간대의 데이터를 바탕으로 위에서 언급한 전략에 의한 매매를 하면 그림에 있는 것과 같은 부분에서 3번의 매매가 일어날 것이다.

에이다(ADA) 코인의 볼린저 밴드 기반 매매 예측
에이다(ADA) 코인의 볼린저 밴드 기반 매매 예측


Backtesting의 핵심이 되는 매매 전략을 구현한 코드는 아래와 같다.

buy_price=[] sell_price=[] flag = 1 for i in range(len(new_df01)): if (LBB[i-1] > new_df01.close[i-1]) and (LBB[i] < new_df01.close[i]) and flag == 1: buy_price.append(new_df01['close'][i]) buy_price_=new_df01['close'][i] buy_date = new_df01.index[i] print('buy date :', buy_date) print('buy price :', buy_price_) flag = 0 if (UBB[i] < new_df01.close[i]) and flag == 0: sell_price.append(new_df01['close'][i]) sell_price_=new_df01['close'][i] sell_date = new_df01.index[i] print('sell date :', sell_date) print('sell price :', sell_price_) flag = 1


ADA 코인의 데이터는 “new_df01”에 저장되어 있으며 UBB와 LBB는 각각 볼린저 밴드의 상한선과 하한선이다.
첫 번째 조건문은 매수에 대한 조건이고 두 번째 조건문은 매도에 대한 조건이며 앞에서 설명한 것과 동일한 매매의 조건을 정의하고 있다.

이렇게 했을 때의 backtesting 결과인 누적 수익률은 다음과 같다.

ADA 볼린저 밴드 기반 매매 누적 수익률
ADA 볼린저 밴드 기반 매매 누적 수익률


예측데로 3번의 매매가 있었고 누적 수익률은 4.4%이다.
만 하루 반 정도의 시간에 4.4% 로면 괜찮은 수익률이라고 생각된다.
특히, 이 테스트의 데이터로만 보면 시작 시간데의 가격보다 끝에서의 가격이 낮으므로 하락하는 장이었다.
그럼에도 불구하고 볼린저 밴드 기반의 매매는 수익을 내고 있는 것이다.

[결 론]

위에서의 결과만 보면 볼린저 밴드는 주식이나 가상 화폐 투자를 할 때 하락에서도 수익을 내는 무결점의 보조 지표로 착각을 할 수 있다.
그러나 어쩌다 위의 샘플 데이터가 볼린저 밴드 기본 전략과 궁합(?)이 잘 맞아 하락하는 형세에서도 수익을 낸 것이다.
보통은 매수를 할 때에 매수 이후에 더 하락이 생겨 전체적으로 낮아진 가격 데에서 볼린저 밴드의 상한선을 넘으면서 매도가 이루어져  손해를 보는 경우가 발생한다.
또한, 중심선 부근에서 가격의 급상승이 생기고 상한선과 하한선 폭이 넓어지는 경우에 대해 이 전략은 그 상승할 때의 이익을 가질 수 없다는 단점이 있다.

그렇기 때문에 볼린저 밴드의 이 매매 전략에 다른 전략들을 추가해야 한다.
예를 들면 상한선과 하한선의 폭을 모니터링하고 있다가 갑자기 증가하면서 가격이 상한선을 연속적으로 넘으면 이때에도 매수를 할 수 있는 조건이 필요하다.
반대로 폭이 증가하면서 가격이 하한선 밑으로 연속적으로 내려가면 매도를 하는 조건도 필요할 수 있다.
또한, 변동성을 보여주는 볼린저 밴드 지표에 추세를 보여주는 MACD를 조합한다던지 아니면 거래량을 보여주는 OBV나 MFI 지표를 조합하여 여러 조건이 충족할 때에 매수나 매도를 하도록 하면 더욱 수익을 낼 확률이 높은 거래를 할 수 있을 것이다.

 

반응형

댓글