본문 바로가기

코인/코인 개발

파이썬으로 캔들차트 그리기

지난 블로그에서는 업비트 API를 이용한 거래량 급등 코인 알리미, 텔레그램 알림 봇 등을 다루었는데요. 이번에는 파이썬으로 주어진 캔들 데이터를 이용해 캔들차트를 그리는 법을 다루어 봅니다.


예제로 쓸 데이터는 삼성전자의 2020년 6월 9일부터 1년간의 일봉 데이터인데, 해당 데이터를 먼저 pandas_datareader로 가져옵니다. 데이터 소스는 Naver Finance를 사용했습니다.

 

from pandas_datareader import data as web
import datetime

start = datetime.datetime(2020, 6, 9)
end = datetime.datetime(2021, 6, 9)

Stock = namedtuple('Stock', ['ticker', 'name'])
stock = Stock(ticker='005930', name='삼성전자')
data_source = 'naver' # 네이버

df = web.DataReader(stock.ticker, data_source, start=start, end=end)

 

pandas_datareader는 Naver Finance 이외에도 St.Louis FED, OEDC, World Bank 등등 다양한 데이터 소스를 제공하고 있습니다.

다운로드한 캔들 데이터의 형식 구간 별로 [시가, 고가, 저가, 종가, 거래량]으로 다음과 같습니다.

 

             Open   High    Low  Close    Volume
Date                                            
2020-06-09  55800  56500  54400  55500  23998831
2020-06-10  55100  55900  54900  55400  16742493
2020-06-11  54500  55100  53200  54300  33815123
2020-06-12  52100  52800  51500  52300  26976019
2020-06-15  51400  52000  49900  49900  28772921
...           ...    ...    ...    ...       ...
2021-06-03  81300  83000  81100  82800  29546007
2021-06-04  82700  82700  81500  82200  18112259
2021-06-07  82700  82800  81600  81900  16496197
2021-06-08  82300  82600  81800  81900  12781226
2021-06-09  81500  82000  81100  81100  14908823

[249 rows x 5 columns]

 

 

이제 plotly를 이용해 캔들차트를 생성할 텐데, 한국의 경우 양/음봉의 채워지는 색상이 다르기 때문에 약간의 조정이 필요합니다. 추가로, 한국에서 주로 쓰이는 5, 20, 60, 120 이동평균선도 같이 추가해봅니다.

 

data = [{
    'type': 'candlestick',
    'x': df.index,
    'open': df.Open,
    'close': df.Close,
    'high': df.High,
    'low': df.Low,
    'name': stock.name,
    'increasing_line_color': 'red', # 양봉 색상
    'decreasing_line_color': '#398bff', # 음봉 색상
    'showlegend': True
}, ]

# 5, 20, 60, 120 이동평균선
for (window, color) in [(5, '#00c50d'), (20, '#ff333a'), (60, '#f48416'),
                        (120, '#892dff')]:
    MA = df.Close.rolling(window=window, min_periods=1).mean()
    trace = {
        'x': df.index,
        'y': MA,
        'type': 'scatter',
        'mode': 'lines',
        'line': {
            'width': 1,
            'color': color
        },
        'name': '{} 이동평균선'.format(window)
    }

    data.append(trace)

 

마지막으로, 해당 데이터를 html 형태로 출력해봅니다.

 

title = '{} 차트'.format(stock.name)
layout = go.Layout({
    'title': {
        'text': title,
        'font': {
            'size': 12
        }
    }
})

fig = go.Figure(data=data, layout=layout)
fig.write_html('{}.html'.format(title))
fig.show()

 

프로그램 수행 시 '삼성전자 차트.html' 파일이 생성되며, 다음과 같은 화면을 보실 수 있습니다.

 

Plotly로 그린 삼성전자 캔들차트 예제

 

삼성전자 차트.html
3.43MB

 

plotly는 다양한 커스터마이징 옵션을 제공하고 있고, Dash Platform을 통해 적은 노력으로 차트 서비스를 제공할 수도 있습니다.