본문 바로가기
Python

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

by 아짱이아빠 2022. 7. 18. 21:15
반응형

주식이나 가상 화폐 매매 전략 중 Bollinger Band를 조금 다른 방식으로 응용하는 전략에 대해 알아보고 이를 파이썬 코드로 구현해 보겠다.

 

Bollinger Band는 Upper Band와 이동평균선, 그리고 Lower Band를 표시하여 주가나 가상 화폐의 가격은 이 Upper Band와 Lower Band 사이에 존재할 확률이 95% 정도 된다는 개념에 따라 가격의 상승 또는 하강 추세를 분석한다.

Bollinger Band에 대한 좀 더 자세한 내용과 이를 이용한 기본적인 매매전략 그리고 이를 구현한 파이썬 코드는 아래의 링크에 있다.

 

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

Bollinger Band를 만드는 파이썬 코드를 알아보고 Bollinger Band로 가상 화폐 매매를 했을 때 수익을 낼 수 있는지 알아본다. 먼저 Bollinger Band란 무엇이고 어떻게 매매에 이용할 수 있는지 알아본다. [볼

superhky.tistory.com

 

이번에는 이 Bollinger Band를 응용한 전략 중 하나에 대해 알아보겠다.

 

[전 략]

매수를 위한 조건은 다음의 4가지 조건을 충족할 때이다.

(1) 주가나 가상화폐의 가격이 Bollinger Band의 Upper Band를 넘었고,  

(2) 이후 가격은 하락하여 Bollinger Band의 Lower Band 밑으로 내려가며,

(3) 이후 가격이 상승하여 이동평균선을 넘는 순간

(4) 위의 3가지 조건이 충족하면서 첫 번째 조건에서의 가격에서 세 번째 조건의 가격 사이를 직선으로 연결했을 때 현재가가 그 직선을 넘는 순간이 매수의 순간이 된다.

 

이를 그림으로 표현하면 다음과 같다.

Bollinger Band를 응용한 전략의 매수 시점
(Bollinger Band를 응용한 전략의 매수 시점)

 

앞에서 얘기한 3가지 조건을 만족하면서 마지막 조건인 현재가가 직선을 통과하는 시점이 매수 지점이 되며 그림에서 검은색 직사각형으로 표시된 부분이다.

이후 가격은 그림처럼 상승이 이어질 수 있다.

물론 매수 이후 100퍼센트 상승이 있을 거란 보장은 없다.

하지만 이 전략은 꽤 낮은 지점에서 매수가 이뤄지기 때문에 이후 더 하락할 확률은 비교적 낮다고 할 수 있다.

 

매도 시점은 이전에 Bollinger Band 매매 전략에서와 같이 가격이 Upper Band를 넘었다가 다시 안쪽으로 들어오는 시점에 매도를 한다. 



[파이썬 코드]

먼저 프로그램 실행에 필요한 라이브러리를 불러온다. 

!pip install pyupbit
import pyupbit
import matplotlib.pyplot as plt

 

가상 화폐 데이터는 15분 봉을 기준으로 할 예정이므로 다음의 코드로 15분봉 200개의 데이터를 불러와서 ‘df’에 저장한다.

df = pyupbit.get_ohlcv(coin,interval="minutes15", count=200)

여기서 ‘coin’ 에는 원하는 가상 화폐를 넣으면 된다.

 

다음은 Bollinger Band를 계산하는 코드이다.

w_size = 20 
pb     = 2  

df['Moving Average'] = df['close'].rolling(window=w_size, min_periods=1).mean()
df['Standard Deviation']  = df['close'].rolling(window=w_size, min_periods=1).std()
df['Upper BollingerBand'] = df['Moving Average'] + (df['Standard Deviation'] * pb)
df['Lower BollingerBand'] = df['Moving Average'] - (df['Standard Deviation'] * pb)
df=df.dropna()

계산된 Bollinger Band 데이터는 ‘df’의 각 column에 저장한다.

 

가상 화폐의 종가와 Bollinger Band를 다음의 코드로 시각화할 수 있다.

plt.style.use('fivethirtyeight')
plt.figure(figsize=(20, 13))
plt.plot(df['close'], lw=1.2)
plt.plot(df['Moving Average'], label='Moving Average', lw=1.2)
plt.plot(df['Upper BollingerBand'], label='Upper Bollinger Band', lw=1.2)
plt.plot(df['Lower BollingerBand'], label='Lower Bollinger Band', lw=1.2)
plt.legend(loc = 'upper left')

여기까지는 다른 포스트에서 많이 설명하였고 동일한 내용이므로 더 상세한 설명은 넘어가도록 하겠다.

 

다음은 매수의 첫 번째 조건인 Upper Band를 넘는 지점을 찾는 것이며 전체 데이터에서 가장 최근에 Upper Band를 넘는 지점을 찾아 그 시점을 'x1', 그때의 가격을 'y2'로 정의한다.

코드는 다음과 같으며 매우 간단하다.

변수를 초기화하고 가장 최근의 데이터부터 하나씩 조건을 비교하다가 조건에 부합하면 그 때의 시점을 'x1'에 저장하고 이때의 가격을 'y2'로 저장한 후 if 문을 빠져나온다.

i=0
x1=0
y1=0
t=len(df)

for i in range(0, t):
  if df['close'][t-1-i] > df['Upper BollingerBand'][t-1-i]:
    x1=t-i-1
    y1=df['close'][x1]
    break

 

'x1'과 'y1'을 찾았고 다음은 두 번째 조건인 Lower Band 밑으로 가격이 내려간 시점을 찾는다.

또한 동시에 세 번째 조건인 이후 가격이 이동평균선을 넘는 지점을 찾아 'x2'와 'y2'에 저장하는 것이다.

'x1'과 'y1', 'x2'와 'y2'를 알면 초등학교 때 배운 지식을 활용하여 두 점을 지나는 직선의 방정식을 구할 수 있다. 

i=0
j=0
x2=0
k=0
target =0

for i in range(t-1,x1, -1):
  if (df['Lower BollingerBand'][i] < df['close'][i]) and (df['Lower BollingerBand'][i-1] > df['close'][i-1]):
    k = i
    for j in range(k,t-1):
      if (df['Moving Average'][j-1] > df['close'][j-1]) and (df['Moving Average'][j] < df['close'][j]):
        x2 = j
        y2 = df['close'][j]
        if x2 !=0:
          target = ((y2-y1)/(x2-x1))*(199-x1)+y1
        break

 

위의 코드에서 첫 번째 for 문은 최신 데이터부터 앞에서 찾은 'x1'의 지점 사이에 Lower Band 보다 가격이 낮았다가 높아진 지점을 찾는 것이며 이 때의 지점을 ‘k’에 저장한다.

그리고 이 조건이 성립하면 이 'k' 지점부터 데이터의 끝까지 사이 중에 이동평균선인 Moving Average를 넘는 지점을 찾는다.

이 조건이 성립할 때 'j' 값을 'x2'에 저장하고 'x2' 지점에서의 가격인 'y2'를 저장한다.

 

그러면 직선을 만들 수 있는 두 점의 위치를 확인했으니, 직선의 방정식으로 매수 목표가인 ‘target’을 계산할 수 있다.

단, 주가나 가상 화폐 가격의 흐름이 여기서 얘기하는 조건과 부합하지 않는 경우도 있을 수 있으므로 'target'의 계산은 모든 조건이 충족할 때 즉, 'k'가 0이 아니고 'x2'도 0이 아닐 때에만 계산을 하도록 한다.

 

매도를 하는 파이썬 코드에 대해서는 이전 글에 나와 있으므로 여기서는 설명하지 않도록 하겠다.

 

반응형

 

[결 과]

다음은 결과이다.

먼저 가상 화폐 웨이브(WAVES)의 15분 봉 데이터에 대한 결과이다.

가상 화폐 웨이브(WAVES)에 대한 분석 결과
(가상 화폐 웨이브(WAVES)에 대한 분석 결과)

 

매수의 목표가 즉, 'target'의 계산 결과는 6,683원이며 그때의 가격은 이보다 높기 때문에 매수는 없고 좀 더 기다려봐야 하는 상황이다.

 

다음은 가상 화폐 리플(XRP)에 대한 결과이다.

가상 화폐 리플(XRP)에 대한 분석 결과
(가상 화폐 리플(XRP)에 대한 분석 결과)

 

위의 결과를 보면 가장 최근 시점에서의 매수 목표가는 583원이지만 그전에 약 585원 정도에서 가격이 직선을 넘어 매수 타이밍이 있었다고 볼 수 있다.

만약 이렇게 해서 매수를 했다면 매도는 가격이 Bollinger Band의 Upper Band를 넘었다가 다시 안쪽으로 들어오는 시점이 될 것이다. 

 

여기까지 Bollinger Band를 응용하여 주식이나 가상 화폐의 매매 전략을 세우고 이를 파이썬 코드로 구현하는 것에 대해 알아봤다.

이러한 전략이 얼마 큼의 수익을 가져올지는 모른다.

다만, 비교적 가격이 많이 떨어지고 상승할 수 있는 추세에 매수를 한다는 점이 좀 안정적인 전략이라는 생각이 들기는 한다.

하지만 가격이 횡보하는 구간에서는 이런 장점도 없을 수 있겠다.

어느 정도 효과가 있는지 알기 위해서 실시간 매매 코드로 만들어 실제 동작을 시켜볼 예정이며 그때 실시간 매매 코드에 대해 다시 정리해 보겠다.

 

끝으로 프로그래밍 전공자가 아니고 이러한 분야에 종사하는 사람도 아니므로 코드가 좀 허접할 수 있다는 점은 이해해 주었으면 합니다.

 

반응형

댓글