본문 바로가기
python/주식

1. Python - 캔들차트(candlestick) + 스타일링 ( mplfinance, Plotly )

by 맑은안개 2021. 1. 20.

Python에는 주식차트를 표현하기 위한 많은 라이브러리들이 존재한다. 그 중 대표적인 것은 mplfinance, Plotly, Bokeh 등이 있는데 mplfinance 와 Plotly 를 사용하여 캔들차트를 만들어 본다.

 

OHLC VS Candle stick

OHLC는 Open(시가), High(고가), Low(저가), Close(종가) 의 합성어이다. 서양에서는 아래 그림의 왼쪽과 같은 바 형태의 차트를 사용하고 한국과 일본은 우측과 같은 캔들차트를 사용한다.

OHLC(왼쪽) VS Candle Stick(오른쪽)

라이브러리 설치

pip install pandas-datareader # 주식 데이터 조회
pip install mplfinance # 금융차트only 라이브러리
pip install plotly # 차트 라이브러리

주식 데이터 조회

pandas_datareader 라이브러리의 네이버금융(Naver finance) api를 사용하여 삼성전자 주식 데이터를 조회한다.

>>> import mplfinance as mpf
>>> import pandas_datareader as web

# 005930 삼성전자
>>> df = web.naver.NaverDailyReader('005930', start='20201201' , end='20210119').read()
>>> df
             Open   High    Low  Close    Volume
Date                                            
2020-12-01  67100  68300  67100  67800  22327173
2020-12-02  68400  69900  68300  69500  29703942
2020-12-03  70100  70500  69300  69700  23677989
2020-12-04  70400  72100  70100  71500  28130533
2020-12-07  72400  73500  71900  72900  28490496
2020-12-08  72200  72900  71600  71700  25000338
2020-12-09  72100  73900  72000  73900  24077996
2020-12-10  72700  73800  72500  72900  39882928
2020-12-11  73500  73800  73100  73400  18486672
2020-12-14  73600  74500  73200  73800  21510415
2020-12-15  73800  74100  73300  73800  20863671
2020-12-16  74100  74500  73400  73800  17512081
2020-12-17  73400  73700  72600  73300  24293214
2020-12-18  73300  73700  73000  73000  17613029
2020-12-21  73100  73400  72000  73000  20367355
2020-12-22  72500  73200  72100  72300  16304910
2020-12-23  72400  74000  72300  73900  19411326
2020-12-24  74100  78800  74000  77800  32502870
2020-12-28  79000  80100  78200  78700  40085044
2020-12-29  78800  78900  77300  78300  30339449
2020-12-30  77400  81300  77300  81000  29417421
2021-01-04  81000  84400  80200  83000  38655276
2021-01-05  81600  83900  81600  83900  35335669
2021-01-06  83300  84500  82100  82200  42089013
2021-01-07  82800  84200  82700  82900  32644642
2021-01-08  83300  90000  83000  88800  59013307
2021-01-11  90000  96800  89500  91000  90306177
2021-01-12  90300  91400  87800  90600  48682416
2021-01-13  89800  91200  89100  89700  36068848
2021-01-14  88700  90000  88700  89700  26393970
2021-01-15  89800  91800  88000  88000  33431809
2021-01-18  86600  87300  84100  85000  43227951
2021-01-19  84500  88000  83600  87000  39895044

mplfinance

pandas_datareader api를 사용하여 조회된 dataframe은 Open, High, Low, Close 이름의 컬럼명을 갖는다. mplfinance는 위 컬럼명을 default로 인식한다. 따라서 컬럼명을 수정할 필요 없이 아래와 같이 차트를 호출할 수 있다.

>>> mpf.plot(df, type='candle')

type 미지정 시 OHLC 형태의 차트가 출력된다.

 

mplfinance 캔들차트 ( 최근일자 확대 모습 )

 

위 코드 호출 후 아래와 같은 오류가 발생한 경우 dataframe의 형태를 int형으로 변환한다.

>>> mpf.plot(df, type='candle')
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    mpf.plot(df, type='candle')
  File "C:\Users\KUH\AppData\Local\Programs\Python\Python39\lib\site-packages\mplfinance\plotting.py", line 281, in plot
    dates,opens,highs,lows,closes,volumes = _check_and_prepare_data(data, config)
  File "C:\Users\KUH\AppData\Local\Programs\Python\Python39\lib\site-packages\mplfinance\_arg_validators.py", line 59, in _check_and_prepare_data
    raise ValueError('Data for column "'+str(col)+'" must be ALL float or int.')
ValueError: Data for column "Open" must be ALL float or int.

 

현재 dataframe 컬럼타입 확인.

>>> df.dtypes
Open      object
High      object
Low       object
Close     object
Volume    object
dtype: object

>>> df = df.astype(int)

>>> df.dtypes
Open      int32
High      int32
Low       int32
Close     int32
Volume    int32
dtype: object

 

matplotlib 차트 스타일링

make_marketcolors를 사용해서 차트의 세부 컬러 설정을 할 수 있다. 설정한 컬러 셋팅을 make_mpf_style 함수에 인자로 전달하여 스타일 객체를 만들고 해당 객체를 plot 에 전달하면 지정한 스타일링으로 차트가 출력된다.

>>> colorset = mpf.make_marketcolors(up='tab:red', down='tab:blue', volume='tab:blue')
>>> s = mpf.make_mpf_style(marketcolors=colorset)
>>> mpf.plot(df[:60], type='candle', volume=True, style=s) # 최근 60 row data 출력

volume 옵션으로 거래량을 출력할 수 있다. ( dataframe에 volume컬럼 참조 )

스타일링 된 캔들차트

 

Plotly 

Plotly는 데이터 시각화를 위한 다양한 차트를 제공한다. 캔들차트 생성을 위해서 Candlestick 함수를 호출한다. mplfinance와 다르게 인덱스 및 open, high, low, close 인자를 설정해야 한다. 

import plotly.graph_objects as go

>>> candle = go.Candlestick(x=df.index)
>>> candle = go.Candlestick(
	x=df.index,
	open=df['Open'],
	high=df['High'],
	low=df['Low'],
	close=df['Close'])
>>> fig = go.Figure(data=candle)
>>> fig.show()

go.Figure는 Figure 객체를 리턴한다. Figure 객체를 사용하여 show() 출력하고 add_

 

default로 하단에 slider가 위치한다. slider를 조정하여 데이터를 확대/축소할 수 있다. 차트 봉에 마우스오버 시값 수치가 박스로 표시된다.

Plotly 캔들차트

다음과 같이 slider를 옵션으로 제거할 수 있다.

ch.update_layout(xaxis_rangeslider_visible=False)

 

Plotly 차트 스타일링

>>> candle = go.Candlestick(
	x=df.index,
	open=df['Open'],
	high=df['High'],
	low=df['Low'],
	close=df['Close'],
	increasing_line_color='red', # 상승봉
	decreasing_line_color='blue' # 하락봉
)
>>> ch = go.Figure(data=candle)
>>> ch.show()

increasing_line_color, decreasing_line_color로 상승/하락 봉의 스타일링을 지정한다.

 

마무리하며..

기본적으로 많이 사용되는 파이썬 차트 라이브러리를 사용하여 캔들차트를 출력하는 간단한 예제를 살펴보았다. 2편에서는 Plotly를 사용하여 캔들차트와 거래량 차트를 동시에 출력하는 기능을 알아본다.

 

2. Python - Plotly사용, 캔들 + 거래량 차트 만들기

3. Python - Plotly 캔들차트 + 이동평균선 ( feat. rolling API 사용법 )

반응형