파이썬 바이낸스 API로 비트코인 시계열 데이터 분석 : 이동평균 수렴확산 (MACD)
파이썬 바이낸스 API를 이용하여 비트코인 투자 연습을 하면서 판다스를 익히는 중입니다. 이번 포스팅에서는 시계열 데이터 분석에 유용하게 활용되는 이동평균 수렴확산(MACD)에 대해 알아보겠습니다. MACD에서도 지수 이동평균을 구하는 파이썬 판다스 함수인 ewm()을 유심히 봐주시기 바랍니다.
글의 순서
가격 시계열 데이터 분석의 목적
이동평균 수렴확산(MACD)
MACD 신호선(MACD Signal) : MACD의 추세선
MACD를 이용한 매매 전략
파이썬 코드 : 파이썬 판다스를 이용한 비트코인 MACD선, 신호선
가격 시계열 데이터 분석의 목적
주가나 코인 가격이라는 시계열 데이터 분석의 목적은 매수, 매도 타이밍을 제대로 잡기 위해서입니다. 이동평균선 매매 기법에서 골든크로스, 데드크로스로 매수, 매도 타이밍을 잡듯이 MACD선을 이용한 매매 기법에서도 MACD선과 함께 사용하는 선이 있습니다. 바로 신호선입니다. 이동평균선 매매 기법에서와 마찬가지로 MACD선과 신호선의 교차점이 매매 지점입니다. MACD와 신호선이 각각 무엇을 의미하는지 알아보겠습니다.
이동평균 수렴확산(MACD)
이동평균 수렴확산을 나타내는 용어가 MACD입니다. MACD는 Moving Average Convergence, Divergence를 줄여쓴 말입니다. MACD선은 종가의 12일 지수 이동평균선에서 26일 지수 이동평균선을 뺀 것으로, 가격 변화를 빠르게 반영하는 편입니다. 12일, 26일 이라는 시간 간격은 각 개인이 시장을 보는 관점에 맞춰 조절 가능합니다.
이동평균 수렴확산(MACD) 신호선(MACD Signal) : MACD의 추세선
신호선은 MACD선의 9일 지수 이동평균을 구한 선입니다. MACD선 자체의 이동평균을 구한 것이기 때문에 MACD선의 추세를 나타냅니다. MACD선의 추세는 MACD 자체보다 가격 변화에 늦게 반응합니다.
이동평균 수렴확산 (MACD)를 이용한 매매 전략
이동평균선 매매 기법에서와 마찬가지로 MACD선과 신호선의 교차점이 매수 또는 매도 지점입니다.
빠른 MACD선이 늦은 신호선을 상향 돌파하는 것은 매수세가 시장을 주도한다는 뜻이므로, 매수 관점에서 대응하는 것이 좋습니다. 반대로 빠른 MACD 선이 늦은 신호선을 하향 돌파하는 것은 매도세가 시장을 주도한다는 것을 나타내므로 매도 관점에서 대응하는 것이 좋습니다.
파이썬 코드 : 파이썬 판다스를 이용한 비트코인 이동평균 수렴확산(MACD)선, 신호선
파이썬 바이낸스 API로 가져온 비트코인 시계열 데이터로 MACD선과 신호선을 파이썬 코드로 구현하였습니다. ohlcv라는 시계열 데이터를 가져오는 과정은 ‘함께 참고하면 좋은 글’에서 썼던 방법과 동일합니다.
판다스 열 연산(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 |
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-08 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() 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-08')) 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].set_ylim(-20, 120) axs[1].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-04-08')) 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.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 volume ema12 ema26 macd macd_signal 0 2022-12-01 09:00:00 17165.53 17324.00 16855.01 16977.37 232818.18218 16977.370000 16977.370000 0.000000 0.000000 1 2022-12-02 09:00:00 16978.00 17105.73 16787.85 17092.74 202372.20620 17039.862083 17037.273654 2.588429 1.438016 2 2022-12-03 09:00:00 17092.13 17188.98 16858.74 16885.20 154542.57306 16979.497436 16982.635067 -3.137630 -0.437249 3 2022-12-04 09:00:00 16885.20 17202.84 16878.25 17105.70 178619.13387 17019.334654 17017.038644 2.296010 0.488652 4 2022-12-05 09:00:00 17106.65 17424.25 16867.00 16966.35 233703.29225 17004.938913 17005.283738 -0.344826 0.240711 .. ... ... ... ... ... ... ... ... ... ... 124 2023-04-04 09:00:00 27800.00 28444.44 27662.79 28165.47 49722.55691 27791.277123 26747.502797 1043.774326 1151.308685 125 2023-04-05 09:00:00 28165.47 28775.00 27805.10 28170.01 60737.64732 27849.543720 26852.880178 996.663542 1120.379656 126 2023-04-06 09:00:00 28170.01 28182.05 27711.00 28033.82 40118.94963 27877.893917 26940.362180 937.531737 1083.810073 127 2023-04-07 09:00:00 28033.83 28100.00 27766.94 27906.33 24762.09387 27882.268699 27011.919122 870.349576 1041.117973 128 2023-04-08 09:00:00 27906.34 28154.99 27859.02 27938.38 19479.96735 27890.901207 27080.549203 810.352004 994.964779 |
마치며 …
이번 포스팅에서는 파이썬 바이낸스 API를 이용하여 비트코인의 MACD와 MACD Signal을 분석해보았습니다. 지수 이동평균을 구하는 파이썬 판다스 함수인 ewm()을 기반으로 구한 MACD와 MACD Signal로 시장의 흐름을 분석하는데 활용해 보시기 바랍니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 파이썬 바이낸스 API 시계열 데이터분석. 판다스 시간 처리
5. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
6. 시계열 데이터 분석 : 지수 이동평균 (EMA)
7. 파이썬 바이낸스 비트코인 투자 백테스팅 : 지수 이동평균선 매매 기법
8. API와 파이썬 데이터 분석
9. 파이썬 바이낸스 API로 비트코인 투자 백테스팅 : MACD 매매 전략
10. 바이낸스 비트코인 투자 백 테스팅. 파이썬 코인 투자 연습
11. 파이썬 프로그래밍 시작
참고자료
[1] python-binance Docs >> get_historical_klines
[2] 김황후(2020), 파이썬 증권 데이터 분석, 한빛미디어
쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.