/ ALGORITHMIC-TRADING

KRX에서 종목코드 가져오기1

1. 홈페이지 둘러보기

먼저 KRX 홈페이지(https://kind.krx.co.kr/) 를 방문하여 ‘상장법인상세정보’/ ‘상장법인목록’ 화면으로 이동한다.
(또는 [다음] 링크를 클릭한다.)

‘EXECEL’ 버튼을 클릭하면 전체 상장법인 목록을 다운받을 수 있다.

다운로드한 파일은 ‘xls’ 확장자를 가지고 있지만 html 포맷이다.

우리는 파이썬 코드로 위 목록을 가져와 pandas 데이터프레임으로 변환하고자 한다.

다시 돌아와서 상장법인 목록을 다운로드 하는 방식을 살펴보자.
‘시장구분’, ‘검색유형’ 등과 같은 범주를 설정하고 ‘EXCEL’ 버튼을 클릭하면 해당 범주에 해당하는 법인목록이 다운로드 되는 방식이다.
설정항목을 수정하지 않고 EXCEL 버튼을 클릭하면 전체 상장법인 목록이 다운로드 된다.

크롬에서 해당 페이지를 열고 ‘상장법인목록’ 부분을 마우스 우클릭하고, ‘검사’ 항목을 선택하자.

검색 항목의 소스를 확인할 수 있다.

요약하면 ‘searchForm’이라고 하는 양식을 통해서 추출 조건을 지정한다. 그리고 ‘post’를 사용해서 데이터 추출을 요청한다.
추출 처리를 담당하는 서버의 주소는 ‘http://kind.krx.co.kr/corpgeneral/corpList.do’ 이다.

그리고 ‘EXCEL’ 버튼을 클릭했을 때, 동작하는 메커니즘을 살펴보자.

버튼을 클릭하면 ‘fnDownolad()’ 함수를 호출한다.
이 함수는 searchForm에 설정된 조건대로 데이터를 다운로드 하도록 서버 프로그램에 요청하는 함수이다.

2. 추출하기

다운되는 종목코드 파일이 html 형식이므로 pandas의 read_html 함수를 사용한다.

read_html의 인자에 다운로드를 요청할 url을 지정하면 된다.
서버의 url 뒤에 ‘?’로 url의 끝을 표시하고 데이터(검색조건)를 추가하면 된다.

주요 조건은 다음과 같다.

  • method: 메서드, 예시) ‘download’
  • orderMode:정렬컬럼, 예시) ‘1’,
  • orderStat: 정렬 내림차순, 예시) ‘D’
  • searchType: 검색유형, 예시) ‘13’(상장법인)
  • fiscalYearEnd: 결산원, 예시) ‘all’(전체)
  • location: 지역, 예시) ‘all’(전체)

여기서는 다음과 같이 설정한다. (나머지는 default 값 적용)

url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13'
import pandas as pd
import numpy as np
import os
stock_code = pd.read_html(url, header = 0)[0] # 주의 : [0]을 반드시 추가. read_html은 table들을 읽어 리스트로 저장함
stock_code.head()
회사명 종목코드 업종 주요제품 상장일 결산월 대표자명 홈페이지 지역
0 DL 210 기타 금융업 지주회사 1976-02-02 12월 전병욱 http://www.dlholdings.co.kr 서울특별시
1 DRB동일 4840 고무제품 제조업 고무벨트(V벨트,콘베이어벨트,평벨트),프라스틱제품 제조,판매 1976-05-21 12월 류영식 http://drbworld.com 부산광역시
2 DSR 155660 1차 비철금속 제조업 합섬섬유로프 2013-05-15 12월 홍석빈 http://www.dsr.com 부산광역시
3 GS 78930 기타 금융업 지주회사/부동산 임대 2004-08-05 12월 허태수, 홍순기 (각자 대표이사) NaN 서울특별시
4 GS글로벌 1250 상품 종합 도매업 수출입업(시멘트,철강금속,전기전자,섬유,기계화학),상품중개,광업,채석업/하수처리 서... 1976-06-26 12월 김태형 http://www.gsgcorp.com 서울특별시

국내 주식시장의 종목코드는 6자리 이다. 예를 들어 ‘DL’의 종목코드는 000210이다.
그런데 저장된 종목코드는 앞자리 0이 생략되어 있다. map함수로 6자리를 완성한다.

# 종목코드가 6자리이기 때문에 6자리를 맞춰주기 위해 설정해줌
stock_code['종목코드'] = stock_code['종목코드'].map('{:06d}'.format)
stock_code.head()
회사명 종목코드 업종 주요제품 상장일 결산월 대표자명 홈페이지 지역
0 DL 000210 기타 금융업 지주회사 1976-02-02 12월 전병욱 http://www.dlholdings.co.kr 서울특별시
1 DRB동일 004840 고무제품 제조업 고무벨트(V벨트,콘베이어벨트,평벨트),프라스틱제품 제조,판매 1976-05-21 12월 류영식 http://drbworld.com 부산광역시
2 DSR 155660 1차 비철금속 제조업 합섬섬유로프 2013-05-15 12월 홍석빈 http://www.dsr.com 부산광역시
3 GS 078930 기타 금융업 지주회사/부동산 임대 2004-08-05 12월 허태수, 홍순기 (각자 대표이사) NaN 서울특별시
4 GS글로벌 001250 상품 종합 도매업 수출입업(시멘트,철강금속,전기전자,섬유,기계화학),상품중개,광업,채석업/하수처리 서... 1976-06-26 12월 김태형 http://www.gsgcorp.com 서울특별시

분석에 필요한 컬럼만 추출하고, 컬럼명을 영어로 수정한다.

stock_code = stock_code[['회사명', '종목코드', '업종', '주요제품', '상장일', '결산월']]
stock_code = stock_code.rename(columns = {'회사명': 'name', '종목코드': 'code', '업종': 'sectors','주요제품': 'products',
                                         '상장일': 'listing_date', '결산월': 'closing_date'})
stock_code['listing_date'] = pd.to_datetime(stock_code['listing_date'])
stock_code.head()
name code sectors products listing_date closing_date
0 DL 000210 기타 금융업 지주회사 1976-02-02 12월
1 DRB동일 004840 고무제품 제조업 고무벨트(V벨트,콘베이어벨트,평벨트),프라스틱제품 제조,판매 1976-05-21 12월
2 DSR 155660 1차 비철금속 제조업 합섬섬유로프 2013-05-15 12월
3 GS 078930 기타 금융업 지주회사/부동산 임대 2004-08-05 12월
4 GS글로벌 001250 상품 종합 도매업 수출입업(시멘트,철강금속,전기전자,섬유,기계화학),상품중개,광업,채석업/하수처리 서... 1976-06-26 12월
stock_code.shape
(2486, 6)

3. 함수로 정리하기

def get_krx_code():
    url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13'
    stock_code = pd.read_html(url, header = 0)[0]
    stock_code['종목코드'] = stock_code['종목코드'].map('{:06d}'.format)
    stock_code = stock_code[['회사명', '종목코드', '업종', '주요제품', '상장일', '결산월']]
    stock_code = stock_code.rename(columns = {'회사명': 'name', '종목코드': 'code', '업종': 'sectors','주요제품': 'products',
                                              '상장일': 'listing_date', '결산월': 'closing_date'})
    stock_code['listing_date'] = pd.to_datetime(stock_code['listing_date'])
    
    return stock_code