안녕하세요?


지난번 포스팅까지는 이제 파이썬으로 SQLite를 다루는 연습을 했는데, 이제 본격적으로 증권사의 Open API를 이용해서, 한번 주식의 일봉 차트 데이터를 가지고 와서, 다루는 연습에 들어가 보려고 합니다. 물론 내용이 너무 길어진 관계로, 몇 개의 포스팅으로 나누어서 올리고자 합니다.



먼저 PyCharm에서 새로운 파이썬 파일을 생성하는 것으로 실습을 시작하도록 합니다. 이 실습에 쓰인 프로젝트 자체는 이전에 했는 프로젝트이며, 환경도 동일하게 PyQt5와 pandas등이 설치가 되어 있는 가상환경입니다.



먼저 kiwoom.py의 처음 시작 부분입니다. 당연하다면 당연 하게도 PyQt5모듈의 QtWidgets, QAxContainer, QtCore를 모두 import하라는 식으로 했으며, 여기서 가장 중요한 것은 키움증권의 Open API+를 이용하기 위해서는 QAXWidget 클래스의 인스턴트가 필요합니다. 그래서 클래스를 상속받기 위해서 다음과 같은 형식을 따릅니다.


class 클래스의 이름(상속 받고자 하는 클래스의 이름):


다음으로는 super().__init__() 라는 구문인데, 이 구문은 바로 COM object를 생성하는 작업을 하는데, 저로서는 일단 키움증권의 Open API+를 사용하기 위해서 OCX를 이용하는데, 왜 COM의 오브젝트를 생성하는 지는 아직은 이해가 되지는 않습니다.



다음으로는 _create_kiwoom_instance(self): 라는 메소드에서 먼저 키움증권의 Open API+를 이용하기 위한 명령어라고 해야 할까요? 이것을 타이핑 하도록 합니다. 다음으로 있는 def _set_signal_slots(self):라는 메소드가 있는데, 여기다가는 서버에서 이벤트(=signal)가 발생해서 각각의 신호가 오면 그 신호에 맞는 메소드(=slot)를 실행시키기 위한 메소드인데, 여기서는 OnEventConncet라고 하는 이벤트만 고려를 해서, 연결이 되면 이라는 의미입니다.


당연 아래에 있는 def comm_connect(self): 메소드는 바로 로그인을 해야 키움증권 API가 데이터를 받아올 수 있으니, 로그인을 시도하는 메서드입니다. 여기서 중요한 것은 PyQt5를 이용해서 GUI형태로 프로그래밍을 한 것이 아니기 때문에, 이벤트 루프를 일일히 설정해 주어야 한다는 점 입니다.


self.login_event_loop=QEventLoop()

self.login_event_loop.exec_()


이렇게 해서, 먼저 QEventLoop()메소드로 이벤트 루프를 만들어 준 다음, exec_()메소드를 호출해서 이벤트 루프를 실행시킨다고 해야 할까요? 생성한다고 해야 할까요? 아무튼 진짜로 이벤트 루프가 돌도록 해서, 이 메소드가 종료되지 않고, 로그인이 제대로 연결이 될 때까지 계속 메소드가 종료되지 않도록 만들어 줍니다.


이렇게 해서 이후 로그인이 성공하면, OnEventConnect 라는 이벤트가 발생하므로, 위에서 설정해둔 def _set_signal_slots(self): 메소드의 내용대로 _event_connect()메소드가 실행이 되게 됩니다.




다음으로 코딩한 것은 바로 def _event_conncet(self, err_code): 인데, 여기서 먼저 err_code가 연결에 성공한 경우라면 0이라는 값을 반환(return)함으로, 이는 연결성공했다는 것으로 치도록 합니다. 그리고 나서 이미 이 메소드가 실행되었다는 것 자체가 연결에 성공했다는 뜻이 되므로, 위에서 만들어 둔 def comm_connect(self): 메소드에서 설정해둔 이벤트 루프는 정지할 필요가 있습니다. 그래서 이를 위한 구문은 아래와 같습니다.


self.login_event_loop.exit()


다음으로 이어지는 def get_code_list_by_market(self, market): 메소드의 이름 자체는 임의로 정할 수 있으나, 이 메소드는 파이썬이라는 환경으로 인해서 다음 줄에 있기 때문에 차례로 실행이 되는 것 으로 생각이 됩니다. 문제는 여기서 초록색 글씨로 있는 GetCodeListByMarket(QString)이라는 메소드가 있는데, 이는 키움증권 Open API+에서 제공해 주는 메소드이며, 뒤에 오는 market은 키움증권 API에서 제공해 주는 메소드에서 return해주는 값입니다.


그리고 여기서 나오는 코드의 리스트는 세미콜론(;)을 이용해서 구분되어 있기 때문에, split(';')이라는 함수로 세미콜론(;)을 기준으로 갈러놓도록 하는 파이썬의 리스트를 만들어 주게 됩니다. 그리고 마지막으로 return 뒤에 code_list[:-1] 이라고 붙여 놓아서, 마지막 행까지 가지고 오도록 합니다.



다음으로 있는 것은 if __name__=="__main__": 이라고 하는 실행문에 가까운 구문으로, 여기서 본격적으로 프로그램을 시작하기 위한 코드입니다. 이 코드에서 먼저 app=QApplication(sys.argv) 라는 구문을 두어서, QApplication의 인스턴스를 먼저 생성하고, 그 다음에 kiwoom = Kiwoom() 이라는 구문으로 Kiwoom의 인스턴스를 생성하도록 합니다. 이렇게 해서 실행의 준비가 먼저 끝났습니다.


다음으로는 역시 로그인을 해야 하기 때문에 kiwoom.comm_conncet()라는 메소드를 실행하도록 했으며, 다음으로 특이한 것이 있다면, code_list인데, 여기서 ('10')이라는 값이 있는데, 이 값은 바로 코스닥의 코드로, 코스닥의 리스트를 가지고 와라는 의미가 됩니다.



일단 프로그램을 실행 시켰을 때, 먼저 키움증권에 모의투자로 로그인 하라고 나오는 것을 볼 수 있었으며, 다음으로는 상당히 많은 양의 종목 코드가 나오는 것을 볼 수 있었습니다. 다만 너무 양이 많았는지 중간에 PyCharm이나 컴퓨터가 끊어 버린 것이라는 생각이 듭니다.




다음으로는 종목 코드를 가지고 왔으니, 종목의 명을 가지고 오는 메소드를 만들어 보도록 합니다. 우선 이전에 코드를 얻어오는 메소드의 아래에 위 스크린샷처럼 빨간색 박스의 메소드를 입력해 줍니다. 역시 키움증권 Open API에서 제공하고 있는 GetMasterCodeName(QString)이라는 메소드를 사용해서 종목명을 가지고 오는데, 뒤에 오는 code는 반환되는 값이 아니라, 입력되는 값임에 유의해야 합니다.



그리고 이번에는 리스트만 print()하라고 하는 메소드에서 바꾸어서, 코드가 000660인 종목의 종목명을 코스닥에서 찾아서 가지고 오라는 식으로 코드를 짭니다.



프로그램의 실행결과 SK하이닉스라는 식으로 종목의 명이 나오는 것을 확인할 수 있었습니다. 이렇게 하는 것으로 일단 키움증권의 Open API와 PyCharm을 연동해 보는 것을 해 보았는데, 다음으로는 일봉 데이터를 조회하는 방법에 대해서 포스팅을 할 것을 약속 드리며, 이만 마치겠습니다.

  1. 2019.04.16 00:24

    저에게 도움이 되었읍니다.

+ Recent posts