지금까지 개발환경을 구축하고, 거래소 API를 통해 가격정보를 조회해 오는 것을 알아보았습니다.
이전 포스팅을 보시지 않으셨다면 아래 링크를 통해 보고 오시는 것을 추천드립니다.
코인 자동매매 프로그램 만들기 : 거래소 API 활용하기
이번 포스팅에는 CCXT 및 거래소 API를 활용하여 캔들 정보 및 가격정보를 조회하는 부분을 말씀드리고자 합니다.API는 버전에 따라 사용법이 달라질 수 있습니다. 만약 본 포스팅과 API사용법이
technyang.tistory.com
다음은 이러한 정보를 바탕으로 기술적 지표를 만들어보는 시간을 갖도록 하겠습니다.
기술적 분석을 위한 talib 라이브러리 설치하기
주식과 암호화폐와 같은 투자시장에는 RSI, 볼린저밴드, 스토캐스틱, MACD 다양한 전략이 존재하는데요.
이러한 전략들을 하나하나 만들기에는 어렵거나 혹은 번거로울 뿐만 아니라 시간도 많이 소비가 됩니다.
이러한 기술적 분석 방법을 한곳에 모아놓은 것이 바로 talib라는 라이브러리입니다.
만약 여러분의 컴퓨터가 리눅스 환경이라면 pip install ta-lib명령어를 통해 설치할 수 있습니다.
하지만 많은 분들은 윈도우를 사용하고 계시죠? 윈도우에서는 위 명령어로 설치하면 설치가 안 되는 경우가 발생합니다. 그래서 설치가 정상적으로 되지 않을 때 사용할 수 있는 방법을 말씀드리고자 합니다.
만약 여러분의 컴퓨터에 설치된 파이썬이 3.6 이상이고 윈도우 64비트일 경우 아래 방법을 추천합니다.
아나콘다 커맨드창에 아래에 있는 명령어를 입력하여 설치하세요.
pip install -i https://pypi.anaconda.org/masdeseiscaracteres/simple ta-lib
위 방법으로 정상적으로 설치가 되지 않는다면 이 방법으로 해보세요.
- https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib에서 자신의 파이썬 버전에 맞는 파일을 다운로드하시고 아나콘다가 설치된 폴더로 파일을 옮겨주세요. Anaconda Prompt실행 시 (base) C:\Users\user> 이렇게 확인이 된다면 C:\Users\user폴더에 옮겨주시면 됩니다.
(예: 파이썬 3.6, 운영체제가 64비트일 경우 TA_Lib‑0.4.19‑cp36‑cp36m‑win_amd64.whl를 다운로드합니다.) - 아나콘다 커맨드 창에서 pip install 명령어를 통해 설치합니다.
pip install TA_Lib-0.4.19-cp36-cp36m-win_amd64.whl
볼린저 밴드(Bollinger Bands) 구현하기
기술적 분석을 위한 환경을 세팅하시느라 수고 많으셨습니다.
이제 본격적으로 TA-LIB모듈을 이용하여 많이 쓰이고 유명한 기술적 분석 기법들을 구현해 보겠습니다.
그중 첫 번째로 다들 들어보셨을 볼린저 밴드를 구현하겠습니다.
볼린저 밴드는 존 볼린저가 1980년대에 개발한 기술적 분석 도구입니다.
20일 이동평균선을 기준으로 현재 주가가 어느 위치에 있는지를 측정하기 위한 도구입니다.
볼린저 밴드 값은 아래와 같이 구할 수 있습니다.
df = getCandleStick(‘XRP/KRW’, ‘5m’) #리플 5분봉 조회
upper, middle, lower = talib.BBANDS(df['close'], 20, 2) # 종가, 기간, 승수
볼린저밴드의 상한선(upper)과 중간선(middle), 하한선(lower) 값을 확인해 보겠습니다.
가장 아래의 DATA가 최신 DATA이므로 현재 볼린저 밴드의 상한선과, 중간선, 하한선은 각각 522.954066, 520.80, 518.645934입니다. 실제로 맞는 값인지 거래소의 화면을 확인해 보겠습니다.
보시는 바와 같이 일치함을 알 수 있습니다.
우리는 볼린저 밴드를 통해 % B를 계산할 수 있습니다. % B지표는 현재의 가격이 볼린저밴드의 어느 곳에 위치하고 있는지를 알 수 있습니다.
B = (현재가 - 하한가) / (상한가 - 하한가)
볼린저 밴드의 창시자인 ‘존 볼린저’의 저서 『볼린저 밴드 투자 법』에는 몇 가지 지표를 활용한 전략이 소개되는데요.
그중 하나가 바로 % B와 다음에 소개될 MFI 지표를 사용하여 추세추종 전략을 펼칠 수 있습니다.
MFI (Money Flow Index)
MFI는 가격과 거래량을 사용하여 현재 종목이 과매도인지 과매수인지를 식별하는 지표입니다.
이것만 보면 상대강도지수인 RSI와 유사하다고 생각하실 것입니다.
그런데 여기 중요한 차이가 있습니다. MFI는 RSI와 달리 거래량을 사용합니다. ‘
존 볼린저’의 저서에서도 추세를 확증하는 데에는 % B 뿐만 아니라 MFI을 사용해야 한다고 나와있습니다.
MFI값을 구하기 위해서는 고가, 저가, 종가, 거래량, 기간이 필요하며 호출방법은 아래와 같습니다.
df = getCandleStick(‘XRP/KRW’, ‘5m’) #리플 5분봉 조회
mfi = talib.MFI(df['high'], df['low'], df['close'], df['volume'], 20)
MFI값은 실시간으로 변동이 되다 보니, 거래소에서 확인되는 MFI와 코드를 실행했을 때의 MFI의 차이가 있다는 점 참고해 주세요.
MFI의 기간 기본값은 20입니다. 하지만 % B와 결합하여 사용 시에는 볼린저 밴드 기간의 반을 추천한다고 합니다.
예를 들어 볼린저 밴드의 기간을 20으로 설정했을 경우 MFI의 기간은 10이 되는 것입니다.
볼린저 밴드의 % B와 MFI를 사용한 매매기법은 다음과 같습니다.
볼린저밴드 %B | MFI | |
매수 | 80% 이상 | 80 이상 |
매도 | 20% 이하 | 20 이하 |
볼린저 밴드 % B의 매수/매도 시그널을 받아오는 함수를 작성해 보겠습니다.
편의상 매수 시그널은 1, 매도 시그널은 -1, 관망은 0으로 정하겠습니다.
이 부분은 여러분께서 편하신 방법으로 바꾸셔도 됩니다.
볼린저밴드 매수, 매도 시그널 함수
def getBBSignal(ticker):
df = getCandleStick(ticker, '5m') #가상화폐의 5분봉 DATA를 조회.
curPrice = exchange.fetch_ticker(ticker)['close']
upper, middle, lower = talib.BBANDS(df['close'], 20, 2, 2) #볼린저 밴드
b = ((curPrice - lower.iloc[-1]) / (upper.iloc[-1] - lower.iloc[-1])) * 100
if b >= 80 :
return 1 # 매수
elif b <= 20:
return -1 # 매도
else:
return 0 # 관망
MFI 매수, 매도 시그널 함수
def getMFISignal(ticker):
df = getCandleStick(ticker, '5m') #가상화폐의 5분봉 DATA를 조회.
mfi = talib.MFI(df['high'], df['low'], df['close'], df['volume'], 10)
nowMFI = mfi.iloc[-1] # 가장 최신의 MFI값을 가져옴.
if nowMFI >= 80.0:
return 1
elif nowMFI <= 20:
return -1
else:
return 0
RSI (Relative Strength Index) 구하기
RSI는 상대강도 지수의 준말로서, 가격의 상승압력과 하락압력 간의 상대적인 강도를 나타냈으며, 1978년 미국의 ‘월레스 와일더’가 개발했습니다.
RSI는 주가의 변화량을 통해 상승한 변화량이 크면 과매수로, 하락한 변화량이 크면 과매도로 판단합니다.
보통 널리 알려진 수치는 RSI가 70% 이상이면 과매수, 30% 이하이면 과매도로 판단을 합니다.
그래서 RSI가 70% 이상이면 매도 포지션을 준비하고, 30% 이하면 매수포지션을 준비합니다.
RSI의 기간은 보통 14일을 사용하며 대체로 9일, 14 ~ 15일, 25 ~ 28일을 사용한다고 합니다. RSI를 구하는 코드는 아래와 같습니다.
rsi14 = talib.RSI(df['close'], 14)
거래소의 RSI값과 코드를 통해 구한 RSI값이 거의 일치함을 볼 수 있습니다.
이를 토대로 RSI 매수, 매도 시그널을 구하는 함수를 작성해 보면 이렇습니다.
RSI 매수, 매도 시그널
def getRSISignal(ticker):
df = getCandleStick(ticker, '5m')
rsi14 = talib.RSI(df['close'], 14)
nowRsi = rsi14.iloc[-1] #가장 최근의 RSI값
if nowRsi <= 30.0: # 과매도
return 1 # 매수 시그널
elif nowRsi >= 70.0: #과매수
return -1 # 매도 시그널
else:
return 0
MACD(Moving Average Convergence Divergence) 구하기
MACD는 이동평균선간의 차이를 이용하여 매수, 매도 시그널을 포착하는 기법입니다.
MACD에는 2개의 곡선이 존재하는데요.
하나는 장기 지수이동평균선과 단기 지수이동평균선의 벌어진 차이를 계산하여 작성된 MACD.
그리고 이 MACD를 다시 지수이동평균으로 계산한 곡선이 MACD Signal입니다.
MACD를 활용하여 매수, 매도 시점을 포착하는 기준은 다음과 같습니다.
MACD | |
매수 | ① MACD가 0선을 상향돌파한다. (상승국면) ② MACD가 시그널을 상향돌파(골든크로스) 한다. |
매도 | ① MACD가 0선을 하향돌파한다. (하강국면) ② MACD가 시그널을 하향돌파(데드크로스) 한다. |
MACD는 기본적으로 단기는 12일 이평선을 사용하고, 장기는 26일 이평선을 사용합니다.
그리고 시그널은 MACD의 9일 이평선을 사용합니다.
그럼 이를 토대로 파이썬을 이용해 MACD값을 구해보겠습니다.
macd, macdSignal, macdHist = talib.MACD(df['close'], 12, 26, 9)
결괏값으로 3개의 값을 받으나, 우리는 macd, macdSignal만을 사용하겠습니다.
그리고 실제 값과 거래소에서 확인되는 MACD의 값을 확인해 보겠습니다.
왼쪽 차트에서 검은선이 MACD, 붉은 선이 MACD 시그널을 나타냅니다.
위에 나온 매수, 매도 포착 기준의 골든크로스 및 데드크로스 코드를 이용하여 MACD 시그널을 구하는 함수를 작성해 보겠습니다.
MACD 매수, 매도 시그널
def getMACDSignal(ticker):
df = getCandleStick(ticker, '5m')
macd, macdSignal, macdHist = talib.MACD(df['close'], 12, 26, 9)
if macd.iloc[-1] >= macdSignal.iloc[-1] and macd.iloc[-2] < macdSignal.iloc[-2]: #매수 시그널
return 1
elif macd.iloc[-1] <= macdSignal.iloc[-1] and macd.iloc[-2] > macdSignal.iloc[-2]: #매도 시그널
return -1
else:
return 0
이 부분은 추가적인 설명이 필요할 것 같습니다.
차트정보를 가져오는 getCandelStick메서드는 내림차순 정렬 형태로 차트정보를 줍니다.
즉, 가장 최신의 정보는 가장 아래(마지막)에 있습니다.
파이썬에서 제공하는 리스트는 가장 마지막의 데이터를 접근할 때 -1을 사용합니다.
그리고 그전(前) 데이터에 접근하려면 -2를 사용하죠.
if구문을 보면 가장 최근의 MACD값(macd.iloc[-1)이 시그널(macdSignal.iloc[-1])값보다 같거나 위에 있다.
즉, 접하였거나 위에 있다를 뜻 합니다.
그리고 바로 전(前)에는 MACD값이 시그널 값보다 작다. 즉, 아래에 있었다를 뜻하게 되는 것입니다.
매도기준인 데드크로스는 위 골든크로스와 반대로 코드를 작성하면 됩니다.
아래 캡처화면은 위 골든크로스와 데드크로스 코드에 잡힌 종목의 지표화면입니다.
MACD 골든크로스
MACD 데드크로스
마무리
이번 포스트에는 유명한 기술적 지표인 볼린저 밴드와 RSI, 그리고 MACD를 구현하는 법과 매수, 매도 타이밍에 대해 알아보았습니다.
다음 포스팅에는 스토캐스틱, 단순 이동평균선, 일목균형표를 구현하는 법을 알아보도록 하겠습니다.
감사합니다.
'토이 프로젝트 > 암호화폐 자동거래 봇(Bot) 만들기' 카테고리의 다른 글
파이썬 코인 자동매매 프로그램 만들기 : 청산기법 및 매수 매도 구현 (1) | 2024.10.25 |
---|---|
파이썬 코인 자동매매 프로그램 만들기 : 스토캐스틱, 이동평균선, 일목균형표 구현하기 (0) | 2024.10.22 |
코인 자동매매 프로그램 만들기 : 거래소 API 활용하기 (0) | 2024.10.14 |
코인 자동매매 프로그램 만들기 : 파이썬으로 환경구축하기 (2) | 2024.10.12 |