차밍이

[Python] 거래량 막대 그래프, 캔들스틱 차트에 같이 표현하기 - 파이썬 주식투자(4) 본문

투자/Quant & BackTest

[Python] 거래량 막대 그래프, 캔들스틱 차트에 같이 표현하기 - 파이썬 주식투자(4)

2020. 12. 21. 10:54
반응형

목차

     

    이전 글에서 파이썬에서 캔들스틱 차트로 kospi 지수 또는 주식 차트를 그리는 방법을 알아보았습니다.

    이번 글에서는 기존의 Candlestick chart + 거래량 막대그래프를 그려보겠습니다.

    기존 내용은 skip 하고 거래량 그래프 부분을 진행하겠습니다.

    부족한 부분은 이전 글과 아래 코드를 통해서 참고해주세요.

    [Python] pandas_datareader 코스피 코스닥 지수 데이터 가져오기 // 파이썬 주식투자(1)

    [Python] KOSPI 이동평균선, 주가 이동평균선 구하기 // 파이썬 주식투자(2)

    [Python] 캔들 스틱 차트 그리기, Candlestick Chart 그리기 - 파이썬 주식투자(3)

     

    [Python] 캔들 스틱 차트 그리기, Candlestick Chart 그리기 - 파이썬 주식투자(3)

    파이썬을 활용해서 캔들 차트를 그리는 방법을 알아보겠습니다. 일반적으로 주식 시장에서 많이 사용되는 캔들 스틱 차트를 그려야 분석하는데 더욱 도움이 됩니다. 우선, 가장 중요한 캔들 차

    chancoding.tistory.com

    이전 소스코드 종합

    from mpl_finance import candlestick2_ohlc
    import matplotlib.ticker as ticker
    import matplotlib.pyplot as plt
    from pandas_datareader import data  
    from datetime import datetime
    import pandas as pd
    import numpy as np
    
    # 데이터를 가져올 날짜 설정
    start_date = datetime(2020,5,8)
    end_date = datetime(2020,10,8)
    
    # 야후에서 코스피 데이터 가져오기
    kospi_df = data.get_data_yahoo("^KS11", start_date, end_date) 
    
    # 지수 이동평균선 데이터 구하기
    kospi_df['MA3'] = kospi_df['Close'].rolling(3).mean()
    kospi_df['MA5'] = kospi_df['Close'].rolling(5).mean()
    kospi_df['MA10'] = kospi_df['Close'].rolling(10).mean()
    kospi_df['MA20'] = kospi_df['Close'].rolling(20).mean()
    
    
    fig = plt.figure(figsize=(20,10))
    ax = fig.add_subplot(111)
    index = kospi_df.index.astype('str') # 캔들스틱 x축이 str로 들어감
    
    # 이동평균선 그리기
    ax.plot(index, kospi_df['MA3'], label='MA3', linewidth=0.7)
    ax.plot(index, kospi_df['MA5'], label='MA5', linewidth=0.7)
    ax.plot(index, kospi_df['MA10'], label='MA10', linewidth=0.7)
    
    # X축 티커 숫자 20개로 제한
    ax.xaxis.set_major_locator(ticker.MaxNLocator(10))
    
    # 그래프 title과 축 이름 지정
    ax.set_title('KOSPI INDEX', fontsize=22)
    ax.set_xlabel('Date')
    
    # 캔들차트 그리기
    candlestick2_ohlc(ax, kospi_df['Open'], kospi_df['High'], 
                      kospi_df['Low'], kospi_df['Close'],
                      width=0.5, colorup='r', colordown='b')
    ax.legend()
    plt.grid()
    plt.show()

     

    그래프 프레임 잡기

    일반적인 주가 그래프는 위의 사진과 같습니다.

    위쪽에는 일봉 캔들 차트가 아래에는 거래량 막대그래프가 위치합니다.

    matplotlibsubplot2grid 함수를 사용해서 구간을 나누어줍니다.

    fig = plt.figure(figsize=(20,10))
    top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
    bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4, sharex=top_axes)
    bottom_axes.get_yaxis().get_major_formatter().set_scientific(False) # 거래량 값 그대로 표현

    그래프 프레임

    주가 그래프를 넣을 top_axes 부분과 거래량을 넣을 bottom_axes 부분으로 총 2개 부분으로 나누어 그래프 구역을 설정하였습니다.

    여기서 구간을 나누는 방법인 rowspan과 colspan은 wikidocs에 설명이 더 잘 나와있으니 해당 부분을 참고하시면 좋을 것 같습니다.

    그림 출처 :  https://wikidocs.net/4765

    거래량 그래프

    우선 matplotlib에서 그래프를 그릴 때, 색깔을 설정하는 방법에 대해 알아보겠습니다.

    일단, 다음과 같이 실행을 하면 그래프에 색깔이 빨간색으로 입혀집니다.

    fig = plt.figure(figsize=(20,10))
    ax = fig.add_subplot(111)
    
    # 거래량 그래프
    ax.bar(index, kospi_df['Volume'], color='r')
    
    
    # 그래프 title과 축 이름 지정
    ax.xaxis.set_major_locator(ticker.MaxNLocator(10))
    ax.set_title('KOSPI Volume', fontsize=22)
    ax.set_xlabel('Date')
    
    plt.grid()
    plt.show()

    하지만 color = 'r' 또는 다른 색 'b', 'g' 등을 주더라도 단색으로만 표현됩니다.

    그래서 각 막대 별로 원하는 색깔을 주기 위해 각각 지정해주어야 합니다.

    이때, 형식은 color를 리스트 형식으로 넣습니다.

    example : color = ['r' , 'r', 'b', 'b', ... ] 이런 식으로 해주어야 각각 색깔을 다르게 지정할 수 있습니다.

     

    거래량 그래프에서 빨간색파란색 구분하기

    거래량 그래프는 전일 대비 거래량이 늘어나면 빨간색

    전일 대비 거래량이 감소하면 파란색으로 표현됩니다.

    # 색깔 구분을 위한 함수
    color_fuc = lambda x : 'r' if x >= 0 else 'b'
    
    # kospi 거래량의 차이 
    kospi_df['Volume'].diff().fillna(0) ## 첫 행은 값이 Nan이므로 0으로 채워줌
    
    # 색깔 구분을 위한 함수를 apply 시켜 Red와 Blue를 구분한다.
    color_df = kospi_df['Volume'].diff().fillna(0).apply(color_fuc)
    
    # 구분된 값을 list 형태로 만들어준다.
    color_list = list(color_df)
    
    >>>  ['r', 'b', 'r', 'b', 'r', 'r', 'b', 'r', 'b', 'b', ... 많음]
    1. DataFrame에서 diff() 매소드를 사용해서 차이를 구합니다.

    2. 차이가 0보다 크면 : 전일보다 거래량이 증가 >> 빨간색을 의미하는 'r'

    3. 차이가 0보다 작으면 : 전일대비 거래량이 감소한 것 >> 파란색 'b'

    4. 이것을 List 형태로 만들어 그래프 color에 지정해주면 됩니다.

    # 그래프를 그릴때, color = color_list를 넣어서 색깔을 지정함
    ax.bar(index, kospi_df['Volume'], color=color_list)

    여기까지 진행된 것

    현재까지 진행된 거래량 그래프를 그려보면 아래와 같습니다.

    fig = plt.figure(figsize=(20,10))
    ax = fig.add_subplot(111)
    
    # 거래량 그래프
    ax.bar(index, kospi_df['Volume'], color=color_list)
    ax.get_yaxis().get_major_formatter().set_scientific(False) # 거래량 값 그대로 표현
    
    # 그래프 title과 축 이름 지정
    ax.xaxis.set_major_locator(ticker.MaxNLocator(10))
    ax.set_title('KOSPI Volume', fontsize=22)
    ax.set_xlabel('Date')
    
    plt.grid()
    plt.show()

     

    최종 그래프 그리기 & 최종 소스코드 및 결과

    #----------------------------------------------------------------------------------#
    # 그래프 구역 나누기
    fig = plt.figure(figsize=(20,10))
    top_axes = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
    bottom_axes = plt.subplot2grid((4,4), (3,0), rowspan=1, colspan=4, sharex=top_axes)
    bottom_axes.get_yaxis().get_major_formatter().set_scientific(False)
    #----------------------------------------------------------------------------------#
    
    # 인덱스 설정
    idx = kospi_df.index.astype('str')
    
    # 이동평균선 그리기
    top_axes.plot(idx, kospi_df['MA3'], label='MA3', linewidth=0.7)
    top_axes.plot(idx, kospi_df['MA5'], label='MA5', linewidth=0.7)
    top_axes.plot(idx, kospi_df['MA10'], label='MA10', linewidth=0.7)
    
    # 캔들차트 그리기
    candlestick2_ohlc(top_axes, kospi_df['Open'], kospi_df['High'], 
                      kospi_df['Low'], kospi_df['Close'],
                      width=0.5, colorup='r', colordown='b')
    
    
    #----------------------------------------------------------------------------------#
    
    # 거래량 날짜 지정
    color_fuc = lambda x : 'r' if x >= 0 else 'b'
    color_list = list(kospi_df['Volume'].diff().fillna(0).apply(color_fuc))
    bottom_axes.bar(idx, kospi_df['Volume'], width=0.5, 
                    align='center',
                    color=color_list)
    #----------------------------------------------------------------------------------#
    
    # 그래프 title 지정
    top_axes.set_title('KOSPI INDEX', fontsize=22)
    # X축 티커 숫자 20개로 제한
    top_axes.xaxis.set_major_locator(ticker.MaxNLocator(10))
    # X축 라벨 지정
    bottom_axes.set_xlabel('Date', fontsize=15)
    
    top_axes.legend()
    plt.tight_layout()
    plt.show()

    위에서 만들었던 Frame에 기존 소스코드와 거래량 막대 바 그래프를 집어넣으면 완성됩니다.

    이렇게 하여 python을 사용하여 캔들스틱 차트와 거래량 그래프를 함께 그려보는 방법을 알아보았습니다.

    KOSPI 지수 이외에도 코스닥 지수 또는 다른 종목들도 위와 같이 그래프를 그려볼 수 있습니다.

    다른 주식들의 데이터를 가져오는 방법은 이전 글을 통해서 확인할 수 있습니다.

    [Python] pandas_datareader 코스피 코스닥 지수 데이터 가져오기 // 파이썬 주식투자(1)

    반응형

    관련된 글 보기

    Comments