Matplotlib으로 봉차트(Candlestick Chart) 그리기

2018-11-11 • quantpython, 파이썬, 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)을 표시합니다.

layout

이제 여기에 봉차트와 거래량 차트를 그리면 됩니다. 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()

이 파이썬 코드의 결과는 다음과 같습니다.

layout

여기서 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축 틱의 레이블로 표시됩니다.

layout