바이낸스 API, 판다스로 시계열 데이터 분석. 현금흐름지수 MFI
파이썬 바이낸스 API로 시계열 데이터 분석 중입니다. 볼린저 밴드와 %b, Bandwidth라는 볼린저 밴드 지표를 구했던 지난 포스팅에 이어, 이번에는 현금흐름지수(MFI, Money Flow Index)를 알아보겠습니다. %b와 MFI를 함께 비교해 보시기 바랍니다.
글의 순서
시계열 데이터 분석 : 현금흐름지수 (MFI, Money Flow Index)
시계열 데이터 분석 : 상대강도지수(RSI) vs. 현금흐름지수(MFI)
MFI(현금흐름지수) 계산 방법
MFI 활용 방법
%b, MFI 동시 활용 방법
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 현금흐름지수(MFI) 구하기
시계열 데이터 분석 : 현금흐름지수 (MFI, Money Flow Index)
주식 가격이나 코인 가격의 종료가가 아니라 중심가격에 거래량을 곱한 값이 바로 현금흐름입니다. 여기서, 중심가격은 거래가 집중적으로 발생하는 지점을 알기 위한 가격으로, 일정 기간 동안의 최고가, 최저가, 종료가의 평균을 의미합니다. 참고로 영어로는 중심가격을 Typical Price, 현금흐름을 Money Flow 라고 부릅니다.
현금흐름지표(MFI)는 가격과 거래량을 동시에 볼 수 있다는 장점이 있습니다. 일반적으로 거래량이 증가한 후에 가격에 변동이 생기기 때문에 거래량이 가격의 선행 지표이기도 합니다. MFI는 가격이 상승한 날 동안의 현금 흐름의 합과 하락한 날 동안의 현금 흐름 합을 이용합니다. 상승한 날들 동안의 현금 흐름을 ‘긍정적 현금 흐름’이라고 하고, 하락한 날들 동안의 현금 흐름을 ‘부정적 현금 흐름’이라고 부릅니다.
시계열 데이터 분석 : 상대강도지수(RSI) vs. 현금흐름지수(MFI)
(1) 상대강도지수(RSI, Relative Strength Index)
RSI(Relative Strength Index)는 일정 기간 동안 주가가 전일 가격에 비해 상승했는지, 하락했는지의 추세를 0 ~ 100의 퍼센트 수치로 나타낸 지표입니다. RSI는 현재가 과매수 상태인지, 과매도 상태인지를 알려줍니다. 여기서, 과매수란 주가 폭등으로 투자자들이 주식을 적정 수준 이상으로 매수하는 현상을 말합니다. 상승한 변화량이 크면 과매수로, 하락한 변화량이 크면 과매도로 판단하는 방식입니다. 보통 RSI 퍼센트 수치로는 30이하면 과매도, 70 이상이면 과매수로 해석합니다.
(2) 현금흐름지수(MFI, Money Flow Index)
MFI(Money Flow Index)는 거래량 데이터에 상대강도지수 개념을 도입한 지표라고 할 수 있습니다. 일정 기간 동안 주가가 전일에 비해 상승했을 때 현금 흐름의 합과 하락했을 때 현금 흐름의 합을 이용합니다.
MFI(현금흐름지수) 계산 방법
주가를 기준으로 한다면 하루 단위로 시간 간격을 정하는 것이 일반적이지만, 코인 가격의 경우, 하루가 아니라 1분, 1시간, 1주 등 다양하게 적용할 수 있습니다.
우리가 정한 기간에서 가격이 상승한 날의 상승분을 Up, 가격이 하락한 날의 하락분을 Down이라고 해보겠습니다. 상승분 Up 값의 n일 동안의 평균을 AU, 하락분 Down 값의 n일 동안의 평균을 AD하고 하면, AU와 AD의 비율을 상대강도라고 정의합니다. 상대강도가 크다는 것은 상승폭이 크다는 것을 의미합니다.
MFI 계산방법을 정리해보겠습니다.
step1) 기간 선정 : n일
step2) 상승한 날들의 현금 흐름의 합 SMF_P 구하기 (SMF_P : Sum of Positive Money Flow)
step3) 하락한 날들의 현금 흐름의 합 SMF_N 구하기 (SMF_N : Sum of Negative Money Flow)
step4) 현금흐름비율 MFR = SMF_P/SMF_N 구하기
step5) MFI = 100 – (100 / (1+MFR))
MFI 활용 방법
MFI 값은 0~100 사이에 있습니다. MFI가 80 이상이면 아주 강력한 매수 신호를 나타내고, 20 이하이면 강력한 매도 신호를 나타냅니다. 80 이하였다가 80 위로 올라가는 순간과 20 이상이었다가 20 아래로 내려가는 시점을 포착하는 것이 중요합니다.
%b, MFI 동시 활용 방법
MFI를 %b와 함께 나타냈을 때, 매수와 매도 시점을 좀 더 정확하게 파악할 수 있습니다.
▶ 매수
주가가 상단밴드에 접근해 있고, 현금흐름지수가 강세를 나타낼 때 매수합니다. 예를 들어, %b가 0.8보다 크고, MFI가 80% 보다 클 때 매수합니다.
▶ 매도
주가가 하단밴드에 접근해 있고, 현금흐름지수가 약세를 나타낼 때 매도 합니다. 예를 들어, %b가 0.2보다 작고, MFI가 20% 보다 작을 때 매도합니다.
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 현금흐름지수(MFI) 구하기
판다스 열 연산(column operation)을 통해 현금흐름지수를 구하는 실습코드를 아래에 나타내었습니다. 파이썬 바이낸스 API로 비트코인 시계열 데이터를 가져오고, 판다스 데이터프레임 변수에 담는 것 까지는 지금까지의 포스팅과 동일합니다. %b와 MFI를 하나의 그래프에서 비교하기 위해 %b에 100을 곱했습니다. 중요한 것은 두 지표로 매수, 매도 시점을 잡을 수 있을지를 상상해 보는 것입니다.
판다스 데이터프레임에서 유용하게 쓰이는 함수인 np.where(), rolling(window).mean(), rolling(window).sum()의 활용법을 확인해 주시기 바랍니다. 또한, 종이 한 장에 그래프 세 개를 나란히 넣기 위해 fig, axs를 지정하는 부분과 x축의 날짜 범위를 맞추기 위해 numpy를 사용한 부분은 시계열 데이터 분석에서 자주 활용되는 중요한 부분입니다.
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
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-02-28 23:59:59' t_interval = '4h' #03) 파이썬 바이낸스 API로 비트코인 가격 데이터 가져오기 bars = client.get_historical_klines('BTCUSDT', t_interval, tstt_utc, tend_utc, limit=1000) #03-1) 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'}) #06) Date 열의 형태를 epoch에서 Pandas.Timestamp로 변경 df['time_open'] = df['time_open'].apply(lambda date: pd.Timestamp(time.ctime(date/1000.))) # ====== 판다스 시계열 데이터 분석 : 현금흐름지수(MFI, Money Flow Index) ====== #07-1) 시간 간격 개수 설정 : window 만큼 window = 20 #07-2) window 만큼의 시간 간격 기준 이동평균선 df['sma'] = df['close'].rolling(window).mean() #07-3) window 만큼의 시간 간격 기준 표준편차 df['stddev'] = df['close'].rolling(window).std() #07-4) 볼린저 밴드 : 상단(upper) ~ 하단(lower) df['upper'] = df['sma'] + ( 2.0 * df['stddev']) df['lower'] = df['sma'] - ( 2.0 * df['stddev']) #07-5) 볼린저 밴드 지표 : %b df['pb'] = (df['close']-df['lower'])/(df['upper']-df['lower']) #07-6) 볼린저 밴드 지표 : 밴드폭(Bandwidth) df['bandwidth'] = (df['upper']-df['lower'])/df['sma'] * 100. print('\n','#07) ---') print(df.tail(10)) #08) 현금흐름지수(MFI, Money Flow Index) #08-1) 중심가격 : Typical Price df['tp']=(df['high'] + df['low'] + df['close'])/3.0 #08-2) 상승, 하락 구분을 위한 기준값 df['close_bef'] = df['close'].shift(1) df['updown'] = df['close'] - df['close_bef'] #08-3) 상승, 하락 구분 :: Sum of Positive Money Flow, Sum of Negative Money Flow df['SMF_P'] = np.where(df['updown'] > 0.0, df['tp']*df['volume'], 0) df['SMF_N'] = np.where(df['updown'] > 0.0, 0, df['tp']*df['volume']) #08-4) 현금 흐름 비율 : MFR(Money Flow Ratio) df['MFR'] = df['SMF_P'].rolling(window).sum() / df['SMF_N'].rolling(window).sum() #08-5) 현금 흐름 지수 : MFI (Money Flow Index) df['MFI'] = 100 - 100/(1+df['MFR']) print('\n','#08) ---') print(df.tail(10)) #08) 시계열 데이터 가시화 : 비트코인 볼린저 밴드 #08-1) 볼린저 밴드 : 회색영역으로 표시 --> fill_between file_path = 'C:/_python/pandas/technical_analysis/' fig, axs = plt.subplots(3,1,figsize=(10,9)) axs[0].plot(df['time_open'],df['close'], label='close') axs[0].plot(df['time_open'],df['upper'], 'r--', label='upper band') axs[0].plot(df['time_open'],df['sma'], 'k--', label='SMA20') axs[0].plot(df['time_open'],df['lower'], 'c--', label='lower band') axs[0].fill_between(df['time_open'],df['upper'],df['lower'], color='0.9') axs[0].set_title('BTC Price(4h) & Bollinger Band(20*4h, 2 Std.Dev.)') axs[0].set_ylabel('Price (USDT)') axs[0].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-03-01')) axs[0].legend(loc='best') axs[0].grid(True) #08-2) %b axs[1].plot(df['time_open'],df['pb']*100, label='%b × 100') axs[1].plot(df['time_open'],df['MFI'], label='MFI20') axs[1].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-03-01')) axs[1].legend(loc='best') axs[1].grid(True) #08-3) Bandwidth axs[2].plot(df['time_open'],df['bandwidth'], label='Bandwidth') axs[2].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-03-01')) axs[2].legend(loc='best') axs[2].grid(True) plt.savefig(file_path +'Bollinger_band_pb_bandwidth_MFI.png') 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 |
[ BINANCE ACCOUNT ACCESSED ] #07) --- time_open open high low close volume sma stddev upper lower pb bandwidth 530 2023-02-27 17:00:00 23423.88 23455.31 23332.65 23428.87 28495.85395 23304.2805 258.996954 23822.274407 22786.286593 0.620262 4.445483 531 2023-02-27 21:00:00 23428.87 23897.99 23379.25 23559.40 83616.02692 23290.7345 236.109647 23762.953793 22818.515207 0.784471 4.054997 532 2023-02-28 01:00:00 23557.66 23618.30 23150.00 23276.35 71456.59915 23260.3660 190.475545 23641.317091 22879.414909 0.520979 3.275538 533 2023-02-28 05:00:00 23276.34 23582.98 23106.77 23492.09 39061.14463 23267.4050 196.518646 23660.442292 22874.367708 0.785832 3.378437 534 2023-02-28 09:00:00 23492.09 23549.99 23349.57 23467.52 25897.10942 23281.6675 200.328894 23682.325289 22881.009711 0.731934 3.441831 535 2023-02-28 13:00:00 23467.01 23470.44 23212.80 23236.68 29133.30210 23284.2370 199.354862 23682.946724 22885.527276 0.440361 3.424718 536 2023-02-28 17:00:00 23235.63 23421.98 23200.00 23392.69 33078.50122 23299.9895 194.560472 23689.110444 22910.868556 0.619115 3.340095 537 2023-02-28 21:00:00 23391.96 23579.12 23315.42 23518.30 68386.61130 23320.0465 195.395543 23710.837587 22929.255413 0.753657 3.351546 538 2023-03-01 01:00:00 23519.08 23600.00 23205.06 23264.36 54116.84831 23334.0720 179.406559 23692.885118 22975.258882 0.402858 3.075444 539 2023-03-01 05:00:00 23263.38 23343.55 23020.97 23141.57 53528.62659 23340.8415 168.612744 23678.066988 23003.616012 0.204543 2.889574 #08) --- 530 2023-02-27 17:00:00 23423.88 23455.31 23332.65 23428.87 28495.85395 ... 23423.31 5.56 6.669628e+08 0.000000e+00 0.819599 45.042831 531 2023-02-27 21:00:00 23428.87 23897.99 23379.25 23559.40 83616.02692 ... 23428.87 130.53 1.974359e+09 0.000000e+00 1.112840 52.670340 532 2023-02-28 01:00:00 23557.66 23618.30 23150.00 23276.35 71456.59915 ... 23559.40 -283.05 0.000000e+00 1.668384e+09 0.858279 46.186765 533 2023-02-28 05:00:00 23276.34 23582.98 23106.77 23492.09 39061.14463 ... 23276.35 215.74 9.137943e+08 0.000000e+00 1.164913 53.808778 534 2023-02-28 09:00:00 23492.09 23549.99 23349.57 23467.52 25897.10942 ... 23492.09 -24.57 0.000000e+00 6.074347e+08 1.418972 58.660118 535 2023-02-28 13:00:00 23467.01 23470.44 23212.80 23236.68 29133.30210 ... 23467.52 -230.84 0.000000e+00 6.789994e+08 1.158242 53.665993 536 2023-02-28 17:00:00 23235.63 23421.98 23200.00 23392.69 33078.50122 ... 23236.68 156.01 7.719934e+08 0.000000e+00 1.362196 57.666518 537 2023-02-28 21:00:00 23391.96 23579.12 23315.42 23518.30 68386.61130 ... 23392.69 125.61 1.605099e+09 0.000000e+00 1.503773 60.060280 538 2023-03-01 01:00:00 23519.08 23600.00 23205.06 23264.36 54116.84831 ... 23518.30 -253.94 0.000000e+00 1.263979e+09 1.416954 58.625613 539 2023-03-01 05:00:00 23263.38 23343.55 23020.97 23141.57 53528.62659 ... 23264.36 -122.79 0.000000e+00 1.240189e+09 1.135820 53.179579 [10 rows x 19 columns] |
마치며 …
파이썬 바이낸스 API로 시계열 데이터 분석을 계속하고 있습니다. 지금까지 파이썬 판다스로 이동평균선, 스토캐스틱, RSI, 볼린저 밴드와 같은 기술적 지표들을 직접 구해봤었습니다. 이번 포스팅에서는 지난 포스팅의 볼린저 밴드 지표 %b와 밴드폭(Bandwidth)에 현금흐름지수 를 겹쳐 그려보았습니다. 매수, 매도 시점을 시뮬레이션 해보시기 바랍니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 파이썬 바이낸스 API 시계열 데이터분석. 판다스 시간 처리
5. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
6. 파이썬 바이낸스 API로 차트 분석. 판다스 스토캐스틱
7. 파이썬 바이낸스 API로 차트 분석. 판다스 RSI (상대강도지수)
8. 파이썬 바이낸스 API로 시계열 데이터 분석. 판다스, 볼린저 밴드 (Bollinger Band)
9. 바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)
10. 파이썬 프로그래밍 시작
참고자료
[1] 파이썬 바이낸스 API로 가져오는 ohlcv 데이터 : python-binance Docs >> get_historical_klines
[2] 김황후(2020), 파이썬 증권 데이터 분석, 한빛미디어
쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.