💸

파이썬과 주식 데이터 - 실적 발표 시즌 언택트 삼대장 주가 비교

코스피 언택트 삼대장(네이버 카카오 엔씨), 과연 실적 발표 직후 주가는 어떤 모습을 보였을까?

주가 데이터 시각화 (plot.ly 패키지로 인터렉티브 그래프 제작)

*파이썬 코드는 포스팅 하단부에 공유했습니다
마우스를 드래그하면 드래그 부분 확대
(더블클릭하면 다시 화면 돌아 옴)
가격 데이터에 마우스를 올리면 자세한 날짜와 가격 확인 가능
주황색하이라이트 부분이 실적 발표 기간임
주가 데이터 보기 (마우스를 대보세요)

파이썬(판다스 패키지)을 통한 주식 데이터 불러오기

주가 데이터는 직접 크롤러를 만들어도 되지만, 수요가 많은 만큼 시중에는 다양한 데이터 소환 패키지가 있습니다.
하지만 저는 익숙한 판다스 데이터리더 pandas-datareader 패키지를 사용해보았습니다.
아래 순서대로 잘 따라와주시면 원하는 국내 주식 데이터를 데이터프레임으로 불러 올 수 있습니다.
1.
패키지 설치
pip install pandas-datareader 혹은 conda install pandas-datareader 등을 통해 패키지 설치를 완료해주세요.
2.
아래 세팅 코드 입력 - *코드 참고 사이트 링크
import pandas as pd import pandas_datareader as pdr # 종목 타입에 따라 download url이 다름. 종목코드 뒤에 .KS .KQ등이 입력되어야해서 Download Link 구분 필요 stock_type = { 'kospi': 'stockMkt', 'kosdaq': 'kosdaqMkt' } # 회사명으로 주식 종목 코드를 획득할 수 있도록 하는 함수 def get_code(df, name): code = df.query("name=='{}'".format(name))['code'].to_string(index=False) # 위와같이 code명을 가져오면 앞에 공백이 붙어있는 상황이 발생하여 앞뒤로 sript() 하여 공백 제거 code = code.strip() return code # download url 조합 def get_download_stock(market_type=None): market_type = stock_type[market_type] download_link = 'http://kind.krx.co.kr/corpgeneral/corpList.do' download_link = download_link + '?method=download' download_link = download_link + '&marketType=' + market_type df = pd.read_html(download_link, header=0)[0] return df; # kospi 종목코드 목록 다운로드 def get_download_kospi(): df = get_download_stock('kospi') df.종목코드 = df.종목코드.map('{:06d}.KS'.format) return df # kosdaq 종목코드 목록 다운로드 def get_download_kosdaq(): df = get_download_stock('kosdaq') df.종목코드 = df.종목코드.map('{:06d}.KQ'.format) return df # kospi, kosdaq 종목코드 각각 다운로드 kospi_df = get_download_kospi() kosdaq_df = get_download_kosdaq() # data frame merge code_df = pd.concat([kospi_df, kosdaq_df]) # data frame정리 code_df = code_df[['회사명', '종목코드']] # data frame title 변경 '회사명' = name, 종목코드 = 'code' code_df = code_df.rename(columns={'회사명': 'name', '종목코드': 'code'}) # 삼성전자의 종목코드 획득. data frame에는 이미 XXXXXX.KX 형태로 조합이 되어있음 code = get_code(code_df, '삼성전자') # get_data_yahoo API를 통해서 yahho finance의 주식 종목 데이터를 가져온다. df = pdr.get_data_yahoo(code)
Python
복사
3.
원하는 주식 종목명을 삽입하여 df로 추출
code = get_code(code_df, 'NAVER') df = pdr.get_data_yahoo(code)
Python
복사
4.
원하는 결과 확인 : 기본적으로 6년 간의 주식 데이터를 로드해줍니다. 원한다면 기간은 잘라낼 수 있습니다.
Close 칼럼을 통해 그날 종가를 기준으로 셈하면 무난합니다.
2015년이 아닌, 2019년부터 데이터를 보고 싶다면?
df = df.loc[df.index > "2019-01-01"]
Python
복사

plot.ly 패키지를 통한 인터렉티브 시각화

이번 시각화의 핵심은 아래 두 가지 였습니다.
1.
전체 주가 흐름 속에서도 효과적으로 실적발표 기간 주가를 확인할 수 있을 것
→ 일단 주가 데이터를 쫙 깔고 배경 하이라이트를 통해서 실적발표 기간을 표기
2.
코로나 등 제작자의 추가적인 정보 삽입을 효과적으로 표현해낼 것
→ 코로나로 인한 주식 하락 기간은 다른 색으로 하이라이팅하고 설명 주석을 삽입
차트를 만드는 코드는 다음과 같습니다.
1.
패키지 세팅 (plotly)
# api key 꺼낸다 import chart_studio chart_studio.tools.set_credentials_file(username='내 아이디', api_key='내 API KEY') from chart_studio.plotly import plot, iplot
Python
복사
인터렉티브 그래프를 추출해 노션 등에 삽입하는 방법은 아래 포스팅을 참고해주세요.
2.
실적발표 시즌을 정의하기
인터넷 기사를 확인하면서 각 분기마다 각 기업이 실적발표하는 때를 알아야 합니다.
예를 들어 네이버는 다음과 같았습니다.
quarterly = [ '2019-01-23', # 작년 4분기는 다음해 1월 말 ~ 2월 초 사이에 '2019-02-08', '2019-04-22', # 그해 1분기는 끝난 다음달(4월) 말 ~ 다다음달(5월) 초 사이에 '2019-05-10', '2019-07-23', # 마찬가지로 비슷 '2019-08-09', '2019-10-23', '2019-11-08', '2020-01-23', '2020-02-10', '2020-04-22', '2020-05-08', '2020-07-21', # 아직 2020년 2분기 발표가 다가오지 않은 시점이기 때문에 예외처리를 위해 데이터 삽입 '2020-07-22' ]
Python
복사
카카오나 엔씨소프트 역시 날짜가 조금 달라서 조금씩 수정해주었습니다.
다만 1월 23일부터 2월 8일 사이의 모든 날짜 (1월 24일, 25일 ...) 를 모두 리스트에 넣을 필요는 없습니다.
아래 코드를 통해 위 quarterly 리스트의 날짜들을 짝지어 실적발표 시즌의 시작과 끝을 표기할 것이기 때문입니다.
shape_list = [] # 실적발표 기간을 나타내는 하이라이팅을 담당해 줄 dict 데이터를 리스트 변수에 담는다. for num in range(0,len(quarterly), 2): shape_list.append(dict( type="rect", xref="x", yref="paper", x0=quarterly[num], y0=0, x1=quarterly[num+1], y1=1, fillcolor="LightSalmon", opacity=0.3, layer="below", line_width=0, ))
Python
복사
이번 포스팅에서는 코로나 기간도 추가할 것이므로 기왕 shape_list를 만든 거, 코로나 기간도 임의로 지정해 딕셔너리 데이터(dict)를 추가해줍니다.
# 코로나 구간 추가 shape_list.append(dict( type="rect", xref="x", yref="paper", x0="2020-02-25", y0=0, x1="2020-04-20", y1=1, fillcolor="LightSeaGreen", opacity=0.3, layer="below", line_width=0) )
Python
복사
3.
이제 plotly의 go.Figure 문법을 통해 그래프를 만들어줍니다.
import plotly.graph_objects as go # 원하는 회사 주식 불러오기 company = "NAVER" code = get_code(code_df, company) df = pdr.get_data_yahoo(code) df = df.loc[df.index > "2019-01-01"] # 너무 길 필요 없이 2019년부터만 보기 df = df.reset_index() # Date가 인덱스로 뽑히는데, 이를 칼럼으로 사용하려고 빼둠 fig = go.Figure() # 주식 데이터 쫙 깔고 fig.add_trace(go.Scatter(x=df['Date'], y=df['Close'], mode='lines+markers', marker=dict(size=1))) # 실적 발표 기간 하이라이팅 fig.update_layout(title=f'{company}의 실적 발표 시즌 주가 변동', shapes=shape_list) # 코로나 주석 텍스트 추가 fig.add_trace(go.Scatter(x=["2020-03-15"], y=[100000], text = "코로나 영향 주가 하향 기간", mode="text")) # html 익스포팅 코드 - 나만 보려면 안 써도 됩니다. plot(fig, filename = f'{company} 실적 발표 무렵 주가', auto_open=True) fig.show()
Python
복사
김문과의 데이터
직접 공부한 데이터 분석 · 활용법을 기록합니다.
포스팅에 대한 Q&A 및 다양한 논의를 기다립니다. contact or email