지난 포스트에서
1. 키움증권 OpenAPI를 사용하여 모든 상장 종목을 받아와서 SQLite DB를 사용하여 로컬 컴퓨터에 데이타를 쌓고
2. 받아 놓은 종목 데이타를 주기적으로 업데이트하는 코드도 추가하고
3. 네이버 금융에서 종목별 분기 실적을 가져와서 로컬에 데이타를 축척하는 코드를 만들었다.
이제 로컬 컴퓨터의 데이타베이스에는 코스피, 코스닥 테이블이 존재하고 여기에 모든 종목들이 저장되어 있다. 그리고, 분기실적 테이블이 존재하고 종목-분기 키쌍으로 분기실적 데이타가 쌓였다. 이제 이 데이타를 사용하여 간단하게 멀티플이 낮은 종목을 찾아서 다음과 같은 형식의 DataFrame을 만들어 엑셀파일로 export할 생각이다.
종목코드 | 종목명 | 시가총액 | PER | EPS | ROE | PBR | 전년동기매출액 | 전년동기영업이익 | 직전분기매출액 | 직전분기영업이익 | 분기매출액 | 분기영업이익 | 멀티플 |
멀티플 = 시가총액 / (분기영업이익 x 4)
코스피 코스닥의 평균 멀티플은 10정도이고 이 멀티플이 낮을 수록 저평가되어 있다고 생각한다. 이 데이타를 바탕으로 1차 스크리닝을 하여 저평가주를 찾고 리스트에 뽑혀진 각 회사의 정보를 찾아보고 투자를 하는건 어떨까?
In Code We Trust
main함수부터 시작해보자. 너무 간단하게도 그냥 한개 함수를 호출하고 끝이다.
search_company()는 복잡하진 않지만 좀 길어서 세부분으로 나누었다.
결과를 빨리 보고 싶기도 하고 귀찮기도 해서 분기 년월을 하드코딩을 해서 넣어버렸다. get_jongmokInfo()함수로 kospi, kosdaq 테이블의 모든 정보를 DB에서 긁어왔다. "Select * from kospi;" 뭐 이런식이었다. 현분기, 직전분기, 전년동기를 하드코딩해서 넣고 DataFrame에 사용할 컬럼 리스트도 만들었다.
받아온 모든 종목 데이타 all_company에서 레코드마다 종목코드, 종목명, 시가총액, PER, EPS, ROE, PBR을 뽑고 난 다음, 분기실적 테이블에서 종목코드+분기 키쌍 조합으로 매출액, 영업이익을 각각 가지고 온다. 이제 한 종목에 대한 모든 필요한 데이타가 모였으므로 멀티플을 계산하고 isValuable함수를 불러 조건에 부합하는지 확인한다. 조건에 맞지 않으면 다음 종목으로 넘어간다. 조건에 맞으면 rows 리스트에 row 데이타를 추가한다.
잠깐 isValuable()이 뭘하는지 보자. 주석이 모든걸 말해주겠지만 너무 간단한 조건 검색이다. 나중에 UI를 가진 어플리케이션이나 앱을 만들게 되면 훨씬 더 자세한 검색이 가능하도록 고치면 된다. 당장은 큰 목표가 없어 시작은 이렇게 간단하다.
search_company()함수의 뒷부분이다. for 루프가 끝나고 모든 데이타가 rows에 저장되었고 이것과 컬럼데이타로 DataFrame 객체를 만든다. 간단하게 오늘날짜를 받아와서 엑셀파일로 export하면 끝이난다.
1차 스크리닝 다음 단계?
대부분 전문투자자들은 아직도 주식담당과 통화를 한다든지 회사에 방문해 직접 상태를 확인하기도 한다는데 개인 투자자들에게는 이런 접근방법은 어렵고 시간도 많이 든다.
만약 프로그래밍 적으로만 접근하여 투자를 계획한다고 하면 한단계 더 나아가 뽑혀진 리스트의 회사 각각의 주가를 머신러닝을 돌려서 거래량이 적당히 있으면서 다시 올라갈 가능성이 있는 종목을 분류해도 괜찮을 것 같다. 머신러닝이 과거의 주가를 바탕으로 추측하는 것이라 복잡다단한 현실 세계의 미래를 예측하기 어렵다는 문제가 있어서 그다지 신뢰하긴 어려울 것 같긴하다. 그리고, 널리고 널린 초보적인 수준의 머신러닝 접근 방법으로는 전혀 먹힐 것 같지 않다.
이래저래 대기업 투자사에서 일한 사람들이 알려준 사실로는 적게는 30% 많게는 60% 가까이 매일 프로그램이 매매를 자동으로 하고 있다고 하니 바야흐로 이 알고리즘의 헛점을 찾아 역투자(exploit을 돌린다고 표현해도 될 것 같다.)하는 해커들이 지구상 어디엔가 있는지도 모른다. 물론 이렇게 하려면 첫째는 이 자동 매매 프로그램을 공급한 개발자이거나 또는 이 프로그램을 입수한 해커여야 할 것이다.
저평가 주 확인
멀티플이 낮은 회사들은 과연 정말 저평가주일까? 아니면 이 또한 헛짓거리일까? 아니다. 듣기론 이정도 정보를 검색하도록 해주는데도 돈을 내야 한다고 하니 전혀 쓸데없는 짓을 한 것 같진않다. 그리고, 애초에 이걸 만들려고 한 이유가 내가 필요로 하는 정보를 내가 직접 찾아내는데 있었다. 누군가가 추천하는 종목을 믿을 수가 없었다. 그것보다 더 저평가된 주식이 있을거라 믿었기 때문이다.
일반 사람들이 바라보는 주식은 늘 누군가 수많은 팔로워를 거느린 유명한 사람이 발굴하여 널리 알린 주식들이고 그 연예인과 같은 스타들은 자신의 팔로워에게 알리기 전 미리 그 주식을 보유하고 있었을까? 뜬금없는 곳에서 상한가가 나오기도 하고 가치가 있는 기업에서 하한가가 나오기도 하는 한국시장은 숫자를 이용한 프로그램만으로 매매를 하기엔 너무나 어려워 보인다. (그렇다면 나의 다음 할 일은 수많은 팔로워를 거느린 영향력있는 인물이 되는 것인가? ㅎㅎㅎ)
엑셀파일로 만들어진 결과파일의 기업 리스트를 보니 나의 초간단 알고리즘으로 대략 250여개가 나왔고 멀티플이 5보다 낮은 기업들을 추리니 130여개가 나왔다. 개중엔 우선주들도 포함되어 있어서 제외시키고 130개 모두는 아니지만 눈에 띄는 기업들 하나하나 찾아보았다. 나의 편견이 담긴 시선으로는 98% 이상의 기업이 다 저평가를 받는 이유가 있는 기업같이 보인다. 그리고, 왠지 앞으로 계속 그럴것 같다. 하지만 나머지 2%는? 아리까리하다. 초보자의 눈이니 그렇겠지만 그래도 한번 이 기업들에 투자는 해봐야겠다. :-)
github 소스코드
전체 소스코드는 다음 위치에서 받을 수 있다.
https://github.com/mole-cricket/kiwoom-openapi
mole-cricket/kiwoom-openapi
Contribute to mole-cricket/kiwoom-openapi development by creating an account on GitHub.
github.com