웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

 

 

저번 시간에 pandas를 이용하여 한국 거래소(KRX)의 주식 종목 코드를 가져왔었는데요,

이번에는 코스피(KOSPI), 코스닥(KODAQ) 주식 종목 코드를 이용하여 원하는 회사의 주식 정보를 가져와보려 합니다.

 

https://wendys.tistory.com/173 - Pandas를 이용하여 주식 종목 코드 가져오기

 

코드는 저번시간에 이어서 계속 진행해보도록 하겠습니다.

주식 데이터를 가져올 수 있는 곳은 한정적입니다. 네이버의 데이터는 크롤링이 거부되어있기 때문에 언제든지 막힐 수 있고, 증권사의 API를 이용하기 위해서는 증권사 프로그램을 PC에 설치해야 하는 번거로움이 있기 때문에 간편하게 Yahoo Finance의 데이터를 이용하도록 하겠습니다.

# pandas datareader를 설치합니다.
pip install pandas-datareader

 

Pandas Data Reader를 통해서 Yahoo Finace의 데이터를 가져오기위해서는 두 가지 방법이 존재합니다.

import pandas_datareader as pdr

# 1번 방법
# DataReader API를 통해서 yahoo finance의 주식 종목 데이터를 가져온다.
df = pdr.DataReader('주식 종목코드', 'yahoo')

# 2번 방법
# get_data_yahoo API를 통해서 yahho finance의 주식 종목 데이터를 가져온다.
df = pdr.get_data_yahoo('주식 종목코드')

# 선택적으로 일정 기간동안의 주식 정보를 가져오는 방법입니다.
from datetime import datetime

start = datetime(2018,1,1)
end = datetime(2019,12,31)

df = pdr.DataReader('주식 종목코드', 'yahoo', start, end)
df = pdr.get_data_yahoo('주식 종목코드', start, end)

 

1번의 경우엔 parameter에 'yahoo', 'google' 등 직접 입력을 통하여 데이터를 가져오는 방법으로 동적으로 사용할 때 주로 사용하는 방법입니다.

2번의 경우엔 get_data_yahoo라는 API를 입력하여 yahoo finance에 대한 데이터만을 획득할 필요가 있을 때 사용하는 방법입니다.

저는 여기서 yahoo의 데이터만이 필요하기때문에 get_data_yahoo API를 이용할 예정이지만 보시는 분들은 편하신 방법으로 개발을 하면 됩니다. get_data_yahoo 외에도 다양한 API가 존재하니 Pandas Data Reader API 문서를 참고하세요

 

pandas datareader를 이용하여 '삼성전자' 주식 데이터 가져오기

코드 라인에 주석을 달아놔서 보기 어렵지 않을거에요

몇 줄 되지도 않는 코드를 이용하여 국내 모든 주식의 종목 코드를 가져왔으며, 종목 코드에 대해 주식 정보까지 가져올 수 있습니다. get_code 항목에 '삼성전자' 대신 다른 종목을 입력해도 됩니다.

import pandas as pd
import pandas_datareader as pdr

# 회사명으로 주식 종목 코드를 획득할 수 있도록 하는 함수
def get_code(df, name):
  code = df.query("name=='{}'".format(name))['code'].to_string(index=False)
  
  # 위와같이 code명을 가져오면 앞에 공백이 붙어있는 상황이 발생하여 앞뒤로 sript() 하여 공백 제거
  code = code.strip()
  return code

# excel 파일을 다운로드하는거와 동시에 pandas에 load하기
# 흔히 사용하는 df라는 변수는 data frame을 의미합니다.
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download', header=0)[0]

# data frame정리
code_df = code_df[['회사명', '종목코드']]

# data frame title 변경 '회사명' = name, 종목코드 = 'code'
code_df = code_df.rename(columns={'회사명': 'name', '종목코드': 'code'})

# 종목코드는 6자리로 구분되기때문에 0을 채워 6자리로 변경
code_df.code = code_df.code.map('{:06d}'.format)

# ex) 삼성전자의의 코드를 구해보겠습니다.
code = get_code(code_df, '삼성전자')

# yahoo의 주식 데이터 종목은 코스피는 .KS, 코스닥은 .KQ가 붙습니다.
# 삼성전자의 경우 코스피에 상장되어있기때문에 '종목코드.KS'로 처리하도록 한다. 
code = code + '.KS'

# get_data_yahoo API를 통해서 yahho finance의 주식 종목 데이터를 가져온다.
df = pdr.get_data_yahoo(code)

 

코드를 실행하게 되면 삼성전자의 code 정보를 가져와서 yahoo finance를 통해 삼성전자의 주식 정보를 가져오게 됩니다. 기간을 따로 입력하지 않았기 때문에 전체 데이터를 가져오게 되며, 만약 특정 날짜 혹은 일정 기간 동안의 데이터만 필요한 경우 datetime을 이용해 날짜 정보를 입력하여 가져오면 됩니다.

 

 

삼성전자의 2010-01-04 데이터부터 2019-12-26 현재 데이터까지 모두 잘 가져온 것을 확인할 수 있습니다.

정보를 잘 가져온것을 확인했으니 간단하게 그래프로 표시를 해보겠습니다. pandas에서는 기본적인 시각화가 포함되어있기 때문에 plot() API 한방으로 그래프를 표시할 수 있습니다.

 

 

# 현재 data frame에서 Close(종가) 기준으로 그래프를 생성
df['Close'].plot()

 

저희에겐 모든 종목의 코드가 있으니 힘들게 '삼성전자' 등을 입력하는 게 아니라 loop를 돌면서 처리가 가능합니다.

 

주식 데이터 가져오기 최종 수정 코드

위의 코드의경우 코스닥 종목인지 코스피 종목인지 판단이 안되기때문에 아래와같이 코스피, 코스닥 정보를 각각 획득하여 데이터를 가공 후 다시 정렬하는 방법으로 처리해보겠습니다.

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)

위와 같이 처리하여 코스피, 코스닥의 종목을 구분해야하는 오류를 줄일 수 있게 되었습니다.

위의 코드는 구글 콜라보레이토리에서 테스트가 진행되었습니다.

 

Sample Code - Google Colaboratory

https://colab.research.google.com/drive/1gpprolLgZYreQ_gf0nZ-eeiRKoOfirOB

 

Google Colaboratory

 

colab.research.google.com

 

반응형