개발 이야기/주식 자동 매매 프로그램

키움 증권 API를 이용하여 주식 자동 매매 프로그램 개발하기 - API 모듈을 불러오는 방법 [Python]

제이온 (Jayon) 2020. 12. 22.

 

 

안녕하세요? 코딩중독입니다.

 

저번 시간에는 VS CODE를 설치하고 아나콘다와 연동하는 방법에 대해서 알아 보았습니다.

 

 

오늘은 본격적으로 코딩을 해 볼 것입니다. 하지만, 우리는 키움 증권 API를 활용하여 주식 매매 프로그램을 만들기 위해서 PyQt5 라는 패키지를 사용해야 합니다. 저는 이와 관련하여 블로그 왼쪽의 [프로그래밍 언어] - [Python] 카테고리에서 PyQt5와 관련된 포스팅을 작성하고 있습니다. 이 주식 매매 프로그램을 개발하면서 필요한 PyQt5 지식은 웬만하면 [Python] 카테고리에 적어둘 계획입니다. 또한, PyQt5의 간략한 소개와 개발 환경 세팅은 이곳에서 확인해 보실 수 있습니다.

 

 

 

 

초기 세팅

PyQt5를 사용하기 위해서는 패키지를 설치해야 합니다. 그리고 우리 프로그램은 한글을 이용할 것이므로 VS CODE에서 한글 인코딩 설정을 해 주어야 합니다. 이것과 관련된 내용은 이곳의 초기 세팅 내용을 따라하시길 바랍니다.

 

 

키움 증권 open API 모듈 불러오기 - main.py

이제, 본격적으로 코딩을 할 시간입니다. 먼저, main.py 파일을 하나 만들고 아래와 같은 코드를 작성합시다.

 

 

 

 

하나 하나 코드의 의미를 알아보기 전에 오류를 하나 잡고 갑시다. 일단, 이렇게 해 놓으면 모듈 부분에서 빨간줄이 뜨면서 "no name 'qapplication' in module 'pyqt5.qtwidgets'"와 같은 오류가 뜰 것입니다. 그리고 이게 뜬다고 해서 프로그램 실행이 안 되지는 않습니다. 하지만, 빨간줄은 불편하기때문에 한 가지 작업을 해 주어야 합니다.

 

vs code 내에서 '.pylintrc'라는 파일을 생성해 주시고 그 안에다가 'extension-pkg-whitelist=PyQt5' 내용을 입력하고 저장한 다음 vs vode를 재실행하시면 됩니다. 그러면 빨간줄은 감쪽같이 사라집니다!

 

 

코드를 보면, 상단부는 하나의 사용자 정의 클래스고 하단부는 메인 함수처럼 보입니다. 하단부부터 살펴봅시다.

 

 

 

 

'__name__'이 들어간 조건문은 별 거 아니고, 프로그램의 시작점이 현재 파일이 맞는지 확인하는 코드입니다. 혹시나 이 부분에 대해 궁금하신 분은 이곳을 참조하시면 되겠습니다.

 

 

이제, 상단부 코드를 봅시다.

 

 

 

 

print문은 단순 출력이니 제외하고, 아래 두 줄이 중요합니다. 핵심만 말하자면, 이벤트 루프를 실행하기 위한 코드입니다. 먼저, Qapplication 객체를 생성하고, exec_() 라는 함수를 통해 이벤트 루프를 실행하는 것이죠. 그리고 이렇게 이벤트 루프가 실행되면 '지금 상황'에서는 프로그램이 종료가 되지 않습니다.

 

저는 VS CODE에서 code runner 익스텐션을 사용중인데, code runner를 강제 종료하려면 CTRL + ALT + M을 누르시면 됩니다. 이벤트 루프와 관련해서는 지금 제대로 이해 못하셔도 괜찮습니다.

 

 

키움 증권 open API 모듈 불러오기 - kiwoom.py

이제, 본격적으로 키움 증권의 api 모듈을 가져와야 합니다. 일단, kiwoom 디렉토리를 하나 만들고, 그 안에 kiwoom.py를 만들어 줍시다. 

 

 

 

 

여기서 중요한 코드가 있습니다. 우선, Kiwoom 클래스는 QAxWidget을 상속받으므로 super를 가장 처음 호출해 줍니다.

 

그리고 create_kiwoom_instance() 함수를 호출하는데, 이것은 COM 오브젝트를 생성하는 역할을 합니다.

 

COM 오브젝트에 대한 설명은 옛날 글이지만 이곳에서 쉽게 이해하실 수 있을 듯합니다. 그리고 QAxWidget 내장 함수인 setControl을 통하여 COM 오브젝트를 생성해 줄 수 있습니다.

 

이때, setControl 함수의 인자로 넘기는 문자열을 주목해 봅시다. QAxWidget의 setControl을 설명하는 공식 문서에 의하면, 컴포넌트의 UUID(범용 고유 식별자)를 인자로 넘기라고 하였습니다.

 

 

 

 

그렇다면, 키움증권 openAPI의 식별자는 어디서 알 수 있을까요? 그 답은 키움증권 개발 가이드에서 찾을 수 있었습니다. 

 

 

 

 

여기서 식별자가 4개가 나오는데, 'Control'에 해당하는 식별자를 찾았습니다. 이것을 self.setControl의 인자로 바로 넘기면 안 되고 중괄호를 감싸서 넘겨야 합니다. 그런데, 이것은 코드가 아무래도 쓸데없이 길기때문에 사람이 읽을 수 있는 ProgID 형태로 인자를 전달하는 것이 좋습니다. 따라서 ProgID가 무엇인지 찾아야하는데, 이것은 윈도우 레지스트리 편집기에서 알아낼 수 있습니다.

 

참고로, COM 오브젝트의 GUID(전역 고유 식별자)를 CLSID(클래스 식별자)라고 합니다. 우리는 COM 오브젝트를 사용하고 있으므로 인자로 CLSID 혹은 ProgID를 넘겨야 하는 것입니다. (UUID와 GUID는 거의 같은 개념이라고 합니다. - 해당 링크)

 

 

먼저, 레지스트리 편집기를 연 다음에 [편집] - [찾기]를 실행합니다. 그런 다음 Control 식별자(A1574A0D-6BFA-4BD7-9020-DED88711818D)를 입력하고 다음 찾기를 누릅니다.

 

 

 

 

그러면, 레지스트리가 알아서 해당 검색 문자열이 담긴 데이터를 찾아 줍니다. 여기서 빨간색 네모 박스를 친 부분이 우리가 인자로 넘겨 주어야 하는 ProgID입니다. 그리고 그것은 "KHOPENAPI.KHOpenAPICtrl.1"이며, 인자로 이 값을 넘겨주면 됩니다.

 

이제, kiwoom.py에서 볼 일은 끝났고, 다시 main.py로 가서 kiwoom 모듈 경로를 주시고 kiwoom 객체를 생성해야 합니다. 쉬운 내용이므로 아래 코드만 첨부해 두겠습니다.

 

 

 

 

정리

이제 우리는 드디어 open API의 각종 내장 함수를 사용할 수 있게 되었습니다. 본격적으로 주식 매매 프로그램을 만들 수 있게 된 것이죠! 다음 시간부터는 로그인을 해 보면서 하나씩 기능을 구현해 봅시다.

 

 

출처

프로그램 동산(장용준)님이 집필하신 '손가락 하나 까딱하지 않는 주식 거래 시스템 구축' 교재를 참고하여 작성하였습니다.

 

그 외에 프로그램 동산님은 깃허브, 카페, 유튜브를 운영 중이십니다. 굉장히 도움이 되는 내용이 많으니 참고하셔도 좋을 것 같습니다.

 

(깃허브) github.com/programgarden

(유튜브) www.youtube.com/channel/UCq7fsrxP6oi6vnYgPkw92jg

(네이버 카페) cafe.naver.com/programgarden

댓글

추천 글