반응형

Python candlestick chart 그리기

 

주가 데이터를 가지고 캔들스틱차트 (일명 봉차트)를 그려보도록 하겠습니다. 본래 저는 캔들스틱차트를 그리 살펴보지 않고, Julia 언어로 할때에는 관련 패키지가 있긴 하나 너무 지저분해져서 안그렸던 것인데, 파이썬에서는 상당히 단순하게 그려지기에 기록으로 남겨봅니다.

 

우선 다음과 같이 df라는 이름의 pandas dataframe이 있다고 가정하고 시작하겠습니다.

> print(df)

날짜     시가     고가     저가     종가      거래량
0   2019-05-07  36400  38600  33300  33650  3227163
1   2019-05-08  35050  39250  34300  36450  4206997
2   2019-05-09  37500  39000  36200  38450  1561060
3   2019-05-10  37950  38450  35850  36250   935992
4   2019-05-13  36700  36800  34950  35000   431000
..         ...    ...    ...    ...    ...      ...
244 2020-04-29  14900  15200  14900  15000    27855
245 2020-05-04  14850  15000  14800  15000    17779
246 2020-05-06  15150  15800  14900  15600    57414
247 2020-05-07  15450  16900  15450  16200   231640
248 2020-05-08  16200  16350  16100  16200    31844  

 

 

캔들 스틱 차트를 그리는 데 이용된 패키지들 입니다.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from mplfinance.original_flavor import candlestick2_ohlc
from matplotlib import font_manager, rc
  • 우선 위에서 보였던 주식 데이터가 pandas 데이터프레임이기 때문에 pandas가 있습니다.
  • matplotlib.pyplot 는 그래프를 그리는 것이니까 들어가야겠죠.
  • matplotlib.ticker 는 그래프 x축에 날짜가 빼곡하게 되면 지저분해 보이니까 나중에 x축에 날짜가 나오는 것을 조절할때 쓰일 겁니다.
  • candlestick2_ohlc 가 캔들스틱차트(봉차트)를 그리는 패키지인데, 검색해보면 mpl_finance 패키지를 설치하라는 글이 많은데 근래에 mplfinance로 이름이 바뀐 듯 합니다. 여러 블로그 글을 참조해서 하다보면 candlestick_ohlc와 candlestick2_ohlc가 자꾸 없다고 나오는데, mplfinance.orifinal_flavor에 있습니다.
  • font_manager와 rc는 그래프에 한글을 쓰기 위해서 넣었습니다.

 

상단의 데이터를 그리는 파이썬 코드를 다음과 같이 작성하였습니다.

 

# 한글 폰트 지정
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name) 

fig, ax = plt.subplots()

# x-축 날짜
xdate = df.날짜.astype('str')
for i in range(len(xdate)):
  xdate[i] = xdate[i][2:] # 2020-01-01 => 20-01-01

# 종가 및 5,20,60,120일 이동평균
ax.plot(xdate, df['종가'], label="종가",linewidth=0.7,color='k')
ax.plot(xdate, df['종가'].rolling(window=5).mean(), label="평균5일",linewidth=0.7)
ax.plot(xdate, df['종가'].rolling(window=20).mean(), label="평균20일",linewidth=0.7)
ax.plot(xdate, df['종가'].rolling(window=60).mean(), label="평균60일",linewidth=0.7)
ax.plot(xdate, df['종가'].rolling(window=120).mean(), label="평균120일",linewidth=0.7)
candlestick2_ohlc(ax,df['시가'],df['고가'],df['저가'],df['종가'], width=0.5, colorup='r', colordown='b')
    
fig.suptitle("캔들 스택 차트 예시")
ax.set_xlabel("날짜")
ax.set_ylabel("주가(원)") 
ax.xaxis.set_major_locator(ticker.MaxNLocator(25)) # x-축에 보일 ticker 개수 ~20개이면 1달
ax.legend(loc=1) # legend 위치
plt.xticks(rotation = 45) # x-축 글씨 45도 회전

plt.grid() # 그리드 표시
plt.show()

 

 

위의 코드로 그려진 차트는 아래와 같습니다.

그래프 제목이 다른 것은 제가 쓰는 코드에는 주가 데이터를 다루는 클래스 안에 종목코드를 넣었을 때, SQL DB에서 주가를 찾아서 차트를 그려주는 함수로 되어 있다보니 위의 코드와 조금은 다르다보니 이렇게 되었네요.

 

 

반응형

+ Recent posts