파이썬 바이낸스 API로 비트코인 시계열 데이터 분석 : 이동평균 수렴확산 MACD 히스토그램
파이썬 바이낸스 API를 이용하여 비트코인 투자 연습을 하면서 판다스를 익히는 중입니다. 이번 포스팅에서는 MACD 히스토그램에 대해 알아보겠습니다. MACD히스토그램은 MACD와 MACD 신호선과의 차이인데, 매수, 매도 시점을 더 쉽게 파악할 수 있다는데 의의가 있습니다. 시계열 데이터 분석에 유용한 도구 하나를 추가해보시기 바랍니다.
글의 순서
이동평균 수렴확산(MACD)
이동평균 수렴확산, MACD 히스토그램
MACD 히스토그램에서 보는 매수 신호
파이썬 코드 : 파이썬 판다스를 이용한 비트코인 MACD, MACD히스토그램
이동평균 수렴확산(MACD)
이동평균 수렴확산을 의미하는 MACD는 Moving Average Convergence, Divergence를 줄여 쓴 말입니다. MACD선은 종가의 12일 지수 이동평균선에서 26일 지수 이동평균선을 뺀 것으로, 가격 변화를 빠르게 반영하는 편입니다. 12일, 26일 이라는 시간 간격은 각 개인이 시장을 보는 관점에 따라 조절할 수 있습니다.
이동평균 수렴확산 MACD 히스토그램
MACD 히스토그램은 MACD 보다 시장에서의 매수와 매도 상태를 잘 나타내줍니다. 매수세가 강한지, 매도세가 강한지를 보여주는데, MACD히스토그램으로부터 매수세나 매도세가 강해지고 있는지 약해지고 있는지 까지 확인할 수 있습니다.
MACD 히스토그램은 아래의 식으로 구합니다.
MACD 히스토그램 = MACD선 – 신호선
MACD 신호선은 MACD선의 지수 이동평균을 구한 선이기 때문에 MACD선의 추세를 나타냅니다. 당연히 MACD선의 추세는 MACD 자체보다 가격 변화에 늦게 반응합니다. MACD 히스토그램은 MACD와 MACD 신호선과의 차이이고, 차이가 0이라는 것은 두 선이 만난다는 의미입니다. 느린 추세와 빠른 추세선의 교점은 매수 또는 매도 신호를 나타내는데, MACD히스토그램에서 0이 되는 곳을 더 쉽게 관찰할 수 있다는데 의의가 있습니다.
MACD 히스토그램에서 보는 매수 신호
MACD 히스토그램이 중심선 아래에 있다가 기울기가 올라가면서 중심선 위를 올라갈 때를 매수 신호로 봅니다.
▶만약 가격이 신저점을 갱신했는데, MACD히스토그램이 저점에서 상승하기 시작한다면 시장은 매수세가 강세로 돌아섰다는 것을 나타냅니다.
▶반면 신저점을 갱신하면서 MACD히스토그램도 낮아지고 있다면 하향 추세 신호입니다.
파이썬 코드 : 파이썬 판다스를 이용한 비트코인 MACD, MACD 히스토그램
파이썬 바이낸스 API로 가져온 비트코인 시계열 데이터로 MACD 히스토그램을 구현하였습니다. 지난 포스팅에서 만든 파이썬 코드에 MACD 히스토그램을 추가했고, 실제로 그래프에 그릴 수 있도록 plt.bar() 함수를 사용했습니다.
판다스 열 연산(column operation)을 통해 지수 이동평균선을 구하는 과정, 지수 이동평균선으로부터 MACD와 MACD 히스토그램을 구하는 과정이 이 코드의 핵심입니다. MACD와 MACD 신호선, MACD 히스토그램을 한 눈에 보면서 매수, 매도 시점을 잡을 수 있을지를 상상해 보시기 바랍니다.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
import os import time import pandas as pd import numpy as np from binance.client import Client import datetime from datetime import datetime, timezone, timedelta import matplotlib.pyplot as plt #01) 바이낸스 계정 접속 api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) print('\n','[ BINANCE ACCOUNT ACCESSED ]') #02) 입력 : 시계열 데이터 수집 구간(tstt~tend), 시간 간격(t_interval) tstt_utc = '2022-12-01 00:00:00' tend_utc = '2023-04-10 23:59:59' t_interval = '1d' bars = client.get_historical_klines('BTCUSDT', t_interval, tstt_utc, tend_utc, limit=1000) #03) ohlcv 데이터만 추출 for i in bars: del i[6:] #04) 데이터프레임 열 이름 붙여주기 df = pd.DataFrame(bars, columns=['time_open','open','high','low','close','volume']) #05) 데이터프레임 열 type을 실수형으로 변환 df = df.astype({'open' : 'float', 'high' : 'float', 'low' : 'float', 'close' : 'float', 'volume' : 'float'}) print('\n','#05) ---') print(df.head(5)) #06) Date 열의 형태를 epoch에서 Pandas.Timestamp로 변경 df['time_open'] = df['time_open'].apply(lambda date: pd.Timestamp(time.ctime(date/1000.))) print('\n','#06) ---') print(df.head(5)) # ====== 판다스로 MACD 구현 ====== #07) 지수 이동평균선 : 12, 26일선 df['ema12'] = df['close'].ewm(span=12).mean() df['ema26'] = df['close'].ewm(span=26).mean() #08) 이동평균 수렴확산 (MACD, Moving Average Convergence, Divergence) df['macd'] = df['ema12'] - df['ema26'] df['macd_signal'] = df['macd'].ewm(span=9).mean() df['macd_hist'] = df['macd']-df['macd_signal'] print('\n','#08) ---') print(df) #09) 시계열 데이터 가시화 fig, axs = plt.subplots(2,1,figsize=(10,9)) axs[0].plot(df['time_open'],df['close'], label='close') axs[0].plot(df['time_open'],df['ema12'], 'm--', label='EMA12') axs[0].plot(df['time_open'],df['ema26'], 'g--', label='EMA26') axs[0].set_title('BTC ') axs[0].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-04-10')) axs[0].set_ylabel('Price (USDT)') axs[0].legend(loc='best') axs[0].tick_params(axis='x', rotation=15) axs[0].grid(True) axs[1].plot(df['time_open'],df['macd'], 'm', label='MACD') axs[1].plot(df['time_open'],df['macd_signal'], 'g',label='MACD_Signal') axs[1].plot(df['time_open'],df['macd_hist'], 'b',label='MACD-Histogram') axs[1].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-04-10')) axs[1].legend(loc='best') axs[1].tick_params(axis='x', rotation=15) axs[1].grid(True) #10) 차트를 그림파일로 저장 file_path = 'C:/_python/pandas/technical_analysis/' plt.savefig(file_path +'MACD_histogram.png', dpi=200) plt.show() |
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 30 31 |
[ BINANCE ACCOUNT ACCESSED ] #05) --- time_open open high low close volume 0 1669852800000 17165.53 17324.00 16855.01 16977.37 232818.18218 1 1669939200000 16978.00 17105.73 16787.85 17092.74 202372.20620 2 1670025600000 17092.13 17188.98 16858.74 16885.20 154542.57306 3 1670112000000 16885.20 17202.84 16878.25 17105.70 178619.13387 4 1670198400000 17106.65 17424.25 16867.00 16966.35 233703.29225 #06) --- time_open open high low close volume 0 2022-12-01 09:00:00 17165.53 17324.00 16855.01 16977.37 232818.18218 1 2022-12-02 09:00:00 16978.00 17105.73 16787.85 17092.74 202372.20620 2 2022-12-03 09:00:00 17092.13 17188.98 16858.74 16885.20 154542.57306 3 2022-12-04 09:00:00 16885.20 17202.84 16878.25 17105.70 178619.13387 4 2022-12-05 09:00:00 17106.65 17424.25 16867.00 16966.35 233703.29225 #08) --- time_open open high low close ... ema12 ema26 macd macd_signal macd_hist 0 2022-12-01 09:00:00 17165.53 17324.00 16855.01 16977.37 ... 16977.370000 16977.370000 0.000000 0.000000 0.000000 1 2022-12-02 09:00:00 16978.00 17105.73 16787.85 17092.74 ... 17039.862083 17037.273654 2.588429 1.438016 1.150413 2 2022-12-03 09:00:00 17092.13 17188.98 16858.74 16885.20 ... 16979.497436 16982.635067 -3.137630 -0.437249 -2.700381 3 2022-12-04 09:00:00 16885.20 17202.84 16878.25 17105.70 ... 17019.334654 17017.038644 2.296010 0.488652 1.807358 4 2022-12-05 09:00:00 17106.65 17424.25 16867.00 16966.35 ... 17004.938913 17005.283738 -0.344826 0.240711 -0.585537 .. ... ... ... ... ... ... ... ... ... ... ... 126 2023-04-06 09:00:00 28170.01 28182.05 27711.00 28033.82 ... 27877.893917 26940.362180 937.531737 1083.810073 -146.278336 127 2023-04-07 09:00:00 28033.83 28100.00 27766.94 27906.33 ... 27882.268699 27011.919122 870.349576 1041.117973 -170.768397 128 2023-04-08 09:00:00 27906.34 28154.99 27859.02 27938.38 ... 27890.901207 27080.549203 810.352004 994.964779 -184.612775 129 2023-04-09 09:00:00 27938.38 28530.00 27800.00 28323.76 ... 27957.494867 27172.643052 784.851815 952.942187 -168.090371 130 2023-04-10 09:00:00 28323.76 29770.00 28170.00 29637.34 ... 28215.932580 27355.220833 860.711747 934.496099 -73.784352 |
마치며 …
이번 포스팅에서는 파이썬 바이낸스 API를 이용하여 비트코인의 MACD 히스토그램을 구해보았습니다. MACD 히스토그램은 MACD와 MACD Signal의 차를 나타내며, 매수, 매도 시점을 좀더 직관적으로 확인할 수 있습니다.
지수 이동평균을 구하는 파이썬 판다스 함수인 ewm()을 기반으로 구한 MACD와 MACD Signal, MACD 히스토그램으로 시장의 흐름을 파악해보시기 바랍니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 파이썬 바이낸스 API 시계열 데이터분석. 판다스 시간 처리
5. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
6. 시계열 데이터 분석 : 지수 이동평균 (EMA)
7. 파이썬 바이낸스 비트코인 투자 백테스팅 : 지수 이동평균선 매매 기법
8. 파이썬 바이낸스 API로 비트코인 시계열 데이터 분석 : 이동평균 수렴확산 (MACD)
9. 시계열 데이터 전처리 결과 확인 : pandas DataFrame
10. 바이낸스 비트코인 투자 백 테스팅. 파이썬 코인 투자 연습
11. 파이썬 프로그래밍 시작
참고자료
[1] python-binance Docs >> get_historical_klines
[2] 김황후(2020), 파이썬 증권 데이터 분석, 한빛미디어
쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.