시계열 데이터 기술적 분석 : 일중 강도 (Intraday Intensity, II)
파이썬 바이낸스 API를 이용하여 비트코인 투자 연습도 하고, 파이썬 판다스도 익히는 중입니다. 이번 포스팅에서는 거래량 지표 중 하나인 일중 강도에 대해 알아보겠습니다. 추세 반전 매매 기법을 구사할 때 유용하게 쓸 수 있는 기술적 분석 지표 하나를 추가해 보시기 바랍니다.
글의 순서
추세추종 매매기법
기술적 분석 : 일중 강도 (Intraday Intensity, II)
추세추종에서 일중 강도 II%를 이용한 반전 매매기법
파이썬 코드 : 파이썬 판다스를 이용한 비트코인 일중 강도(II%) 분석
추세추종 매매기법
주식이나 코인 거래에서 추세 추종(trend following) 기법은 상승 추세에 매수하고, 하락 추세에 매도 하는 매매 기법입니다. 여기서 중요한 것은 상승 추세인지 하락 추세인지를 알아내는 것인데요. 대표적인 확인 방법이 볼린저 밴드를 이용하는 방법입니다.
그런데, 자산 거래에서는 현재 가격이 단지 볼린저 밴드의 상단에 있는지 하단에 있는지만 확인한 후 거래에 돌입하진 않습니다. 적어도 한 두 개의 기술적 지표는 꼭 확인해봐야 하는데요. 대표적인 것이 거래량 지표입니다. 거래량 지표를 대표하는 것이 바로 현금흐름지수(MFI, Money Flow Index)와 일중 강도(II, Intraday Intensity)입니다. 이 두 거량 지표 중 이번 포스팅에서는 일중 강도에 대해 알아보겠습니다. 현금흐름지수에 대해서는 ‘함께 참고하면 좋은 글’에 링크해놓겠습니다.
기술적 분석 : 일중 강도 (Intraday Intensity, II)
일중 강도는 종가의 위치를 이용하여 자금의 흐름을 설명해 주는 기술적 분석 지표인데, 거래량을 나타내줍니다. 일중 강도율이란 개념도 있는데요. 일중 강도율은 21일 동안의 일중 강도(II, Intraday Intensity) 합을 21일 동안의 거래량 합으로 나누어 표준화 한 것입니다. 일중 강도율을 II%로 표시합니다.
일중 강도와 일중 강도율은 다음의 식으로 구합니다.
일중 강도 II = (2 * 종가 – 고가 – 저가)/(고가 – 저가) * 거래량
일중 강도율 = (21일 동안의 일중 강도의 합)/(거래량의 21일 합) * 100
추세추종 중 일중 강도 II%를 이용한 반전 매매기법
볼린저 밴드와 함께 일중 강도를 활용하는 매매기법을 반전 매매기법이라고 합니다. 반전 매매기법은 주가가 반전하는 지점을 찾아내서 매수 또는 매도하는 기법입니다. 볼린저 밴드 추세상으로는 하락인데, 강세지표가 떴다면 매수하고, 추세상 상승인데 약세 지표가 발생하면 매도합니다.
▶매수 : %b가 0.05보다 작고, II%가 0보다 클 때 → 볼린저 밴드 하단에 있는데, 강세지표가 발생한 경우,
▶매도 : %b가 0.95보다 크고, II%가 0보다 작을 때 → 볼린저 밴드 하단에 있는데, 약세지표가 발생한 경우
파이썬 코드 : 파이썬 판다스를 이용한 비트코인 일중 강도(II%) 분석
파이썬 바이낸스 API로 가져온 비트코인 시계열 데이터로 거래량 지표인 일중 강도를 구하는 코드를 만들어보았습니다. 지난 포스팅에서 만든 볼린저 밴드를 구하는 파이썬 코드에 거래량을 나타내는 기술적 분석 지표인 일중 강도(II%)를 추가했고, 데이터를 가시화할 수 있도록 하였습니다. 시계열 데이터, 볼린저밴드와 %b, II%를 나타내는 차트는 C:/_python/pandas/technical_analysis/ 라는 폴더에 Bollinger_band_pb_II.png 라는 이름의 그림파일로 저장됩니다.
판다스 열 연산(column operation)을 통해 단순 이동평균선을 구하는 과정, 이동평균선으로부터 볼린저 밴드와 일중 강도를 구하는 과정이 이 코드의 핵심입니다. 하나의 그래프에 %b와 II%를 모두 나타내기 위해 %b에 100을 곱했습니다. %b와 II%를 이용하여 매수 또는 매도 시점을 잡을 수 있을지 상상해 보시기 바랍니다.
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 |
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-22 23:59:59' t_interval = '1d' #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.))) # ====== 판다스 시계열 데이터 분석 : 볼린저 밴드(Bollinger Band), 일중 강도 ====== #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-7) 기술적 분석 지표, 일중 강도 (Intraday Intensity) df['II'] = (2*df['close']-df['high']-df['low'])/(df['high']-df['low']) * df['volume'] df['IIp'] = df['II'].rolling(window=21).sum()/df['volume'].rolling(window=21).sum()*100 print('\n','#07) ---') print(df.tail(10)) #08) 시계열 데이터 가시화 : 비트코인 볼린저 밴드 #08-1) 볼린저 밴드 : 회색영역으로 표시 --> fill_between 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['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(1d) & Bollinger Band(20*1d, 2 Std.Dev.)') axs[0].set_ylabel('Price (USDT)') axs[0].set_xlim(np.datetime64(tstt_utc), np.datetime64(tend_utc)) axs[0].tick_params(axis='x', rotation=15) axs[0].legend(loc='best') axs[0].grid(True) #08-2) %b, II% axs[1].plot(df['time_open'],df['pb']*100, label='%b*100') axs[1].plot(df['time_open'],df['IIp'], label='II%') axs[1].set_xlim(np.datetime64(tstt_utc), np.datetime64(tend_utc)) major_yticks = [0, 5, 95] axs[1].set_yticks(major_yticks) axs[1].tick_params(axis='x', rotation=15) axs[1].legend(loc='best') axs[1].grid(True) file_path = 'C:/_python/pandas/technical_analysis/' plt.savefig(file_path +'Bollinger_band_pb_II.png') plt.show() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[ BINANCE ACCOUNT ACCESSED ] #07) --- time_open open high low ... lower pb II IIp 133 2023-04-13 09:00:00 29888.07 30595.00 29854.59 ... 26543.249776 1.039325 20908.741142 10.165976 134 2023-04-14 09:00:00 30373.84 31000.00 29966.00 ... 26527.995239 0.980674 -2361.829799 12.426427 135 2023-04-15 09:00:00 30466.93 30595.60 30202.00 ... 26517.337604 0.884600 -13401.045992 11.695405 136 2023-04-16 09:00:00 30295.10 30549.99 30120.00 ... 26681.767679 0.850503 -3730.685989 9.861414 137 2023-04-17 09:00:00 30304.66 30316.06 29240.65 ... 26904.845443 0.626585 -36537.781638 8.384649 138 2023-04-18 09:00:00 29430.27 30485.00 29096.78 ... 26924.581599 0.823874 52626.130374 10.253470 139 2023-04-19 09:00:00 30380.01 30413.53 28520.00 ... 27012.041585 0.435799 -61236.498188 0.360633 140 2023-04-20 09:00:00 28797.10 29088.30 28010.00 ... 26985.063784 0.304901 -43562.205567 1.277179 141 2023-04-21 09:00:00 28243.65 28374.02 27125.00 ... 26789.111804 0.107647 -60538.415708 -8.854740 142 2023-04-22 09:00:00 27262.84 27882.72 27140.35 ... 26738.111499 0.241477 29630.979180 -5.548890 [10 rows x 13 columns] |
마치며 …
파이썬 바이낸스 API를 이용하여 비트코인 투자 연습도 하고, 파이썬 판다스도 익히는 중입니다. 이번 포스팅에서는 거래량을 나타내는 기술적 분석 지표 중 하나인 일중 강도에 대해 알아보았습니다. 일중 강도는 추세 반전 매매 기법을 구사할 때 유용하게 쓸 수 있는 기술적 분석 지표 중 하나입니다. 시장의 흐름을 파악하는데 도움이 되길 바랍니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 파이썬 바이낸스 API로 비트코인 투자 백테스팅 : 일중 강도(II) 매매 전략
5. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
6. 시계열 데이터 분석 : 지수 이동평균 (EMA)
7. 파이썬 바이낸스 API로 시계열 데이터 분석. 판다스, 볼린저 밴드 (Bollinger Band)
8. 바이낸스 API, 판다스로 시계열 데이터 분석. 현금흐름지수 MFI
9. 파이썬 바이낸스 API로 비트코인 시계열 데이터 분석 : 이동평균 수렴확산 (MACD)
10. 시계열 데이터 전처리 결과 확인 : pandas DataFrame
11. 바이낸스 비트코인 투자 백 테스팅. 파이썬 코인 투자 연습
12. 파이썬 프로그래밍 시작
참고자료
[1] python-binance Docs >> get_historical_klines
[2] 김황후(2020), 파이썬 증권 데이터 분석, 한빛미디어
쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.