일전에 주식 자동 매매 프로그램 구현을 도전하다가 좌절하고 한동안 허황된 꿈을 접어두고 있던 직장인입니다.
그러다 이번에는 할 수 있다! #퀀트투자 라는 책을 보고 감명을 받아서 자동 종목 선정 프로그램 구현을 시도해봤습니다.
이번에도 퇴근 후, 주말에 부인님의 눈치밥을 먹어가면서 어찌어찌 프로그램을 짜봤는데...
결국에는 또 삽질인 것 같습니다.
삽질한 노력이 안타까워 썰을 한 번 풀어봅니다.
이번에는 #파이썬으로 작성했고, 파이썬의 #OpenDartReader 를 활용해보려고 했으나 그냥 #Dart 의 '재무정보 일괄 다운로드'를 활용했습니다.
최초 전략은 다음과 같았습니다.
파이썬에서 Dart API를 이용해서 코스피 상장 기업들의 재무정보를 받아오고 이를 계량 수치화하여 최적의 주식을 선정한다.
그런데 Dart API가 생각보다 불안정한 부분도 많고 무엇보다 데이터 요청 횟수의 제한이 있어서 수작업으로 재무정보를 다운로드 받았습니다. (2016 ~ 2019)
https://opendart.fss.or.kr/disclosureinfo/fnltt/dwld/main.do
그리고 어떤 지표를 사용할 것인가, 어떻게 최적의 주식을 선택할 것인가는
강환국님이 쓰신 '할수있다! 퀀트투자'라는 도서의 '밸류 + 퀄리티 + 모멘텀' 콤보를 사용하였습니다.
분석에 활용한 데이터는 'PER', 'PBR', 'PCR', 'PSR', 'NEW_F', 'GPA', 'MOMENTUM' 이었고 이를 위해서
Dart API의 재무정보 다운로드와 파이썬의 #pykrx 모듈을 사용하여 raw 데이터를 수집할 수 있었습니다.
이전에 먼저 고난의 길을 걸으셨던 분들처럼 저도 데이터 수집에 상당히 애를 먹었는데,
https://www.clien.net/service/board/use/14494799CLIEN
최대한 간소하게 해보자(데이터 없는 기업은 버려!)는 취지로 러프하게 데이터를 수집했더니
2016년도에는 390여개의 기업 그 이후로 점차 나아져서 2019년 3분기에는 495개 기업의 데이터를 수집할 수 있었습니다.
(2019년을 기준으로 코스닥 시장에 약 799개의 기업이 등록되어 있다고 하니 50% 정도의 기업에서만 데이터를 수집할 수 있었습니다.)
각 지표는 다음과 같이 산출하였습니다.
PER = pykrx의 get_market_fundamental_by_date 함수 이용
PBR = pykrx의 get_market_fundamental_by_date 함수 이용
PCR = 시가총액(pykrx의 get_market_cap_by_date) / 영업활동 현금흐름
PSR = 시가총액(pykrx의 get_market_cap_by_date) / 매출액
NEW_F = 당기순이익, 영업활동 현금흐름이 +인가?
GPA = 매출총이익 / 자산총계
MOMENTUM = 재무정보 조회일 기준 1년 전 주가, 재무정보 조회일 주가의 CAGR
CAGR = 재무정보 조회일 주가, 재무정보 조회일 기준 1년 후 주가의 CAGR
이렇게 지표를 선정하고 2016년 1/4분기부터 2019년 4/4분기까지 데이터를 읽어와서 각 분기데이터 별로 순위를 매겼습니다.(rank)
그리고 각 지표 별 순위를 다 더하고 그 순위를 합계한 총합을 또 순위를 내봤습니다!
그러니까 정리하면 각 분기의 기업별 재무지표를 바탕으로 지표 별 순위를 매기고 지표 별 순위를 합쳐서 통합 순위를 매겼고,
이를 1년 후 CAGR과 얼마나 상관관계가 있는지 비교해봤습니다.
그랬더니 통계학적으로 유의미한 결과가 안 나오더군요.
그래서 혹시나 하는 마음에 머신러닝을 이용해보자 하고 Random Forest를 이용하여 예측을 돌려봤습니다....
그런데.. 정말.... 세상살이가 생각대로 되는 것이 하나도 없더군요.
어마어마한 주식시장의 진리를 발견하게 될 줄 알았는데, 그냥 시간만 헛되이 보낸 것 같습니다.
주식 매매 자동화의 꿈은 요원한 것 같네요. ㅜㅜ