💸

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

🐜
코스피 언택트 삼대장(네이버 카카오 엔씨), 과연 실적 발표 직후 주가는 어떤 모습을 보였을까?
주가 데이터 시각화 (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
Today