재테크/투자 팁

[Python] 한국거래소 XML서비스로 주가 정보 가져오기

LittleFox 2020. 8. 17. 15:21

** 깃허브에서 코드 열기 **

https://github.com/seungyounglim/LittleFox_Investment/blob/master/2020_08_17_%ED%95%9C%EA%B5%AD%EA%B1%B0%EB%9E%98%EC%86%8C_%EC%A3%BC%EA%B0%80%EC%A0%95%EB%B3%B4_%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0.ipynb

 

seungyounglim/LittleFox_Investment

Contribute to seungyounglim/LittleFox_Investment development by creating an account on GitHub.

github.com


한국거래소 기업/시세 공시 정보 제공 서비스

한국거래소에서는 기업정보와 시장 정보를 XML 형태로 제공하고 있다. 제공 서비스 URL은 아래와 같다. (참고)

 

 1. 실시간시세_국문: http://asp1.krx.co.kr/servlet/krx.asp.XMLSise?code=단축종목코드
 2. 실시간시세_영문: http://asp1.krx.co.kr/servlet/krx.asp.XMLSiseEng?code=단축종목코드
 3. 공시정보_국문    : http://asp1.krx.co.kr/servlet/krx.asp.DisList4MainServlet?code=단축코드&gubun=K
 4. 공시정보_영문    : http://asp1.krx.co.kr/servlet/krx.asp.DisList4MainServlet?code=단축코드&gubun=E 

 5. 재무종합_국문    : http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu?code=단축종목코드
 6. 재무종합_영문    : http://asp1.krx.co.kr/servlet/krx.asp.XMLJemuEng?code=단축종목코드
 7. 재무종합2_국문 : http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu2?code=단축종목코드
 8. 재무종합3_국문 : http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu3?code=단축종목코드
 9. 텍스트 : http://asp1.krx.co.kr/servlet/krx.asp.XMLText?code=단축종목코드

 


종목 주가정보 가지고 오기

먼저 필요한 라이브러리를 불러오고, 필요한 사전을 다음과 같이 정의해둔다.

 

import collections
import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup

DungRak_map = {"1":"상한","2":"상승","3":"보합","4":"하한","5":"보합"}
mapping = {"JongName":"종목명","CurJuka":"현재가","Debi":"전일대비","DungRak":"등락","PrevJuka":"전일종가","Volume":"거래량","Money":"거래대금","StartJuka":"시가","HighJuka":"고가","LowJuka":"저가","High52":"52주최고","Low52":"52주최저","UpJuka":"상한가","DownJuka":"하한가","Per":"PER","Amount":"상장주식수","FaceJuka":"액면가"}
daily_mapping = {"day_Date":"일자","day_EndPrice":"종가","day_getDebi":"전일대비","day_Dungrak":"전일대비(등락)","day_Start":"시가","day_High":"고가","day_Low":"저가","day_Volume":"거래량","day_getAmount":"거래대금"}
ask_mapping = {"member_memdoMem":"매도상위 증권사","member_memdoVol":"매도 거래량", "member_memsoMem":"매수상위 증권사", "member_mesuoVol":"매수 거래량"}

 

한국거래소에서 제공하는 URL은 종목의 단축 종목코드를 통해 조회할 수 있다. 단축 종목코드는 구글에 검색하면 알 수 있다.

예를 들어 현대차의 종목코드는 005380이다. 이 종목의 정보를 가지고 오는 코드는 다음과 같다.

 

STOCK_CODE = "005380"

url="http://asp1.krx.co.kr/servlet/krx.asp.XMLSiseEng?code={}".format(STOCK_CODE)
result=urlopen(url).read()
xmlsoup=BeautifulSoup(result,"lxml-xml")

 

STOCK_CODE 변수에 조회하고자 하는 종목 코드를 입력하고, 위 코드를 실행하면 시세 정보를 받아와 xmlsoup에 저장한다.

 

 실시간 주가정보 가지고 오기

stock = xmlsoup.find("TBL_StockInfo")

df_data = collections.OrderedDict()
for k, v in stock.attrs.items():
  if k == "DungRak": v = DungRak_map[v]
  df_data[mapping[k]] = v
stock_df=pd.DataFrame(df_data, index=[0])
stock_df=stock_df.applymap(lambda x: x.replace(",",""))

stock_df

 

받아온 정보 중 실시간 시세 관련 항목은 "TBL_StockInfo"에서 찾을 수 있다.

위 코드는 영문으로 된 항목을 한글로 변환하고, XML에서 관련 정보를 읽어 pandas 테이블로 저장하는 코드이다.

 

 

현대차 시세 관련 정보를 정상적으로 받아온 것을 확인할 수 있다.

 

<XML로 조회한 실시간 시세 정보>

 

 일별 시세 가지고 오기

daily_stock = xmlsoup.find("TBL_DailyStock")
daily_stock = daily_stock.find_all("DailyStock")

reverse_dict = {v:k for k, v in daily_mapping.items()}
daily_stock_df = collections.OrderedDict({k:[] for k in list(daily_mapping.values())})
for dat in daily_stock:
  for k in daily_stock_df.keys():
    if reverse_dict[k] in dat.attrs:
      v = dat.attrs[reverse_dict[k]]
      if reverse_dict[k] == "day_Dungrak": v = DungRak_map[v]
    else:
      v = "None"
    daily_stock_df[k].append(v)

daily_stock_df=pd.DataFrame(daily_stock_df)

 

일별 시세는 "TBL_DailyStock" 항목에서 가지고 올 수 있다.

위의 코드를 실행하면 최근 10일간의 주가 변동과 거래량 추이를 볼 수 있다.

 

<XML로 조회한 일별 주가 정보>

 

 매도/매수 상위 증권사 정보

ask_price = xmlsoup.find("TBL_AskPrice")
ask_price = ask_price.find_all("AskPrice")

reverse_dict = {v:k for k, v in ask_mapping.items()}
ask_price_df = collections.OrderedDict({k:[] for k in list(ask_mapping.values())})
for dat in ask_price:
  for k in ask_price_df.keys():
    if reverse_dict[k] in dat.attrs:
      v = dat.attrs[reverse_dict[k]]
    else:
      v = "None"
    ask_price_df[k].append(v)

ask_price_df=pd.DataFrame(ask_price_df)

 

매도/매수 상위 증권사 정보는 "TBL_AskPrice" 항목에서 가지고 올 수 있다.

 

 

<XML로 조회한 상위 매도/매수 증권사와 거래량>


다른 정보 가져오기

이번에는 재무정보를 가지고 오기 위해 다른 URL 링크를 사용해보았다.

 

URL_LINK = {
 "실시간시세_국문": "http://asp1.krx.co.kr/servlet/krx.asp.XMLSise?code={}" ,
 "실시간시세_영문": "http://asp1.krx.co.kr/servlet/krx.asp.XMLSiseEng?code={}" ,
 "공시정보_국문"    : "http://asp1.krx.co.kr/servlet/krx.asp.DisList4MainServlet?code={}&gubun=K" ,
 "공시정보_영문"    : "http://asp1.krx.co.kr/servlet/krx.asp.DisList4MainServlet?code={}&gubun=E" ,
 "재무종합_국문"    : "http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu?code={}",
 "재무종합_영문"    : "http://asp1.krx.co.kr/servlet/krx.asp.XMLJemuEng?code={}",
 "재무종합2_국문" : "http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu2?code={}",
 "재무종합3_국문" : "http://asp1.krx.co.kr/servlet/krx.asp.XMLJemu3?code={}",
 "텍스트" : "http://asp1.krx.co.kr/servlet/krx.asp.XMLText?code={}"
}

def get_url (STOCK_CODE , TYPE):
  result=urlopen(URL_LINK[TYPE].replace("{}", STOCK_CODE)).read()
  return result

 

종목 코드와 가지고 오고싶은 정보 종류를 입력받아 XML을 리턴하는 함수이다.

하지만 "실시간시세_영문"을 제외하고는 의미 있는 정보를 주는 URL이 없었다.