오늘은 파이썬을 이용해, KRX에서 주식 종목 마스터를 가져와서 DB화해보도록 해보겠습니다.

먼저, 아래 KRX 사이트를 가보면 주식 종목 마스터 정보를 제공하는 것을 알 수 있습니다.

https://kind.krx.co.kr/corpgeneral/corpList.do?method=loadInitPage

 

대한민국 대표 기업공시채널 KIND

업종 전체 농업, 임업 및 어업 광업 제조업 - 식료품 제조업 - 음료 제조업 - 담배 제조업 - 섬유제품 제조업; 의복제외 - 의복, 의복액세서리 및 모피제품 제조업 - 가죽, 가방 및 신발 제조업 - 목

kind.krx.co.kr

파이썬을 이용해, krx의 상장 종목을 가져오기 위해서는 아래와 같이 파이썬 코드를 작성합니다.

# [PyCode-1]
import pandas as pd

url = 'https://kind.krx.co.kr/corpgeneral/corpList.do' # KRX의 종목리스트 URL
KD = pd.read_html(url+"?method=download&marketType=kosdaqMkt")[0] #코스닥
KP = pd.read_html(url+"?method=download&marketType=stockMkt")[0] #코스피

print(KD) # 코스닥 종목 리스트 출력
print(KP) # 코스피 종목 리스트 출력
print(KD.columns) #종목 리스트를 구성하는 컬럼 확인

종목 리스트를 가져올 때, 코스피와 코스닥을 분리해서 가져오고 있습니다. KD에는 코스닥 종목 리스트가, KP에는 코스피 종목 리스트가 들어가 있습니다. 마지막 줄에 KD.columns를 print해보면, 어떤 항목들이 있는지 확인할 수 있습니다. 아래와 같습니다.

Index(['회사명', '종목코드', '업종', '주요제품', '상장일', '결산월', '대표자명', '홈페이지', '지역'], dtype='object')

이제, 가져온 정보를 데이터베이스에 담기 위해서 테이블(KRX종목마스터)을 만들 차례입니다. 여기서는 MySQL에 구성한 DB_DTECH 데이터베이스에 신규 테이블을 생성할 예정입니다.


DB_DTECH DB 생성은 아래 글의 3번, 4번을 참고해주세요.

https://blog.naver.com/ryu1hwan/222407085233

 

2021년 1분기 DART 재무제표 데이터베이스화하기

본 자료는 '평생 필요한 데이터 분석'의 오프라인 강의 자료의 일부입니다. 오늘은 DART의 2...

blog.naver.com

KRX종목마스터 테이블을 만들기 전에 설계를 먼저 진행합니다. 앞에서 살펴본 KD.Columns의 결과 중에서 필요한 내용만 추려서 테이블을 설계합니다. 아래와 같습니다.



여기서는 ERD 클라우드로 테이블 설계를 진행했습니다. 아래 URL에 접속하시면 직접 확인하실 수 있습니다.

  - https://www.erdcloud.com/d/uLkbGXNcGu7HkvJXa

 

DB_DTECH

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

항상 테이블 생성 전에 설계를 먼저 하는 습관을 갖는 것이 좋습니다. (물론, 저는 개인 용도로 쓰기 때문에, 그냥 휘리릭 만들지만요.^^;; 시간 관계상...)

아래와 같은 SQL로 위에서 설계한 테이블을 생성합니다. 파이썬이 아닌 DBeaver나 MySQL Workbench와 같은 툴로 DB에 접속해서 실행해야겠죠.

# [SQL-1]
CREATE TABLE DB_DTECH.STOCK_KRX
(
	STK_CD    VARCHAR(40)   NOT NULL COMMENT '종목코드'
	,STK_NM   VARCHAR(200)  NOT NULL COMMENT '종목명'
	,SEC_NM   VARCHAR(500)  NULL     COMMENT '업종(섹터명)'
	,MAIN_PRD VARCHAR(1000) NULL     COMMENT '주요제품'
	,PUB_DT   DATE          NULL     COMMENT '상장일자'
	,EX_CD    VARCHAR(40)   NOT NULL COMMENT '거래소코드'
	,FRST_INP_DTM DATETIME  NULL     COMMENT '최초입력일시'
	,LAST_CHG_DTM DATETIME  NULL     COMMENT '최종변경일시'
	,PRIMARY KEY (STK_CD)
) COMMENT 'KRX종목마스터';

 

테이블을 만들었으면, 다시 파이썬으로 돌아와서 가져온 종목 리스트를 저장하도록 코딩할 차례입니다. 우선은 코스닥 종목 리스트만 DB에 저장하도록 하겠습니다. 앞에서 작성한 # [PyCode-1] 에 이어서 아래 코드를 작성합니다. 가져온 코스닥 종목 리스트를 한 건씩 읽으면서 STOCK_KRX 테이블에 한 건씩 INSERT 처리하고 있습니다.

# [PyCode-1]
# ... 생략 ....

# [PyCode-2]
import pymysql
# MySQL 연결 처리
myMyConn = pymysql.connect(user='root', password='1qaz2wsx', host='localhost', port=3306,charset='utf8', database='DB_SQLSTK')
myMyCursor = myMyConn.cursor()

# KOSDAQ 종목 입력(위에 내용과 동일)
for row in KD.itertuples():
    STK_CD = str(row.종목코드).zfill(6)
    STK_NM = str(row.회사명)
    SEC_NM = str(row.업종).replace("'", ",")
    MAIN_PRD = str(row.주요제품).replace("'", ",")
    PUB_DT = str(row.상장일)
    EX_CD = 'KD' # KOSDAQ

    sql = "INSERT INTO DB_DTECH.STOCK_KRX(STK_CD ,STK_NM ,SEC_NM ,MAIN_PRD ,PUB_DT ,EX_CD ,FRST_INP_DTM)"
    sql = sql + "VALUES("
    sql = sql + "'" + STK_CD + "'"
    sql = sql + ",'" + STK_NM + "'"
    sql = sql + ",'" + SEC_NM + "'"
    sql = sql + ",'" + MAIN_PRD + "'"
    sql = sql + ",DATE_FORMAT('" + PUB_DT + "','%Y-%m-%d')"
    sql = sql + ",'" + EX_CD + "'"
    sql = sql + ",NOW())"
    print(sql)
    myMyCursor.execute(sql)
    myMyCursor.execute('commit')

 

위의 코드를 실행한 후에, 다시 DBeaver와 같은 툴로 MySQL에 접속해 테이블을 조회해보면 저장된 종목 데이터를 확인할 수 있습니다.

# [SQL-2]
SELECT  *
FROM    DB_DTECH.STOCK_KRX;

지금까지, 종목 리스트를 KRX에서 어떻게 가져오는지, 저장은 어떻게 처리하는지 살펴봤습니다. 지금까지의 코드를 정리해서 아래와 같은 최종 파이썬 코드를 작성합니다. 데이터 저장하는 과정을 모듈(함수)화 해서 코스피와 코스닥을 같이 처리할 수 있도록 했습니다. 그리고, 기존에 데이터가 존재하면 업데이트하도록 INSERT ON DUPLICATE 구문을 사용했습니다.
(INSERT ON DUPLICATE는 한 테이블에 Key가 여러개 일 때는 사용하면 안되는 구문이라는 걸 참고해주세요.)

import pandas as pd

url = 'https://kind.krx.co.kr/corpgeneral/corpList.do' # KRX의 종목리스트 URL
KD = pd.read_html(url+"?method=download&marketType=kosdaqMkt")[0] #코스닥
KP = pd.read_html(url+"?method=download&marketType=stockMkt")[0] #코스피

print(KD) # 코스닥 종목 리스트 출력
print(KP) # 코스피 종목 리스트 출력
print(KD.columns) #종목 리스트를 구성하는 컬럼 확인

import pymysql
# MySQL 연결 처리
myMyConn = pymysql.connect(user='root', password='1qaz2wsx', host='localhost', port=3306,charset='utf8', database='DB_SQLSTK')
myMyCursor = myMyConn.cursor()

def InsertStockList(_df,_ex_cd):
    for row in _df.itertuples():
        STK_CD = str(row.종목코드).zfill(6)
        STK_NM = str(row.회사명)
        SEC_NM = str(row.업종).replace("'", ",")
        MAIN_PRD = str(row.주요제품).replace("'", ",")
        PUB_DT = str(row.상장일)
        EX_CD = _ex_cd

        sql = "INSERT INTO DB_DTECH.STOCK_KRX(STK_CD ,STK_NM ,SEC_NM ,MAIN_PRD ,PUB_DT ,EX_CD ,FRST_INP_DTM)" + "\n"
        sql = sql + "VALUES("
        sql = sql + "'" + STK_CD + "'"
        sql = sql + ",'" + STK_NM + "'"
        sql = sql + ",'" + SEC_NM + "'"
        sql = sql + ",'" + MAIN_PRD + "'"
        sql = sql + ",DATE_FORMAT('" + PUB_DT + "','%Y-%m-%d')"
        sql = sql + ",'" + EX_CD + "'"
        sql = sql + ",NOW())" + "\n"
        sql = sql + "ON DUPLICATE KEY UPDATE" + "\n"
        sql = sql + "STK_NM = '" + STK_NM + "'" + "\n"
        sql = sql + ",SEC_NM = '" + SEC_NM + "'" + "\n"
        sql = sql + ",MAIN_PRD = '" + MAIN_PRD + "'" + "\n"
        sql = sql + ",PUB_DT = DATE_FORMAT('" + PUB_DT + "','%Y-%m-%d')" + "\n"
        sql = sql + ",EX_CD = '" + EX_CD + "'"

        print(sql)
        myMyCursor.execute(sql)
        myMyCursor.execute('commit')

InsertStockList(KD,'KD') # 코스닥 종목 INSERT 처리
InsertStockList(KP,'KP') # 코스피 종목 INSERT 처리

위의 코드를 모두 작성한 후 실행하면 아래와 같이 STOCK_KRX 테이블에는 최신의 종목 리스트를 모두 담을 수 있게 됩니다.

 

SELECT  T1.EX_CD ,COUNT(*) CNT
FROM    DB_DTECH.STOCK_KRX T1
GROUP BY T1.EX_CD
ORDER BY T1.EX_CD;


오늘은 여기까지입니다.~! 파이썬을 접해보지 않은 분들께는 어려울 수 있지만, 찬찬히 하나씩 익히다 보면 그리 어렵지도 않답니다.!

+ Recent posts