재테크/주식 알람 시스템 만들기

5. 주식 차트 그리기

중년 플머 김씨 2020. 11. 8. 00:03

소스파일은 github.com/galaxywiz/StockCrawler_py 에서 확인 가능합니다.

 

지금은 자동화 모듈을 붙이지 않는 테스트 단계인데,

현재 상황에서 print 문으로 글자를 출력해서 실제 이게 맞는지 아닌지 분석하기는 한계가 있습니다.

그래서 차트를 실제 그려보고, 우리 로직이 제대로 가고 있는지 검증을 해보는 것이 중요합니다.

또한 오른쪽 그림과 같이 차트를 보내서 실제 매매할 때 이 주식이 장기 상향인지 박스권에 있는건지 판단하기 쉽게 해주는 역할도 있습니다.

차트는 캔들 차트를 그릴수도 있지만, 복잡하고, 굳이 그렇게 까지 할 필요 없이 간단하게 line 차트를 그리는 것으로 설명하겠습니다.

 

printChart.py

# 주식 차트를 그리는 클래스
import numpy as np
import pandas as pd
import dataframe

import datetime
import plotly.graph_objects as go
import tracemalloc
import matplotlib.pyplot as plt

import os
from stockData import StockData

class PrintChart:
    def saveFigure(self, dir, sd):
        try:
            plt.style.use('fivethirtyeight')
            plt.rc('font', family='Droid Sans')
            
            title = "[%s] close price" % (sd.name_) 
            plt.title(title)
            
            plt.figure(figsize=(16,8))
            dataCount = 100
            indi = sd.chartData_.tail(dataCount)
            df = pd.DataFrame(indi)
            df['candleTime'] = pd.to_datetime(df['candleTime'], format='%Y-%m-%d', infer_datetime_format=True)
            df = df.set_index('candleTime')

            plt.xlabel('candleTime', fontsize=18)
            #plt.xticks(rotation=45)
            plt.ylabel('Close Price', fontsize=18)
            plt.scatter(df.index, df['BuySignal'], color='green', label = 'buy', marker='^', alpha=1)
            plt.scatter(df.index, df['SellSignal'], color='red', label = 'sell', marker='v', alpha=1)
            plt.plot(df['close'], label='Close Price', alpha=0.35)
            plt.legend(loc='upper left')
            
            filename = "flg_%s.png" % (sd.code_)
            if os.path.exists(dir) == False:
                os.makedirs(dir)

            p = os.getcwd()
            filePath = "%s/%s%s" % (p, dir, filename)
            if os.path.isfile(filePath) == True:
                os.remove(filePath)
            
            plt.savefig(filePath)

            print("$ 차트 갱신 [%s] => [%s]" % (sd.name_, filename))
            return filePath
        except:
            print("$ 차트 갱신 실패 [%s]" % (sd.name_))
            return None
      

파이썬에서 차트 그려주는 plt 라이브러리를 사용했습니다.

정말 파이썬이 무서운 게, 50여 코드 가지고 이런 차트를 그릴 수 있는 게 대단한 거입니다. 사견으로 C++로 이걸 구현하려고 하면 정말 토 나옵니다.

 

17라인에서 이 그래프 테마, 스타일을 지정해 줍니다.

차트 스타일은 여러가지 있고 다른 스타일을 보고 싶으시면 print(plt.style.available)라 하면 여러 값들을 확인할 수 있습니다.

18라인에서 차트에 쓸 폰트를 지정하는데, 가능하면 한글이 지원되는 폰트를 사용하는 게 좋습니다.

이후 24,25라인에서 이 차트에 쓸 값들을 지정하는데, 전체를 하면 차트 크기에 비해 너무 많은 값들이 들어가서 작게 보입니다.

저는 여기서 과거 100일치 데이터만 보려고 tail 명령으로 100일치 데이터만 잘라 와 사용하고 있습니다.

 

33, 34라인은 매수, 매도 시그널 표시 지점인데, 저 값들은 이 다음장인 매매 전략에 대한 기술에서 추가될 내용입니다. 매수이면 ^ 기호, 매도이면 v를 찍어서 표시하도록 했습니다.

 

35라인에 close , 종가 데이터를 가지고 선 차트를 그리도록 하고, 그냥 하면 위의 매수/매도 시그널이 보이지 않으므로 alpha, 투명도 값을 30%로 지정해서 그리도록 합니다.

 

38 라인부턴 이 차트를 png 파일로 저장하는 방법에 대해 기술했습니다.

문제없으면 없다고 print, 로그 찍을 것이고, 문제 있으면 except 문을 타고 갱신 실패라 뜰껍니다. 만약 갱신 실패가 나오면 뭐가 문제인지 디버깅 하면서 찾아봐야 합니다.