캔들스틱 차트를 파이썬 matplotlib의 pyplot으로 그릴 수 있다면 다른 기술적 분석 지표들과 함께 시장 상황을 복합적으로 분석할 수 있습니다. 이번 포스팅에서는 캔들스틱 차트와 스토캐스틱 RSI를 함께 그리는 방법을 알아보겠습니다. 핵심은 두 차트의 시간을 맞춰줘야 한다는 것입니다.
글의 순서
캔들스틱 차트와 스토캐스틱 RSI 간의 날짜 맞추기
캔들스틱 차트의 몸통 두께
두 차트의 간격을 조절하는 plt.subplots_adjust
파이썬 코드 : 캔들스틱 차트와 스토캐스틱 RSI 비교
캔들스틱 차트와 스토캐스틱 RSI 간의 날짜 맞추기
두 그래프의 x축을 동일한 날짜 간격으로 설정해야만 헷갈리지 않고 시장 상황을 분석할 수 있습니다. 캔들스틱 차트의 x축 레이블을 날짜로 설정하고, fig, axs = plt.subplots(2, 1, figsize=(12, 10), sharex=True)이라는 구문으로 두 그래프의 x축을 공유할 수 있도록 설정했습니다. 이렇게 하면 두 그래프의 날짜 간격이 일치하게 됩니다.
또한, df[‘Date’]를 사용하여 x축 레이블을 날짜로 설정하고, 각 날짜의 캔들스틱 차트를 그릴 수 있도록 하였습니다. 이때, 그래프에서 보여주는 날짜의 시작점과 끝점을 axs[1].set_xlim([tstt_KST, tend_KST])로 설정하여 날짜 간격이 맞출 수 있도록 하였습니다.
캔들스틱 차트의 몸통 두께
지난 포스팅에서 알아봤던 것처럼 candle_width = max(0.1, 0.5 * (axs[1].get_window_extent().width / len(df)))라는 구문을 사용하였습니다. 이는 그래프의 너비를 가져와 len(df)로 나누어서 그래프의 넓이에 맞게 캔들스틱의 몸통 두께를 설정합니다. 당연히 그래프의 너비가 달라지고, 캔들의 개수가 달라지면 캔들스틱의 두께가 그에 맞게 동적으로 설정됩니다.
두 차트의 간격을 조절하는 plt.subplots_adjust
plt.subplots_adjust(hspace=0.05)를 추가하여 subplot 간의 수직 간격을 설정했습니다. hspace 값은 두 그래프 사이의 간격을 제어하며, 이 값을 줄이면 그래프 간의 간격이 좁아집니다. hspace의 기본값이 0.2이니까, 이 구분을 생략하면 0.05로 설정했을 때보다 간격이 4배로 커집니다.
파이썬 코드 : pyplot으로 그리는 캔들스틱, 스토캐스틱 RSI 차트
지금까지 캔들스틱 차트와 스토캐스틱 RSI와 같은 기술적 지표를 동시에 그리는데 중요한 사항을 짚어봤습니다. 이를 종합한 파이썬 코드를 아래의 실습코드에 나타내었습니다.
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 |
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 = '2024-04-01 00:00:00' tend_utc = '2024-06-02 23:59:59' t_interval = '1d' ticker = 'BTCUSDT' #03) 파이썬 바이낸스 API로 비트코인 가격 데이터 가져오기 bars = client.get_historical_klines(ticker, t_interval, tstt_utc, tend_utc, limit=1000) #03-1) ohlcv 데이터만 추출 for i in bars: del i[6:] #04) 데이터프레임 열 이름 붙여주기 # mplfinance라는 패키지를 사용하기 위한 열 이름 : Date, Open, High, Low, Close, Volume df = pd.DataFrame(bars, columns=['Date','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['Date'] = pd.to_datetime(df['Date'], unit='ms') #06-1) 그래프 작성을 위해 시간의 시작과 끝 확인 nrows = df.shape[0] tstt_KST = df.at[0,'Date'] tend_KST = df.at[nrows-1,'Date'] def calculate_rsi(df, n_rsi): delta = df['Close'].diff(1) up = (delta.where(delta > 0, 0)).fillna(0) down = (delta.where(delta < 0, 0)).fillna(0) avg_up = up.rolling(window=n_rsi, min_periods=1).mean() avg_down = down.rolling(window=n_rsi, min_periods=1).mean() rs = (avg_up/avg_down).abs() rsi = rs/(1.0 + rs)*100 return rsi def calculate_stochastic_rsi(df, period, k_period, d_period): df['RSI'] = calculate_rsi(df, period) rsi_min = df['RSI'].rolling(window=period, min_periods=1).min() rsi_max = df['RSI'].rolling(window=period, min_periods=1).max() df['Stochastic_RSI'] = (df['RSI'] - rsi_min) / (rsi_max - rsi_min) df['%K'] = df['Stochastic_RSI'].rolling(window=k_period, min_periods=1).mean() * 100 df['%D'] = df['%K'].rolling(window=d_period, min_periods=1).mean() return df n_rsi = 14 m = 3 t = 3 df = calculate_stochastic_rsi(df, n_rsi, m, t) print(df.tail(5)) #07) 캔들 차트 그리기 fig, axs = plt.subplots(2,1,figsize=(12,10), sharex=True) title_plot = f'{ticker} Candlestick & Stochastic RSI' # 동적으로 두께를 조정한 후, 캔들 그리기 candle_width = max(0.1, 0.5 * (axs[1].get_window_extent().width / len(df))) for i in range(len(df)): color = 'red' if df['Close'].iloc[i] >= df['Open'].iloc[i] else 'blue' axs[0].plot([df['Date'].iloc[i], df['Date'].iloc[i]], [df['Low'].iloc[i], df['High'].iloc[i]], color=color) axs[0].plot([df['Date'].iloc[i], df['Date'].iloc[i]], [df['Open'].iloc[i], df['Close'].iloc[i]], color=color, linewidth=candle_width) axs[0].set_title(title_plot, fontsize=20) axs[0].set_ylabel('Price (USDT)') axs[0].grid(True) # Stochastic RSI %K, %D axs[1].plot(df['Date'], df['%K'], color='b', label='%K') axs[1].plot(df['Date'], df['%D'], color='m', label='%D') major_yticks = [20, 30, 70, 80] axs[1].set_yticks(major_yticks) axs[1].legend(loc='best') axs[1].set_xlim([tstt_KST, tend_KST]) axs[1].tick_params(axis='x', rotation=15) axs[1].grid(True) # axs[0], axs[1] 사이의 간격 조정 plt.subplots_adjust(hspace=0.05) plt.savefig('Candle-stoRSI_pyplot.png', dpi=100) plt.show() |
마치며 …
이번 포스팅에서는 캔들스틱 차트와 스토캐스틱 RSI를 함께 그리는 방법을 알아보았습니다. 이처럼 캔들스틱 차트를 파이썬 matplotlib의 pyplot으로 그릴 수 있다면 다른 기술적 분석 지표들과 함께 시장 상황을 복합적으로 분석할 수 있습니다. 핵심은 두 차트의 시간을 맞춰줘야 한다는 것입니다. 이 밖에도 보다 눈으로 확인하기 편하도록 캔들스틱의 두께를 동적으로 조절하는 방법, 각 그래프간 간격을 조절하는 방법도 적용해보시기 바랍니다.
함께 참고하면 좋은 글
▶ 캔들 차트의 의미와 파이썬 pyplot으로 그리는 캔들스틱 차트
▶ 캔들 차트의 의미, 시장 진입 시점은?
▶ 스토캐스틱 RSI, 파이썬 바이낸스 API로 시계열 데이터 분석
▶ 하이킨 아시 차트, 파이썬 바이낸스 API로 시계열 데이터 분석
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ 파이썬 바이낸스 API와 판다스 캔들 스틱 차트로 시계열 데이터 분석
▶ mplfinance 캔들 차트 스타일
▶ 캔들 차트 스타일 변경 (mplfinance, customization)
▶ 파이썬 바이낸스 API, mplfinance로 캔들 차트 파라미터 연습
▶ 시계열 데이터 분석 : 추세분석 지표 6가지
참고자료
▶ Wikipedia, Candlestick chart