토이프로젝트/기본주식분석

한국주식 kospi kosdaq ADR 그래프 (매일업데이트 / matplotlib 그래프예제)

. . . 2022. 6. 14. 08:56
반응형

아래의 ADR 은 직접계산하여 제공한다.

  • 히스토리
    • 2022-07-01 서비스시작
    • 2022-08-08 정상복구 완료
    • 2022-08-16 미동작관련 서비스재가동
    • 2022-08-31 직접 adr 계산값으로 변경완료

없으면 만든다.

  1. 직접크롤링하여 그래프를 그린다.
  2. 매일 자동으로 업데이트 된다. (업데이트시간 : 18시)
    1. 이미지상단에 업데이트 시간확인가능
    2. 1일 1회 장끝난 시점에서 그림
  3. 마커를 통해서 상세수치 확인 가능

...

  • 특이사항
    • 일반적으로 20일 기준으로 사용하는것 같아 20일 기준으로 계산.
    • 직접 계산한 ADR값은 유진투자증권과 http://www.adrinfo.kr/ 에서 제공하고있는 값하고는 달랐다.
    • 위의 사이트들과의 오차는 대략 1 ~ 4 사이였다. (그정도의 오차는 크게 의미없는 수치라고 생각한다.)
    • 기존사이트 adr제공 사이트들는 어떻게 계산을 하는지에 대한코드가 공개되지 않은상태 이다보니 기존사이트와 데이터가 완벽하게 동일하지는 않다.
    • 계산식은 일정기간의 상승종목수 / 일정기간의 하락종목수 * 100 으로 계산 하였으므로, 기존사이트의 데이터와 수치가 약간 차이나는건 크게 의미를 두지 않아도 될듯.

1 ADR 그래프

본포스팅의 그래프는 항상 최신으로 업데이트 된다.

1.1 kospi ADR 1년치 그래프

https://raw.githubusercontent.com/kksworks/stock_data_asset/master/adr_graph/adr_kospi_daily.png

kospi ADR

1.2 kosdaq ADR 1년치 그래프

https://raw.githubusercontent.com/kksworks/stock_data_asset/master/adr_graph/adr_kosdaq_daily.png

kosdaq ADR

2 구글시트에 ADR 넣기

위의 이미지를 구글시트에 실시간 ADR 차트를 넣을수 있다.

=IMAGE("https://raw.githubusercontent.com/kksworks/stock_data_asset/master/adr_graph/adr_kospi_daily.png",3)
=IMAGE("https://raw.githubusercontent.com/kksworks/stock_data_asset/master/adr_graph/adr_kosdaq_daily.png",3)

3 그래프 만드는 파이썬코드

위의 그래프는 직접 파이썬으로 작성하였다.

관련코드는 다음과같다. (전체코드는 다 공개는 못하지만, 대략적인 주석으로 참고는 가능할듯)

def mk_adr_graph(adr_type) :
    _log_ctx.dbg('start...')
    y_axis = []
    x_axis = []

    session = base.Session()
    adr_infos = session.query(stockADRInfo).filter(stockADRInfo.adr_type == adr_type).order_by(stockADRInfo.기준일.asc()).limit(300).all()
    for adr_info in adr_infos:
        y_axis.append(adr_info.adr_val)
        x_axis.append(adr_info.기준일)


    # 그림 관련 기본생성..
    fig, ax = plt.subplots(figsize=(5, 2.5))
    plt.plot(x_axis, y_axis, linewidth=0.5)

    # x 축을 datetime 으로 변경..
    dateFmt = mdates.DateFormatter('%y-%m-%d')

    # 3. x축 레이블을 포맷팅한다.
    ax.xaxis.set_major_formatter(dateFmt)

    # x축 라벨 45도로 돌림
    plt.xticks(fontsize=5)
    plt.yticks(fontsize=5)

    # 그리드 돌림
    plt.grid(True,linewidth=0.3, linestyle='--')
    # plt.show()

    # 각종 텍스트 라벨설정
    plt.title('{adr_type} ADR 차트 :: {start_day} ~ {end_day}'.format(adr_type=adr_type, start_day=x_axis[0].strftime('%y-%m-%d'), end_day=x_axis[-1].strftime('%y-%m-%d')),fontsize=6)
    plt.xlabel('날짜',fontsize=4)
    plt.ylabel('ADR Value',fontsize=4)

    plt.ylim([30, 160])      # X축의 범위: [xmin, xmax]
    # plt.ylim([0, 5])      # X축의 범위: [xmin, xmax]

    # max 좌표
    ymax = max(y_axis)
    xpos = y_axis.index(ymax)
    xmax = x_axis[xpos]

    ax.annotate('{ymax}\n({xmax})'.format(ymax=ymax, xmax=xmax.strftime('%y-%m-%d')), xy=(xmax, ymax), xytext=(xmax, ymax+15),
                arrowprops=dict(color='blue', linewidth=0.6, arrowstyle='->'),transform=ax.transAxes, ha='center', va='center', fontsize=5
                )

    # min 좌표
    ymin = min(y_axis)
    xpos = y_axis.index(ymin)
    xmin = x_axis[xpos]

    ax.annotate('{ymin}\n({xmin})'.format(ymin=ymin,xmin=xmin.strftime('%y-%m-%d')), xy=(xmin, ymin), xytext=(xmin, ymin-15),
                arrowprops=dict(color='red', linewidth=0.6, arrowstyle='->'),transform=ax.transAxes, ha='center', va='center', fontsize=5
                )

    # last 좌표
    ylast = y_axis[-1]
    xpos = y_axis.index(ylast)
    xlast = x_axis[xpos]

    ax.annotate('{ylast}\n({xlast})'.format(ylast=ylast,xlast=xlast.strftime('%y-%m-%d')), xy=(xlast, ylast), xytext=(xlast, ylast-10),
                arrowprops=dict(color='green', linewidth=0.6, arrowstyle='->'),transform=ax.transAxes, ha='center', va='center', fontsize=5
                )

    # 보조선
    plt.axhline(y=120, color='purple', linewidth=0.3, linestyle='--', label='120')
    # ax.annotate('60', xy=(x_axis[-1], 60),xytext=(x_axis[-1], ylast-10),transform=ax.transAxes)
    plt.axhline(y=70, color='orange', linewidth=0.3, linestyle='-.', label='70')
    plt.axhline(y=60, color='red', linewidth=0.3, linestyle='--', label='60')

    # 보조선 설명박스
    plt.legend(loc='upper left', fontsize=5 );

    # 텍스트
    suffix_str = ''
    cur_time = datetime.datetime.today().strftime('%Y%m%d %H:%M')
    cur_info = '갱신일시 : {cur_time}'.format(cur_time=cur_time)
    #    adr_last_str += str(cur_adr_infos[adr_type]['current_time']) + ' '
    #    adr_last_str += cur_adr_infos[adr_type]['current_adr'] + ' '
    #    adr_last_str += cur_adr_infos[adr_type]['current_diff'] + ' '
    plt.gcf().text(0.1,0.95, cur_info, color='blue', fontsize=5,transform=ax.transAxes)
    suffix_str = 'daily'
    # 하단에 여백 강제설정
    plt.gcf().subplots_adjust(bottom=0.20)

    # 파일저장하기

    target_path = str(pathlib.PurePath(config.working_path,'public', 'adr_{adr_type}_{suffix_str}.png'.format(adr_type=adr_type,suffix_str=suffix_str)))
    _log_ctx.dbg('save target :: ' + target_path)
    try:
        plt.savefig(target_path, dpi=500, bbox_inches='tight', pad_inches=0.09)
    except Exception as e:
        _log_ctx.err('image save  fail....')
        _log_ctx.err(e)

    _log_ctx.dbg('success??? ')

    return True

...

...

반응형