코스피 언택트 삼대장(네이버 카카오 엔씨), 과연 실적 발표 직후 주가는 어떤 모습을 보였을까?
주가 데이터 시각화 (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.
코로나 등 제작자의 추가적인 정보 삽입을 효과적으로 표현해낼 것
→ 코로나로 인한 주식 하락 기간은 다른 색으로 하이라이팅하고 설명 주석을 삽입
차트를 만드는 코드는 다음과 같습니다.
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
복사