이제 많은 것들을 알아봤으니... 슬슬 자체 DB에 키움증권의 Open API+를 통해서 받아온 내용을 DB에 저장하고 가공하여 서비스가 가능한 환경을 만들어야 합니다. 이번에는 그 첫번째 단계로 주식종목 코드 및 종목명을 받아와서 MariaDB에 저장해 보겠습니다.
이를 통해서 향후 사용자가 원하는 종목을 검색하고, 해당 종목을 선택하여 부가 정보를 확인할 수 있는 대상으로 지정하는 용도로 사용하고, 종목이 업데이트되고 변경되고 없어지는 이력의 관리가 가능해집니다. 그렇다면 전체적인 단계는 아래와 같이 진행하겠습니다.
- Table Design
- 주식종목 코드 및 종목명 가져오는 코드 구현
- 해당 결과를 DB에 넣는 로직 구현
1. Table Design
주식종목 코드 및 종목명을 관리할 수 있는 Table을 설계합니다. 매일 어떤 종목이 생기고, 사라지는지... 시장구분에 따라서 어떤 종목이 있는지 등을 모두 관리하려면, 그래도 좀 제대로된 design이 필요합니다. 저는 그래서 아래의 항목으로 관리하고자 합니다.
DROP TABLE stocks_info;
CREATE TABLE stocks_info(
stocks_id VARCHAR(10) PRIMARY KEY,
stocks_type VARCHAR(3),
stocks_name VARCHAR(100),
create_date DATETIME,
update_yn VARCHAR(1),
update_data DATETIME
);
종목코드, 시장구분, 종목명을 순차적으로 관리하고... 처음 DB에 생성된 날짜, 업데이트 유무, 업데이트 날짜를 부가적으로 관리함에 따라 전체적인 관리가 가능해집니다. 이를 기반으로 향후 각 개인별 종목을 선택하고 정보를 받아올 수 있는 기반으로 활용 할 예정입니다.
또한, 해당 종목코드 및 종목명은 매일매일 키움증권 내 업데이트가 될 것이기 때문에, 일별 schedule을 돌며 프로그램에서도 업데이트가 되게 구성해야 합니다. 이 부분은 나중에 구현하기로 하고 해당 DB를 일단 생성해 보겠습니다.
정상적으로 생성이 되었습니다.
2. 주식종목 코드 및 종목명 가져오기
기존에 작성해 보았던, 코드를 그냥 그대로 Refactoring해서 가져오겠습니다. 개발자 가이드를 통해서 다 확인했던 내용이기 때문에 생략하고 코드만 보자면...
def GetCodeListByMarket(self, sMarket):
res = self.OCXConn.dynamicCall("GetCodeListByMarket(QString)", sMarket).split(';')
return res
def GetMasterCodeName(self, strCode):
res = self.OCXConn.dynamicCall("GetMasterCodeName(QString)", strCode)
return res.strip()
시장구분에 따라서, Open API+가 주는 결과가 다르기 때문에, 해당 parameter를 받아 결과를 list로 return하는 코드와... 종목명은 종목코드를 기준으로 단건으로 Open API+가 결과를 주기 때문에 단일값을 return하는 코드로 작성을 합니다. 그리고 실제로 __main__에서 해당 메서드를 활용하는 방식은 아래와 같습니다
# 주식종목코드 가져오기
code_0 = kd.GetCodeListByMarket(0)
code_10 = kd.GetCodeListByMarket(10)
print('코스피 종목 수 : ', len(code_0))
print('코스닥 종목 수 : ', len(code_10))
# 주식종목명 가져오기
code_0_name = []
for i in code_0:
code_0_name.append(kd.GetMasterCodeName(code_0))
code_10_name = []
for i in code_10:
code_10_name.append(kd.GetMasterCodeName(code_10))
print('코스피 종목이름 수 : ', len(code_0_name))
print('코스닥 종목이름 수 : ', len(code_10_name))
이렇게 하고 실행하면 정상적으로 데이터를 가져오는 것을 확인할 수 있습니다.
코스피 종목 수 : 1566
코스피 종목 수 : 1411
코스피 종목이름 수 : 1566
코스피 종목이름 수 : 1411
아무래도 종목가 많고 이를 하나하나 종목명을 가져와야 하기 때문에... 시간이 좀 걸립니다.
3. DB에 데이터 저장
이제 최종적으로 Open API+를 통해서 가져온 데이터를 mariadb(mysql)에 넣어보도록 하겠습니다. 기존에 Create table은 했기 때문에... Insert만 하면 되겠습니다. 여기에 1가지 주의점만 확인하면 됩니다. 해당 table에서는 update에 대한 여부를 체크하는 로직이 들어가기 때문에 단순 insert 문이 아닌, 추가 query가 필요합니다.
INSERT INTO ~ VALUES ~ ON DUPLICATE KEY UPDATE
바로 Insert를 하되, primary key로 지정한 stocks_id가 중복이 되면 update를 수행하는 query를 사용하는 것입니다. 그렇다면 이제 코드로 구현을 해 볼까요??
import pymysql as mariadb
mariadb_conn = mariadb.connect(host='localhost', port=3306, user='root', password='@tedd40@', db='at_project')
mariadb_cur = mariadb_conn.cursor()
sql_dml = '''
INSERT INTO stocks_info(stocks_id, stocks_type, stocks_name,create_date)
VALUES (%s, %s, %s, NOW())
ON DUPLICATE KEY UPDATE update_yn='Y', update_data=NOW()
'''
for i in range(len(code_0)):
sql_data = (code_0[i], '0', code_0_name[i])
try:
mariadb_cur.execute(sql_dml, sql_data)
except mariadb.Error as error:
print(error)
mariadb_conn.commit()
mariadb_conn.close()
기존에 db connection을 위해서 여러가지 방법을 알아보았으며, 이번에는 pymysql을 통해서 연동하였습니다. 기존에 터치했던 내용이라 생략하고... 실행해보면 코스피를 적용했기 때문에 1566개 데이터가 들어가 있으면 됩니다.
실제로 데이터 개수도, 데이터 내용도 정상으로 들어가 있습니다. 게다가 create_date만 들어가 있고 update에는 아무런 정보가 없습니다. 아마 해당 코드를 한번 더 수행하면 update에 대한 정보가 들어가 있겠죠?? 그럼 한번 실행해 보겠습니다.
전체 데이터의 수는 동일하고 update정보가 정상적으로 반영되었습니다 . (5분 차이가 있네요....^ ^) 이제 남은건 나머지 코스닥도 반영하겠습니다.
# 코스피 주식정보 DB 저장 - stocks_info
for i in range(len(code_0)):
sql_data = (code_0[i], '0', code_0_name[i])
try:
mariadb_cur.execute(sql_dml, sql_data)
except mariadb.Error as error:
print(error)
# 코스닥 주식정보 DB 저장 - stocks_info
for i in range(len(code_10)):
sql_data = (code_10[i], '10', code_10_name[i])
try:
mariadb_cur.execute(sql_dml, sql_data)
except mariadb.Error as error:
print(error)
중간에 for 코드 블럭만 추가해 주면 됩니다. 이렇게 넣고 확인해보니, 항목으로 받아온 수와 db에 들어가는 수가 코스닥에서 하나가 차이나는데... 왠지 코드명이 겹치는 애가 있는 것 같습니다.
시장구분 정보도 잘 들어오는 것이 확인되었습니다. 그럼 다음에는 이제 사용자별 관심종목 관리 table을 만들고 이를 통해서 주식정보이력을 가져와서 DB에 저장하는 로직을 구현해 보겠습니다.
-Ayotera Lab-
댓글