Matplotlib으로 봉차트(Candlestick Chart) 그리기
2018-11-11 • quant • python, 파이썬, matplotlib, pyplot, candlestick, 봉차트 • 2 min read
봉차트(Candlestick Chart)는 한국 금융권에서 아주 친숙하게 사용되고 있는 차트 입니다. 하나의 봉(Candle)은 특정 기간 동안에서의 시가, 고가, 저가, 종가 (Open, High, Low, Close; OHLC)를 한번에 표현해 줍니다. 보통 일봉, 즉 하루 동안의 OHLC를 표현한 봉으로 차트를 그립니다.
파이썬에서 봉차트를 그릴 수 있는 도구는 다양하겠지만 대표적인 파이썬 차트 라이브러리인 (Matplotlib)[https://matplotlib.org/index.html]을 활용하여 봉차트를 그리는 법을 이 포스트에서 다루겠습니다.
Matplotlib 1.X 버전에서는 matplotlib.finance
모듈에서 candlestick_ohlc()
함수를 제공하고 있었으나 이 모듈은 2.0 버전부터 Deprecated 되었고, 이 모듈은 따로 (Gihub Repository)[https://github.com/matplotlib/mpl_finance]로 유지되고 있습니다. 설치는 다음 명령으로 할 수 있습니다.
pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
이제 가시화할 데이터를 준비합니다. 다음과 같은 20일치 OHLC와 거래량 데이터를 봉차트로 그려보겠습니다.
date | open | high | low | close | volume | |
---|---|---|---|---|---|---|
0 | 20180807 | 142500 | 145500 | 142000 | 145000 | 63103 |
1 | 20180808 | 144000 | 145000 | 141500 | 143500 | 49191 |
2 | 20180809 | 143500 | 144000 | 142000 | 142000 | 63800 |
3 | 20180810 | 142000 | 146500 | 142000 | 146000 | 57283 |
4 | 20180813 | 145000 | 146000 | 141000 | 142000 | 51095 |
5 | 20180814 | 141500 | 146000 | 141500 | 142500 | 42579 |
6 | 20180816 | 141500 | 142000 | 138500 | 141000 | 66262 |
7 | 20180817 | 140500 | 141000 | 137000 | 138500 | 100717 |
8 | 20180820 | 138500 | 140000 | 137500 | 137500 | 53507 |
9 | 20180821 | 137500 | 140000 | 137500 | 140000 | 40399 |
10 | 20180822 | 138500 | 140000 | 138500 | 139000 | 34023 |
11 | 20180823 | 139500 | 140000 | 135000 | 136000 | 95824 |
12 | 20180824 | 135500 | 137000 | 132000 | 134500 | 118459 |
13 | 20180827 | 135000 | 136500 | 134000 | 135000 | 67489 |
14 | 20180828 | 135500 | 136000 | 133000 | 135000 | 66626 |
15 | 20180829 | 135000 | 136000 | 134000 | 135500 | 64548 |
16 | 20180830 | 135500 | 136000 | 131500 | 132500 | 141496 |
17 | 20180831 | 132500 | 133500 | 131000 | 132000 | 100410 |
18 | 20180903 | 132500 | 133500 | 132000 | 132000 | 37159 |
19 | 20180904 | 132500 | 133500 | 131500 | 133500 | 35215 |
이렇게 데이터가 준비되었으니, 차트 레이아웃을 구성하겠습니다.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(8, 5))
fig.set_facecolor('w')
gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1])
axes = []
axes.append(plt.subplot(gs[0]))
axes.append(plt.subplot(gs[1], sharex=axes[0]))
axes[0].get_xaxis().set_visible(False)
결과는 다음과 두 개의 차트 영역이 위아래에 구성됩니다. 위에는 봉차트를 아래에는 거래량 바차트(Bar Chart)를 그리겠습니다. 위 아래 차트 모두 x 축은 같기 때문에 아래쪽 차트에만 x 축의 틱 레이블(Tick Label)을 표시합니다.
이제 여기에 봉차트와 거래량 차트를 그리면 됩니다. mpl_finance
모듈에서 candlestick_ohlc()
함수를 임포트하고 x 축 데이터를 준비한 다음 봉차트와 거래량 차트를 그립니다.
from mpl_finance import candlestick_ohlc
x = np.arange(len(df.index))
ohlc = df[['open', 'high', 'low', 'close']].astype(int).values
dohlc = np.hstack((np.reshape(x, (-1, 1)), ohlc))
# 봉차트
candlestick_ohlc(axes[0], dohlc, width=0.5, colorup='r', colordown='b')
# 거래량 차트
axes[1].bar(x, df.volume, color='k', width=0.6, align='center')
plt.tight_layout()
plt.show()
이 파이썬 코드의 결과는 다음과 같습니다.
여기서 x 축의 틱 레이블이 0에서 59까지 index 값으로 표시되는데, 일자로 표시되도록 해보겠습니다. 아래와 같이 plt.show()
전에 틱 레이블을 추가합니다. 여기서는 월요일에 해당하는 날짜만 표시하도록 했습니다.
# xlabels에 요일 추가
import datetime
_xticks = []
_xlabels = []
_wd_prev = 0
for _x, d in zip(x, df.date.values):
weekday = datetime.datetime.strptime(str(d), '%Y%m%d').weekday()
if weekday <= _wd_prev:
_xticks.append(_x)
_xlabels.append(datetime.datetime.strptime(str(d), '%Y%m%d').strftime('%m/%d'))
_wd_prev = weekday
axes[1].set_xticks(_xticks)
axes[1].set_xticklabels(_xlabels, rotation=45, minor=False)
이렇게 해주면 아래와 같이 index 값 대신 날짜가 x축 틱의 레이블로 표시됩니다.