본문 바로가기
파이썬/주식

Python으로 캔들스틱 차트 Candlestick chart 그리기

by 행복론자 2019. 11. 2.

이번에는 봉차트라고 불리는 캔들 차트 그리기입니다.

캔들 차트란 이렇게 생긴 캔들로 구성된 차트입니다.

High부터 Low란 당일 주가가 최고가, 최저가를 나타내고 Real Body란 전일가와 종가를 연결한 부분입니다.

당일 종가가 전일가보다 낮아졌다면 파란색, 높아졌다면 빨간색으로 표시합니다.

 

wikipedia에서 그대로 긁어왔습니다.

 

이를 나타내기 위해서는 그림 그대로 주가의 High, Open, Close, Low 정보가 필요합니다. 

주가 정보를 갖고 오는 것은 지난 번과 마찬가지로 pandas_datareader를 사용했습니다.

모든 Line 별로까지는 아니어도 맥락을 파악할 수 있도록 주석을 달아두었습니다.  

 

from mpl_finance import candlestick2_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas_datareader.data as web
import datetime

# 차트를 이룰 데이터 가져오기, 2019 1.1 ~ 2019.11.1 기간의 삼성전자 주가 정보 갖고 오기
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2019, 11, 1)
ds = web.DataReader("005930.KS", "yahoo", start, end)
index = ds.index.astype('str')

# 차트 레이아웃을 설정
fig = plt.figure(figsize=(10,10)) #최초의 창 크기를 10x10으로 설정, 크기를 설정하지 않으면 아무 것도 나오지 않음

#ax_main 실제로 데이터가 그려지는 영역
ax_main = fig.add_subplot(1,1,1) #1,1,1의 의미는 전체 창을 1x1로 쪼개고 ax_main을 생성한다는 뜻

# x축에 쓰일 날짜 값 조정
def x_date(x,pos):
    try:
        return index[int(x-0.5)][:7] # 0:6까지만 잘라서 2019-01와 같이 표현
    except IndexError:
        return ''

# x축을 조정
ax_main.xaxis.set_major_locator(ticker.MaxNLocator(10))
ax_main.xaxis.set_major_formatter(ticker.FuncFormatter(x_date))

# 메인차트를 그리기
ax_main.set_title('Samsung Stock ',fontsize=22) #차트의 Title 설정 
ax_main.set_xlabel('Date') #차트의 x축 label을 설정 
#캔들 차트를 실제로 구성하는 부분 
candlestick2_ohlc(ax_main,ds['Open'],ds['High'],ds['Low'],ds['Close'], width=0.5, colorup='r', colordown='b')

plt.grid()
plt.show()

 

아래는 위 코드의 실행결과입니다. 2019-01부터 2019-10까지의 주가 흐름을 볼 수 있습니다. 

 

 

이번에는 지난 포스팅에서 담았던 이동평균선을 추가해보겠습니다. 

from mpl_finance import candlestick2_ohlc
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas_datareader.data as web
import datetime

# 차트를 이룰 데이터 가져오기, 2019 1.1 ~ 2019.11.1 기간의 삼성전자 주가 정보 갖고 오기
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2019, 11, 1)
ds = web.DataReader("005930.KS", "yahoo", start, end)
index = ds.index.astype('str')

ma5 = ds['Close'].rolling(window=5).mean() 
ma20 = ds['Close'].rolling(window=20).mean() 
ma60 = ds['Close'].rolling(window=60).mean() 
ma120 = ds['Close'].rolling(window=120).mean() 

# 차트 레이아웃을 설정
fig = plt.figure(figsize=(10,10)) #최초의 창 크기를 10x10으로 설정, 크기를 설정하지 않으면 아무 것도 나오지 않음

#ax_main 실제로 데이터가 그려지는 영역
ax_main = fig.add_subplot(1,1,1) #1,1,1의 의미는 전체 창을 1x1로 쪼개고 ax_main을 생성한다는 뜻

# x축에 쓰일 날짜 값 조정
def x_date(x,pos):
    try:
        return index[int(x-0.5)][:7] # 0:6까지만 잘라서 2019-01와 같이 표현
    except IndexError:
        return ''

# x축을 조정
ax_main.xaxis.set_major_locator(ticker.MaxNLocator(10))
ax_main.xaxis.set_major_formatter(ticker.FuncFormatter(x_date))

# 메인차트를 그리기
ax_main.set_title('Samsung Stock ',fontsize=22)
ax_main.set_xlabel('Date')
ax_main.plot(index, ma5, label='MA5') #5일선 표시 
ax_main.plot(index, ma20, label='MA20') #20일선 표시
ax_main.plot(index, ma60, label='MA60') #60일선 표시 

#캔들 차트를 실제로 구성하는 부분 
candlestick2_ohlc(ax_main,ds['Open'],ds['High'],ds['Low'],ds['Close'], width=0.5, colorup='r', colordown='b')

ax_main.legend(loc=5) #차트 범례를 오른쪽에 위치하도록 설정
plt.grid()
plt.show()

 

 

최종 실행 결과입니다.

 

 


같이 보시면 좋을 글

2021/02/10 - [파이썬/주식 자동매매] - 주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

 

주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

주식매매프로그램 개발 노하우에 관한 제 전자책이 발간되었습니다. https://kmong.com/gig/292764 주식매매프로그램, 쉽게 따라 만드는 노하우와 소스를 드립니다. | 36000원부터 시작 가능한 총 평 0개

jsp-dev.tistory.com

2019/11/06 - [파이썬/주식] - Python으로 RSI(Relative Strength Index) 구하기

2019/11/03 - [파이썬/주식] - Python으로 볼린저밴드 Bollinger Bands 보조지표 계산

제 블로그에 방문해주셔서 감사합니다.
좋아요, 댓글은 제가 글을 쓰는데 큰 힘이 됩니다.
아래는 쿠팡 링크이고 쿠팡 파트너스 활동을 통해 일정 수익이 발생할 수 있음을 알려 드립니다.

 

 

 

 

 

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글