저번 게시글에서는 종목을 가져오고 일봉데이터를 가져오는 것을 진행하였다.
이번 게시글에서는 가져온 데이터를 바탕으로 종목을 분석하는 과정을 살펴본다.
저번 게시글에서 적었듯이, 책에서는 그랜빌의 매수신호 제4법칙으로 종목을 분석한다. 제4법칙은 상승 중인 장기 이동평균선 밑으로 내려간 일봉이 다시 이동평균선으로 다가갈 때를 매수 신호로 본다. 단순하게 120일 이동평균선이 상승중일 때 일봉이 이동평균선보다 아래로 갔다가 다시 위로 돌파하려는 모습으로 구성한다.
코드를 구성하는 과정은 책에 그림과 함께 자세하게 설명되어 있으니 책을 참고하면 좋을 것 같다. 아마 저자의 유튜브에도 있지 않을까 싶은데, 난 책으로만 가고 있어서 확실치는 않다.
코드를 구현하기에 앞서 이전에 구현해놓은 일봉데이터 부분을 수정한다.
trdata_slot() 함수에서 약간 수정하였다.
먼저 일봉데이터를 받아올 때 " 코드번호 " 와 같이 양쪽에 공백이 생기는 경우가 있어 strip() 함수를 사용해 공백을 지우고, GetCommDataEx는 600일 치 이상의 데이터는 받아올 수 없으므로 주석 처리한다.
120일 이동평균선을 받아오는데 왜 600일 치 이상의 데이터가 필요한지는 잘 모르겠다. 내가 주식을 잘 몰라서 그런가 싶기도 하지만 일단 책을 끝까지 하고 나면 이해가 되지 않을까 생각하며 넘어가도록 한다.
GetRepeatCnt 함수를 사용하면 한 번에 600일 치를 카운트하고 과거 데이터가 더 있다면 sPrevNext를 "2"로 보내준다. sPrevNext를 "2"로 설정한 다음 다시 요청하면 과거 데이터를 다시 가져오고, 더 이상의 과거 데이터가 없을 때까지 반복하게 된다. 과거 데이터를 반복해서 가져오는 코드도 작성해둔다.
리스트는 주소 값을 공유하기 때문에 데이터가 하나라도 변경되면 관련된 모든 리스트의 데이터가 변경되기 때문에 copy()를 이용해 주소값을 새로 만들고, 영향일 미치지 못하게 한다.
"120일 이동평균선을 구하려면 600일 치의 데이터로는 부족하다. 그랜빌의 매수신호 제4법칙에 적합한 120일 이동평균선과 주가가 어느 시점에서 포착될지 모르기 때문이다." 내가 아까 궁금해했던 부분이 다행히 책에 쓰여있었다. 600일 이상의 데이터가 필요하기 때문에 GetCommData를 사용한다.
CommRqData 함수를 이용하면 상장일부터의 일봉 데이터를 얻을 수 있는데, 600일 치 이상의 데이터면 항상 그래왔듯이 sPrevNext는 "2"로 반환된다. sPrevNext를 "2"로 설정하고 CommRqData를 다시 요청하면 된다.
결과적으로 self.calcul_data는 상장 이후부터의 모든 일봉데이터를 가지므로 그린빌의 매수신호 제4법칙의 각 과정을 구현한다.
pass_success는 모든 조건이 부합하는지 확인하기 위한 변수다.
if self.calcul_data == None or len(self.calcul_data) < 120 코드는 상장한 지 얼마 되지 않은 종목은 120일 치의 데이터가 없다는 전제하에 만들어놓은 조건문이다.
self.calcul_data[:120]은 최근 120일을 표현하는 것이고, total_price를 120번 더한 다음, 120으로 나누어 이동평균선의 가장 최근 가격을 구한다.
이동평균선에 대한 데이터를 키움 API로부터 받을 수 없어 위 과정을 반복해서 날짜별로 이동평균선의 가격을 구해야 한다.
다음 과정은 주가가 120일선에 걸쳐있는지 확인하는 것이다. 가장 최근의 일봉에서 고가와 저가 사이에 이평선이 있는지 확인한다.
리스트의 데이터를 다시 보면 ['', '현재가', '거래량', '거래대금', '날짜', '시가', '고가', '저가', '']의 형태다. 따라서 [0][7]은 저가, [0][6]은 고가를 의미한다.
이를 이용해 이평선이 최근 일봉의 저가보다는 위에 있고, 일봉의 고가보다는 아래에 있는지 확인한다.
코드만 봐서는 무슨 내용인지 모르겠다. 일단 120일 치가 있으면, 이평선을 구하고, 이평선이 고가보다 낮고, idx가 20보다 작을 땐 패스. 왜지? 그리고 idx가 증가하는 부분도 없다. 여기서 내용이 끝이 아닌가 보다. 일단 책의 다음 내용도 진행해본다.
우선 idx가 증가하는 부분은 여기에 있었다. 첫 번째 if문에 대한 책의 설명은 다음과 같다.
'그랜빌의 매수신호 제4법칙이 성립하려면 일정 기간 동안 고가가 120일 이동평균선보다 크거나 같으면 안 된다(이 책에서는 이 기간을 20일로 했다). 따라서 매 순간마다 이평선의 가격과 고가를 비교한다. 만약 고가가 이평선과 같거나 높은 구간이 발견되면 price_top_moving을 False로 설정하고, 이후의 조건은 확인하지 않도록 break 문을 이용해 반복문을 빠져나온다.'
즉 20일 동안 이평선 아래에만 있어야 한다는 것인데, 코드를 말로 풀어보자면
만약 120일 이평선(moving_average_price_prev)이 idx일(최근부터 1일) 보다 작거나 같고, 20일이 되지 않았다면 패스
인 건데, 내가 의문인 점은 [idx][6]이 고가인데 고가보다 작거나 같다는 것은 이평선 아래에 있는 게 아닌가 하는 부분이다. 열심히 생각을 하다가 그림을 그리니 이해가 됐다. 이평선이 고가보다 아래에 있다는 것은 현재 가격이 이평선에 비해 높다는 것이니까 정말 당연한 내용이었다. 역시 그림도 그려가면서 이해하는 게 가장 좋은 것 같다. 다음 내용으로 넘어가자.
마지막으로 그랜빌의 매수신호 제4법칙의 모든 조건이 성립할 때의 조건문을 만든다.
이제는 조건을 통과한 종목을 파일로 저장한다. 파일에 저장한 종목은 다음 날 장을 시작할 때 불러와서 사용한다.
조건을 통과하면 종목명을 조회한다. GetMasterCodeName은 종목코드를 가지고 종목명을 가져오는 함수다. 종목명을 구했으면 파일을 저장한다.
파일을 저장할 때는 open("저장폴더/파일명", 쓰기조건, "인코딩") 형태의 옵션을 가지는 함수를 이용한다. 여기서 쓰기조건은 a는 기존의 파일에 이어서 쓰는 옵션, w는 이전 데이터를 모두 지우고 새로 쓰는 옵션이다. write 할 때 \t는 TAB을 의미하고, \n을 의미한다. 파일 쓰기가 완료되면 self.calcul_data를 clear()로 초기화하고, 이벤트루프를 종료시켜 다음 종목을 분석하도록 만든다.
지금까지 포트폴리오 분석 알고리즘을 작성하였다. 이번 절에서 구현한 코드는 장이 끝나는 시점에 동작하도록 설정해야 하는데, 뒤에서 살펴본다고 한다.
주의해야 할 점은 각 종목을 분석하는데 3.6초 이상의 간격을 줘야 하므로 1,300여 개의 코스닥 종목을 분석하는 데 10시간 이상이 걸릴 수 있다는 점이다. 그리고 자정이 되면 업데이트 문제로 키움에서 프로그램의 연결을 끊을 수도 있다. 이를 참고해서 테스트를 진행한다.
여기까지가 이번 챕터의 내용입니다. 파이썬도 잘 모르고, 주식도 잘 모르는 상태에서 책을 따라가는 게 많이 힘들다고 느끼고 있습니다. 다른 언어를 조금 했었지만 정말 초보자 수준으로만 다뤘기 때문에 약간의 상식만 있을 뿐, 제대로 배워보지 못해서 생긴 한계를 느끼고 있습니다. 그저 책을 따라 할 뿐이기 때문에 빨리빨리 책을 끝낼 수 있을 거라고 생각했지만 생각처럼 잘 되지는 않습니다. 그래도 파이썬 기초를 설명하는 뒷부분부터는 책의 반절에 거의 근접한 것 같아 뿌듯하기도 하고 프로그램이 모습을 갖춰가는 모습을 보니 기분이 좋습니다.
오늘은 여기까지.
이 카테고리 게시글들은 아래 책을 따라하는 후기로, 자세한 내용은 아래 책과 저자의 유튜브를 참고하시고, 예제소스는 저자의 깃헙에서 확인하실 수 있습니다.
책 정보 : https://book.naver.com/bookdb/book_detail.nhn?bid=16330702
손가락 하나 까딱하지 않는 주식 거래 시스템 구축(위키북스 프로그래밍 & 프랙티스 시리즈 23)
매일 주식만 바라보던 일상에서 해방되어 가족 또는 친구들과 행복한 시간을 보내길 바랍니다!24시간 자동으로 주식을 분석하고 거래하는 시스템을 구축하는 방법을 배우고 나머지 시간은 더 ��
book.naver.com
저자 유튜브 : www.youtube.com/watch?v=1lHzaihEb48&list=PLDtzZPtOGenaSknTbsb6x6L39V0VPz_rS&index=2&t=0s
( 위 유튜브는 이 책을 설명해주는 재생목록의 첫 번째 영상입니다.)
저자 Github : https://github.com/programgarden
programgarden - Overview
책 : 24시간 운영 가능한 주식투자 시스템 구축하기[파이썬으로 만드는 자동 트레이딩 시스템] 유튜브: 프로그램 동산 학습코드 자료입니다. - programgarden
github.com
예제 소스는 저자의 깃허브에서 확인하실 수 있습니다.
위 3개의 링크는 매 게시글마다 올라갈 예정입니다.
'파이썬으로 주식 거래 시스템 구축' 카테고리의 다른 글
중간점검 (0) | 2020.07.27 |
---|---|
CHAPTER 6. 보유한 종목, 미체결 종목, 분석된 종목 합치기 (0) | 2020.07.23 |
CHAPTER 5. API를 이용해 투자 방식에 맞는 종목 분석하기 첫 번째 이야기 (0) | 2020.07.17 |
CHAPTER 4. 계좌 정보 가져오기 다섯 번째 이야기 (0) | 2020.07.14 |
CHAPTER 4. 계좌 정보 가져오기 네 번째 이야기 (0) | 2020.07.13 |