안녕하세요. 암호화폐 2억 달러 숏 물량 청산 기념으로 글을 하나 써보려고 합니다. 평소에 시간 있을 때 구현해보고 싶었던 내용이었는데 이번 글에서 구현해보고자 합니다. 이 글 기준에서는 사전에 업비트 API를 발급받아 데이터를 불러오는데, 다른 자산군에 대해 활용하여도 괜찮습니다. 그럼 시작해 보겠습니다.
- 암호화폐 데이터 부르는 것 부터 시작하기 위해서는 아래 글들을 참고하시면 됩니다.
2022.06.12 - [Programming/Crypto] - 업비트(Upbit) API Key 발급하기
2022.06.12 - [Programming/Crypto] - pyupbit 소개 및 설치
2022.07.01 - [Programming/Crypto] - pyupbit 활용 - 암호화폐 데이터 부르기
하이킨아시(Heikin-Ashi) 정의
하이킨아시(Heikin-Ashi)는 지표라기보다는 매매 시 판단하는 데 있어 도구로 알려져 있습니다. 이름에서 알 수 있듯이 일본에서 트레이딩 도구로 탄생하였습니다. 생각보다 사람들이 많이 활용 안하는 것 같다는 생각이 드는데, 제 생각에는 노이즈를 어느 정도 필터링하여 주는 좋은 도구라고 생각합니다. 그 이유는 시장에 대한 평균과 중간 값들을 제시하기 때문입니다.
아래 공식에서 알 수 있듯이 캔들의 값들을 바탕으로 통계를 바탕으로 산출 하였음을 알 수 있습니다.
하이킨아시(Heikin-Ashi) 간단 설명
공식에 대해서 하나하나 뜯어보는 것은 이 글의 범위를 벗어나기 때문에 간단하게 정리하면 다음과 같습니다.
1. 매매지표보다는 도구에 가깝다.
2. 추세를 단순화 해서 볼 수 있다. 장점으로는 직관적이고 단순하게 매매를 할 때, 원칙대로 매매하기 좋다고 알려져 있습니다. 아래 그림은 S&P 500 캔들 차트와 하이킨아시 비교 그림 예시입니다.
얼핏 보면 양봉의 연속, 음봉의 연속으로 나열된 것을 볼 수 있기 때문에 쉽고 직관적으로 판단이 가능합니다. 또한 캔들이 음봉이어도 하이킨아시에서는 양봉이 될 수 있고 그 반대도 가능합니다.
3. 단점으로는 횡보 구간에서는 캔들이 너저분해져서 조금 어려울 수 있습니다.
매매 방법은 구글링 해보면 많이 나타나는데 여기 글이 깔끔하게 잘 설명한 것 같습니다.
https://creativestudio.kr/2266
Python으로 암호화폐 데이터 부르기
원화 기준 비트코인 일봉을 부르도록 하겠습니다. 기존에 API를 받아온 Key 값들을 저장한 것을 활용합니다.
import pickle
import pyupbit
with open('./keypair/upbit_secret_key.pkl', 'rb') as k:
secret_key = pickle.load(k)
upbit = pyupbit.Upbit(secret_key['access key'], secret_key['secret key'])
df = pyupbit.get_ohlcv('KRW-BTC',
interval = "day",
count = 100,
to = '20230114 00:00:00',
period = 0.1)
df.columns = [i.title() for i in df.columns.tolist()] # 편의상 컬럼명 앞에만 대문자로 변경
df
차트도 한번 똑같은지 확인해 봅니다.
from mpl_finance import candlestick2_ohlc
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
from IPython.display import display
index = [i[0:10] for i in df.index.astype('str')] # 캔들스틱 x축이 str로 들어감
fig = plt.figure(figsize=(20,10))
top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4, sharex=top_axes)
bottom_axes.get_yaxis().get_major_formatter().set_scientific(False)
# 캔들차트 그리기
candlestick2_ohlc(top_axes, df['Open'], df['High'],
df['Low'], df['Close'],
width=0.5, colorup='r', colordown='b')
# 거래량
color_fuc = lambda x : 'r' if x >= 0 else 'b'
color_list = list(df['Volume'].diff().fillna(0).apply(color_fuc))
bottom_axes.bar(index, df['Volume'], width=0.5,
align='center',
color=color_list)
# 그래프 title 지정
top_axes.set_title('BTC/KRW', fontsize=22)
# X축 티커 숫자 제한
top_axes.xaxis.set_major_locator(ticker.MaxNLocator(13))
# X축 라벨 지정
bottom_axes.set_xlabel('Date', fontsize=15)
# ax.legend()
plt.grid()
plt.show()
차트를 그리는 코드를 Run 했을 때 그림은 다음과 같습니다.
업비트 그림과 유사한지 확인해 보면 같음을 알 수 있습니다.
Python으로 하이킨아시(Heikin-Ashi) 구현하기
위에 언급한 공식에 따라 구현하면 간단하게 적용이 가능합니다. 3개의 과정으로 나누어져 있습니다. 종가, 시가를 Step 1, 2에서 계산하고 join을 이용하여 하이킨아시의 고가와 저가를 계산합니다.
import pandas as pd
df_ha = df.copy()[['Open', 'High', 'Low', 'Close']] # ohlc 값 들고옴
# Step 1: Heikin Ashi 종가 계산
df_ha['Close'] = ((df['Open'] + df['High'] + df['Low'] + df['Close'])/4)
# Step 2: Heikin Ashi 시가 계산
for i in range(len(df)):
if i == 0:
df_ha.iat[0,0] = ((df['Open'].iloc[0] + df['Close'].iloc[0])/2)
else:
df_ha.iat[i,0] = ((df_ha.iat[i-1,0] + df_ha.iat[i-1,3])/2)
# Step 3: Heikin Ashi 고/저가 계산
df_ha['High'] = df_ha.loc[:,['Open', 'Close']].join(df['High']).max(axis=1)
df_ha['Low'] = df_ha.loc[:,['Open', 'Close']].join(df['Low']).min(axis=1)
차트도 한번 똑같은지 확인해 봅니다.
fig = plt.figure(figsize=(20,10))
top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4, sharex=top_axes)
bottom_axes.get_yaxis().get_major_formatter().set_scientific(False)
# 캔들차트 그리기
candlestick2_ohlc(top_axes, df_ha['Open'], df_ha['High'],
df_ha['Low'], df_ha['Close'],
width=0.5, colorup='r', colordown='b')
# 거래량
color_fuc = lambda x : 'r' if x >= 0 else 'b'
color_list = list(df['Volume'].diff().fillna(0).apply(color_fuc))
bottom_axes.bar(index, df['Volume'], width=0.5,
align='center',
color=color_list)
# 그래프 title 지정
top_axes.set_title('BTC/KRW Heikin Ashi', fontsize=22)
# X축 티커 숫자 제한
top_axes.xaxis.set_major_locator(ticker.MaxNLocator(13))
# X축 라벨 지정
bottom_axes.set_xlabel('Date', fontsize=15)
# ax.legend()
plt.grid()
plt.show()
차트를 그리는 코드를 Run 했을 때 그림은 다음과 같습니다.
업비트 그림과 유사한지 확인해 보면 같음을 알 수 있습니다.
그림만 유사하다고 값을 확인 및 검증을 하지 않으면 위험합니다. 구현한 코드에서 값을 비교해 보면 똑같음을 알 수 있었습니다. 아래 업비트에서 하이킨아시 캔들(1월 13일 9시 가격) ohlc 값이고, 실제 값과 똑같았습니다.
마무리 & Reference
시스템 매매 시나리오 각본을 쓰시고 활용하는 것은 독자 분들의 몫입니다. 돈복사기 마법의 지표와 도구는 없지만, 하이킨아시를 활용해서 조금이라도 추세 매매를 하는데 도움이 되실 겁니다.
개인적인 경험 조금 알려드리면 타임프레임을 짧게 하여 하이킨아시 캔들이 음봉에서 양봉이 되었다고 바로 매수하는 전략보다는 조금 다른 조건을 부여해서 활용하는 것을 추천드리고 싶습니다. 자금 관리 잘 하시면서 성투 바라겠습니다.
https://creativestudio.kr/2266
https://tradewithpython.com/constructing-heikin-ashi-candlesticks-using-python
(3번째 레퍼런스는 하이킨아시의 고/저가 계산하는 부분이 누락되어 있습니다.)
아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 도움되거나 흡족스러웠다면 후원해주시면 감사하겠습니다.
'Programming > Crypto' 카테고리의 다른 글
Binance API와 ccxt를 활용한 롱/숏 포지션 잡기 (4) | 2022.09.26 |
---|---|
Binance API와 ccxt를 활용한 선물 계좌 조회 및 선물 거래 시작하기 (0) | 2022.09.19 |
바이낸스 암호화폐 데이터 부르기 (ccxt를 활용한 binance 암호화폐 데이터 부르기) (7) | 2022.09.06 |
바이낸스(Binance) API Key 발급하기 (0) | 2022.09.02 |
Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) (2) | 2022.08.27 |