본문 바로가기
무모한 도전-주식 인공지능 만들기

단타매매를 위힌 종목찾는 프로그램의 문제와 그 극복방법

by 인터넷떠돌이 2019. 2. 19.
반응형

안녕하세요?


일단 어제는 그렇게 성과가 나오는 날이 아니기는 아니었습니다. 강화학습을 해서 6개의 모델-거의 얻는데 8시간 이 걸린 작업을 했는데, 수익모델은 하나도 나오지 않았으며, 그렇게 구글 코랩에서 자동으로 강화학습을 시키는 동안 저는 10분봉 차트만 가지고도 안될 것을 생각해서 더 짧은 시간의 차트-1분봉을 가지고 오려고 시도를 했습니다만, 중간에 엄청난 문제에 봉착하게 되었습니다.


그건 키움증권에서 1000번 조회횟수를 넘기면 자동으로 Open API의 접속을 차단해 버리는 기능이 있다는 것 입니다. 이게 사람에 따라서는 1시간에 1000번이라고 하는 사람도 있지만, 제 경우에는 상당히 중요했습니다. 왜냐하면 이런 식으로 나오는 에러 때문에 전체 1600개가 넘는 코스피의 종목을 5개씩 쪼개어서 프로그램을 일일히 돌려야 한다는 결론이 나왔기 때문입니다. 그래서 그걸 어떻게 해서 넘어갈 수 있는지에 대해서 한번 아래와 같은 포스팅의 내용에서 다루고자 합니다.



먼저 1자 시도는 pyinspector를 이용해서 키움증권 Open API에서 로그아웃을 하는 것 입니다. 여기서 많은 분들이 이미 키움증권 Open API에서 로그아웃 기능을 제공하지 않느냐고 하실 건데요, 사실은 제공을 했었습니다. 그런데 지금은 그렇게 로그아웃을 하는 함수를 더는 지원하지 않는다고 합니다.



어쨌거나 자동으로 키움증권 Open API의 로그인과 로그아웃을 하기 위해서는 먼저 위 스크린샷과 같이 새로 만들어 준 가상환경에서 pip install pywinauto 라고 아나콘다 프롬프트 상에서 타이핑해 주도록 합니다.



그리고 나서 PyQt5도 설치해 주도록 하는데, 어찌된 영문인지 아나콘다 프롬프트에서 하면 잘 인식을 하지 못해서 그냥 conda install PyQt5라고 해주는 편이 더 나은듯 합니다.



그리고 여기서 결정적인 실수를 하나 했습니다. 이 pyInspect는 파이썬 3.6이 아니라 파이썬 3.5에서 동작을 하기 때문에, 이에 맞춰서 움직일 수 있도록 환경을 설정해 주어야 한다는 것 입니다.




그래서 새로운 가상환경을 만들어 주는데, 이번에는 실수하지 않도록 파이썬 3.5로 만들어 주도록 합니다. 그리고 나서 github에 있는 pyinpect라는 공개되어 있는 프로그램의 소스를 그대로 복사해 와서 붙여넣기 하도록 해 봅니다. 그런데 문제는 이러고도 키움증권 Open API를 어떻게 조작할 수 있는 수단을 확보하지 못했다는 겁니다.


그래서 해결방법으로 먼저 제가 단타매매에 적당한 종목을 찾는 알고리즘의 부모 프로세서 역할을 할 파이썬 스크립트를 짜주는 것 입니다. 먼저 위 스크린샷처럼 초반부를 짜고, 핵심이 될 LoopOfMyAlgorithm이라는 메서드를 실행하기 위한 코드도 초기화를 하는 부분에 넣어 주도록 합니다.



다음으로 여기가 가장 중요한데, 파이썬이 설치되어 있는 폴더라고 해야 할까요? 아마 아나콘다가 설치되어 있는 폴더에 들어가면 사용자가 지정해 놓은 가상환경이 있습니다. 이 가상환경의 폴더로 가서, 거기에 있는 python.exe라는 파일의 경로를 위 스크린샷처럼 지정하도록 합니다.



다음으로 이전에도 이야기 한적이 있는 subprocess.Popen()메서드입니다. 그런데 여기서 파이썬 스크립트를 실행시킬 경우에는 위 스크린샷처럼 많은 곳에서 ['python', '내 스크립트 파일.py']라고 하는데, 처음에는 이 python이 뭔지 몰랐는데, 바로 아나콘다를 사용하는 저와 같은 경우에는 작동시키고자 하는 자식 프로세스의 파이썬 가상환경폴더에 있는 python.exe파일의 경로인 것 이었습니다.


생각해보면, 파이썬.py파일은 단독으로 실행이 되지 않고, 오로지 파이썬3나 파이썬2에 의해서만 실행이 되는데, 실행시키고자 하는 자식 프로세스에 맞는 환경을 설정해 줘야 하는 것 이었습니다. 이런 걸 하지 않으니까, 해당하는 py파일에서 계속해서 'import할 모듈이 없다'는 에러가 뜨는 것 입니다.




다소 시간이 걸리기는 했습니다만, 이런 방법으로 원하는 조건을 만족하는 코스피 종목을 찾을 수 있었습니다. 여기서 짚고 넘어가야 하는 것은, 지난번에 제가 코딩을 하였는 py파일은 아래와 같은 변경점이 나왔다는 것 입니다.



먼저 위 스크린샷처럼 부모 프로세스에서 가지고 올 데이터를 받는 과정이 추가가 되었습니다. 여기서 나온 부모 프로세스의 데이터는 앞으로 for문에서 반복하게 될 횟수를 결정지을 중요한 요소입니다.



다음으로 제가 설정한 조건입니다. 이 조건에서 변화량의 절대값 평균은 300을 초과할 것이며, 그러면서 1주당 가격은 당연 10만원 미만이 되어야 한다는 조건을 걸었습니다.



위 스크린샷처럼 어떻게 결과를 도출해 낼 수 있었습니다. 여기서 중요한 것은 1번 키움증권 Open API는 1000회 조회횟수 제한이 있다. 2번 조회횟수 제한을 피하기 위해선 로그아웃이 필요한데, 키움증권 Open API에는 이런 기능이 없다. 3번 그래서 이 문제는 subprocess를 이용해서, 로그인을 하는 기능이 있는 자식 프로세스 프로그램을 실행하고 종료하는 것을 반복시킨다. 라는 것으로 끝낼 수 있었습니다.

반응형