지난번에 작성한 코드는 키움증권에서 제공하는 OpenAPI를 사용하여 코스피와 코스닥 모든 기업의 데이타를 긁어와 로컬 데이타베이스(Sqlite3)에 저장하는 것이었다.
darkeng.tistory.com/23?category=1142753
키움증권 OpenAPI 파이썬 퀀트 프로그래밍: 코스피 코스닥 리스트 가져오기
콤보박스, 버튼 그리고 텍스트창 간단히 세가지 툴킷을 이용하여 코스피/코스닥 종목 코드와 이름을 가져오는 프로그램을 짰다. 이전에 사용했던 opt10001.py를 재활용하여 추가할 건 추가하고 삭�
darkeng.tistory.com
이번에는 가져온 데이타를 지속적으로 최신으로 관리하기 위해 DB 업데이트 기능을 넣어 보았다.
데이타베이스를 사용하는 이유
키움증권 OpenAPI로 실시간 데이타를 보지 않고 로컬 데이타베이스에 저장해 사용하는 이유는
첫째, 서버의 느린 응답 속도 때문이고 (네트웍 속도 문제일 수도 있겠으나 내겐 너무 느리다.)
둘째, 키움 API를 사용할 때 데이타 요청 및 수신에 제한이 걸려 있어 대량의 정보 송수신에 적합하지가 않았다.
데이터를 로컬에 긁어와서 데이타베이스에 저장하므로써 아주 손쉽고 빠르게 정보를 가지고 테스트 해보거나 가공해 볼 수 있어 이게 최선이라 생각한다. 참고로 모든 코스피 코스닥 기업데이타를 받아와 저장하는데 두어시간 정도 걸렸던 것 같다. 긴시간은 아니지만 실시간으로 받아다 띄우기에는 불가능한 느린 속도다.
업데이트 기능을 위해 추가가 필요한 곳
데이타베이스의 코스피/코스닥 테이블의 맨 마지막 필드에 '입력일'을 추가했다. 이 날짜를 기준으로 오늘의 날짜와 비교하여 다르면 업데이트가 필요한 레코드라고 인식한다. UI쪽에선 '업데이트' 버튼을 추가해 주었다.
업데이트가 실행되는 과정을 조금더 자세히 설명해 보자면,
1. 유저가 어플리케이션의 '업데이트' 버튼을 누른다.
2. 로컬 데이타베이스를 검색하여 오늘날짜가 아닌 종목코드 리스트를 뽑아온다.
3. 뽑아온 업데이트가 필요한 종목코드 리스트의 종목코드를 하나씩 요청해 키움으로 부터 데이타를 받아온다.
4. 받아온 데이타로 로컬 데이타베이스에 업데이트 해준다.
SQLite 데이타베이스의 이전 테이블 정리
코스피와 코스닥 테이블의 구조가 바뀌었으므로 이전 포스트에서 만들었던 테이블을 삭제한다. (굳이 재사용할 이유도 없고 해서 테이블을 변경한다든지 하는 방법을 쓰지 않고 그냥 삭제하고 다시 만들었다.)
SQLite의 DB Browser를 실행해서 DB파일을 로딩한 후 이전에 존재하던 테이블을 삭제했다. 그리고 프로그램을 종료하든지 아니면 변경사항 저장하기 버튼을 누르면 변경사항이 반영된다.
업데이트 코드 작성
이전 포스트에서 사용했던 codeDataType과 codeDataName의 마지막에 "text" 포맷 "입력일"을 추가한다.
DB에 해당 테이블이 없으면 새 테이블을 생성할 것이므로 나중에 프로그램을 실행하면 "입력일"이 추가된 새 테이블이 생성될 것이다.
오늘 날짜를 가져와서 클래스의 today멤버변수에 문자열로 저장한다. 포맷은 '2020-10-17'. 나중에 날짜 비교를 할 때 쓰인다.
새롭게 추가된 이 함수는 로컬 데이타베이스를 검색하는 쿼리를 만들어 실행하고 입력일이 오늘 날짜가 아닌 검색된 레코드들의 튜플 속 종목코드만 뽑아내 따로 리스트를 만들어 리턴한다. 검색 쿼리는 다음과 같은 형식이 될 것이다.
예) SELECT 종목코드 FROM kospi WHERE 입력일!='2020-10-17';
'업데이트'버튼을 클릭하면 호출되는 함수다. 클래스 멤버변수로 data_mode를 둬서 입력모드인지 업데이트모드인지를 구분한다. update 모드 세팅을 하고 버튼은 두번 눌려지지 않도록 disable시킨다. 앞서 설명했던 오래된 레코드 종목코드 리스트를 받아온 다음 시그널을 보내면 get_codelist() 함수가 불리며 종목코드 리스트에 들어있는 종목코드를 하나씩 뽑아내 키움 서버로 종목의 데이타를 요청한다.
update_button_clicked함수에서 시그널을 뿌리면 실행되는 함수가 get_codelist함수이다. code_list에 저장된 종목코드를 하나씩 뽑아내 키움서버에 요청을 보낸다. 이전 포스트에서 썼던 코드에서 모드확인 정도만 약간 변화했을 뿐 크게 다르지 않다.
get_codelist함수에서 요청을 보낸 후 키움서버로 부터 응답을 받게되면 호출되는 함수가 receive_tr_data()이다. 이 역시 이전과 별반 다르지 않은데 마지막 부분에 데이타 모드에 따라서 입력함수를 호출할지 업데이트 함수를 호출할지 결정하는 부분만 다르다.
키움서버에서 받아온 종목 데이타로 sql update 쿼리를 만들어서 로컬 데이타베이스에 업데이트를 실행한다. 최종 업데이트 쿼리는 다음과 같은 형식이 될 것이다.
예) UPDATE kospi SET 결산월 = '12', 상장주식 = '6868' WHERE 종목코드 = '290670';
실행
실행을 하고 업데이트 버튼을 눌러보면 비주얼 스튜디오 코드의 터미널 창에 위와 같은 디버깅용 메시지들이 출력되는 것을 볼 수 있다.
github 소스코드
전체 소스코드는 다음 위치에서 받을 수 있다.
https://github.com/mole-cricket/kiwoom-openapi
mole-cricket/kiwoom-openapi
Contribute to mole-cricket/kiwoom-openapi development by creating an account on GitHub.
github.com