candle stick chart, matplotlib, Python, 주가, 주식, 캔들스틱, 파이썬
반응형
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에서 주가를 찾아서 차트를 그려주는 함수로 되어 있다보니 위의 코드와 조금은 다르다보니 이렇게 되었네요.
반응형
'컴 & 프로그래밍 > PYTHON' 카테고리의 다른 글
오차/불확도 전파(Error Propagation)을 쉽게 계산하자 (1) | 2020.06.03 |
---|---|
파이썬 보간법(python interpolation) (0) | 2020.06.02 |
파이썬 마우스, 키보드 제어 pyautogui (0) | 2020.05.16 |
파이썬 텔레그램 봇(telegram bot) 만들기 2: 간단 채팅봇 만들기 (0) | 2020.05.05 |
파이썬 텔레그램 봇(telegram bot) 만들기 1: 토큰(token) 받기 (0) | 2020.05.05 |