오늘은 키움증권이 제공하는 API도 물론그렇지만, 대부분의 증권사가 제공하는 API의 사용을 위한 기본 필수 요소인 거래소의 상장된 종목의 전체 주식종목 코드와 그에 해당하는 한글 종목명을 가져오는 방법을 알아보겠습니다. 향후 구현될 누적 주가 데이터 및 실시간 주가 데이터를 가져오기 위한 배치에서도... 사용자 화면에서 보여줄 정보를 위해서도 필수적인 데이터입니다.
사실 키움증권 API (Open API+)에서 제공하는 KOA Studio에서 TR목록을 쭉 봐도... 거의 모든 Transaction에서 가장 첫 입력값인 SetInputValue에 종목코드를 입력하게 되어있습니다. 그럼 어떻게 해당 정보들을 가져올 수 있을까요??
KOA Studio에서 종목정보 Tab에서 확인한 상장 종목정보에 대한 화면입니다. 느낌적으로는 거래소가 코스피, 코스닥이 그냥 코스닥 종목정보 일 것 같습니다. 그렇다면 한번 검색을 해볼까요??
네 맞습니다. 종목명을 검색해보니 상장종목정보에 대해서 종목코드와 간단한 정보들을 확인할 수 있습니다. 그렇다면 이제 이 리스트들을 향후 활용하기 위해서 OCX API를 통해서 받아오도록 하겠습니다.
1. 종목코드 가져오기
개발자 가이드를 확인해 보면, 시장구분에 따른 종목코드를 반환하는 메서드를 제공합니다. 이 메서드는 별도의 이벤트는 발생하지 않으며, 시장구분을 입력하면 바로 반환값이 있고... 리스트를 반환하는데 구분은 ';'로 한다고 합니다. 그렇다는 말은 String으로 리턴을 하니... ';' 기준으로 split해서 사용하라는 말이 되겠습니다.
그렇다면 일단 코드로 바로 구현해보겠습니다.
self.code_0 = self.OCXconn.dynamicCall("GetCodeListByMarket(QString)", "0")
print('반환종목갯수 : ', len(self.code_0))
print('반환종목list : ', self.code_0)
print('반환종목 1번째 Data : ', self.code_0[0])
self.code_0 = self.OCXconn.dynamicCall("GetCodeListByMarket(QString)", ["0", "10"])
print('반환종목갯수 : ', len(self.code_0))
####################################################################################
반환종목갯수 : 10962
반환종목list : 000020;000040;000...............................
반환종목 1번째 Data : 0
반환종목갯수 : 10962
dynamicCall을 사용해서 시장구분 정보를 추가해서 서버로 보내고, 결과를 self.code_0으로 받습니다. 실제로 온 데이터를 확인해보면 ';' 사이에 두고 코드들이 출력됩니다. String이기때문에 [0]번째 데이터를 확인해보면 "0"이 됩니다.
혹시나, 시장구분을 list형태로 보내면 다 모아서 보내줄거라 생각했지만... 결과를 보면 첫 String에 대해서만 응답이 오는것을 확인 할 수 있습니다. 그 말은 코스피/코스닥 정보를 다 받아오기 위해서는 2번 dynamicCall을 해야한다는 결론이 나옵니다.
그럼 이제 코스피, 코스닥 종목코드를 가져와서 깔끔하게 split(';')해서 python의 list 객체에 넣겠습니다.
self.code_0 = self.OCXconn.dynamicCall("GetCodeListByMarket(QString)", "0")
self.code_10 = self.OCXconn.dynamicCall("GetCodeListByMarket(QString)", "10")
self.code_0 = self.code_0.split(';')
self.code_10 = self.code_10.split(';')
print('코스피 반환종목갯수 : ', len(self.code_0))
print('코스피 반환종목 1번째 Data : ', self.code_0[0])
print('코스피 반환종목갯수 : ', len(self.code_10))
print('코스피 반환종목 1번째 Data : ', self.code_10[0])
######################################
코스피 반환종목갯수 : 1567
코스피 반환종목 1번째 Data : 000020
코스닥 반환종목갯수 : 1410
코스닥 반환종목 1번째 Data : 900080
이제 정상적으로 됬네요...
2. 종목이름 가져오기
개발자 가이드를 확인해 보면, 종목코드의 한글명을 반환하는 메서드를 제공합니다. 이 메서드도 역시 별도의 이벤트는 발생하지 않으며, 종목코드를 입력하면 바로 한글명을 반환합니다. 그렇다는말은 대상 종목이 현재 코스피(1567), 코스닥 (1410)이기 때문에 총 2977번 dynamicCall을 수행해야 한다는 말이 됩니다.
그렇다면 일단 코드로 바로 구현해보겠습니다.
self.code_0_name = []
for c in self.code_0:
temp_name = self.OCXconn.dynamicCall("GetMasterCodeName(QString)", c)
self.code_0_name.append(temp_name)
self.code_10_name = []
for c in self.code_10:
temp_name = self.OCXconn.dynamicCall("GetMasterCodeName(QString)", c)
self.code_10_name.append(temp_name)
print('코스피 반환종목갯수 : ', len(self.code_0))
print('코스피 반환이름갯수 : ', len(self.code_0_name))
print('코스피 반환종목 1번째 Data : ', self.code_0[0], self.code_0_name[0])
print('코스닥 반환종목갯수 : ', len(self.code_10))
print('코스닥 반환이름갯수 : ', len(self.code_10_name))
print('코스닥 반환종목 1번째 Data : ', self.code_10[0], self.code_10_name[0])
############################################################################
코스피 반환종목갯수 : 1567
코스피 반환이름갯수 : 1567
코스피 반환종목 1번째 Data : 000020 동화약품
코스닥 반환종목갯수 : 1410
코스닥 반환이름갯수 : 1410
코스닥 반환종목 1번째 Data : 900080 에스앤씨엔진그룹
dynamicCall을 이용해서 종목코드를 보내고, 서버를 통해서 한글 정보를 받습니다. 그리고 이를 새로운 list를 생성해서 추가를 해 줍니다. 이를 코스피, 코스닥 반복해서 진행하고, 각 첫 결과를 출력하면 위와 같습니다. 이 부분은 향후 배치항목으로 작성해서 매일 장이 열리기 전에 신규항목이 있으면, DB에 업데이트 하는 방법으로 진행하면 될 것 같습니다. 후에 DB구성이 확정되면 저장하는 부분을 구현해 보겠습니다.
-Ayotera Lab-
댓글