1 시작하며...
스터디겸 프로젝트로 python 으로만 구성된 주식기본 분석프로그램을 짜볼까한다.
1.1 프로젝트의 컨셉
왜 이런걸 만들어야 근본적인 이유는, "python 을 취미로 개발하고있으므로 뭐든지 만들고싶다." 이다. 그래서 뭐든지 칼을 빼들었으니... 무라도 썰어볼예정이다.
...
기본적으로 본 프로젝트는 다음의 가정으로 구성하고 직접구현, 검증할 것이다.
- 난 개별주를 고를 능력은 없으므로, 믿을만한 전문가가가 찍어주는 주식을 사자
- 단, 그 좋은주식들을 싼가격에 매수해야한다.
- 싸고 비싸고의 기준을 나 자신의 정량적인 기초 분석을 하여 판단하자.
- 본프로젝트를 통해 나만의 기초분석은 자동화 하는것이다. (일종의 간단한 퀀트)
- 내가 세운기준이므로 해당 주식을 조금더 믿고 길게 투자할수있을것이다.
- 난 게으르므로, 위에서 세운기준대로 매수할 매도할 타이밍을 자동알려주는 서비스를 개발한다. (텥레그램봇)
한마디로, 간단한 퀀트 툴을 직접 만드는것이다.
2 프로그램의 대략적인 구성
기본적으로 다음의 내용들을 직접구현할것이다. (이미 어느정도 각 기능의 50프로 이상은 직접 구현은 한 상태이다. 블로그에 해당 과정들을 정리하면서 각 기능들을 100프로 구현을 목표로할것이다.)
본 프로젝트를 통해서 다음의 내용을 직접 구현하여 사용 할 것이다.
본 포스팅 시리즈는 이미 파이썬이나 각종 개발능력이 충분하신분들에게는 허접한 과정이겠지만...나와같은 파이썬 초보자에게는 약간 도움이 될것같긴하다.
다음의 내용대로 진행 할 것이다. (각 스터디할 모듈 언급)
2.1 전체적인구성 : 라즈베리파이4
모든 기능은 라즈베리파이에서 24시간 자동으로 돌아간다.
테스트해보니 모든 다음의 모든기능들은 라즈베리파이에서도 동작되도 충분하다. 비싼 서버 혹은 고사양의 서버도 필요하지 않는다는것이다. 게다가 이러한 프로젝트의 특성상 장끝난후 매일매일의 데이터를 자동으로 크롤링해야 하기 때문에, 저전력으로 세팅한 라즈베리파이는 전기세부담없이 원하는데로 동작이 원활했다.
또한, 리눅스의 cron
을 사용함으로서, 원하는 시간에 원하는 스케쥴대로 진행이 원활하였다.
예를들면...
- 장끝난후 매일 할일 - 1 : 전종목의 가격정보, 금리 정보, 시장정보 크롤링
- 장끝난후 매일 할일 - 2 : 전종목의 rsi, 볼린져밴드, per, pbr 등의 보조지표 검색
- 장끝난후 매일 할일 - 3 : 전종목코드 새로 얻음(krx 크롤링), 종목설명 크롤링
- 일주일에 한번 할일 - 1 : 전종목의 RIM 계산, 전종목의 재무재표 크롤링
- 일주일에 한번 할일 - 2 : 전종목의 컨센서스(리포트요약본) 크롤링
이런식으로 매일매일 자동으로 진행해야하는데, 윈도우 서버의 경우 서비스에 등록하고 뭐하고 하는것이 여간 번거로운것이 아니다. 간단하게 linux 의 cron 을 설정하자
- 필요 배경지식 : linux 기본사용법, 라즈베리파이구성
2.2 db 구성 : pymongo
나만의 퀀트엔진을 만들기 위해서는 여러종류의 데이터들을 읽고, 통계도 내고 필터링도 해야할 것이다. 이럴때 매번 특정사이트를 크롤링한다거나, 엑셀로 수만라인을 수정, 만든느것은 비효율적이다.
이왕 공부할거.. 간단하게 db 에 넣고 빼고, 쿼리하는건 익혀두자.
- 필요 배경지식 : db 기본사용법, python:pymongo
- 코멘트 : python 으로 db 연동을 하여 테스트해보니 생각보다 어렵지 않았다.
2.3 크롤링 : bs4
각종 사이트들을 크롤링하여 데이터를 얻자. 물론 공짜로 데이터를 얻자. 내가 얻고자 하는 정보들을 직접 크롤링하자.
- 필요 배경지식 : db 기본사용법, python:bs4, html 기본구조, 웹쿼리 기본사항
- 코멘트 : 크롤링을 하면서 html 구조나 웹 쿼리의 구조등을 어렴풋 하게 읽힐수 있었다
2.4 데이터 처리 및 계산 : numpy, dataframe
데이터 통계나, db에서 쿼리한 데이터에 대한 처리(?) 는 numpy 나 dataframe 을 사용하자.
엑셀에서 할수있는 거의 모든기능을 python 으로 빠르게 처리할 수 있었다.
- 필요 배경지식 : db 기본사용법, python:numpy, python:dataframe
- 코멘트 : 사경인회계사님의 S-RIM 을 직접 계산하여 전종목의 S-RIM 값을 db 화 하고있다. 역시 dataframe, numpy 를 엮어서 진행하였다.
2.5 엑셀, 구글시트 연동 : flask backend
기본적으로 간단한 분석은 역시 엑셀만한도구가 없었다. (매번 dataframe / pyplot 을 사용하여 그래프를 그리는고 통계를내는건 아무래도 속도가 느리고 불편한점이 많았다. 매번 jupyter 로 그리는것도 불편)
그래서 엑셀로 서버의 각종정보를 엑셀로 연동하여 불러들이고, 엑셀에서 기본적인 가설들을 검증, 혹은 간단하게 그래프를 그리도록한다. 엑셀츼 최근버젼에서는 power query
라는 도구를 이용하면, 각종 외부 데이터를 긁을수있었다. db쿼리를 직접 날릴수도있었는데.. 이는 피하고 무조건 웹서버를 통해서 데이터를 긁어오도록 할 것이다. 이유는 엑셀에서 db 쿼리를 직접날리는것이 좋긴한데 각종 테이블 join이나 여러가지 정보들을 합치려면 쿼리도 복잡해지기 때문이다.
때문에, 파이썬으로 전처리(?) 비슷하게 원하는 정보들을 빠르게 코딩하고, 그 결과물만 flask
를 통해서 간단한 웹쿼리로 어디서든지 부르게 하면 간단하다.
예를들면.. 전종목의 ticker 정보를 얻기위해 flask
쪽에 /get/ticker
라는 메소드를 구현해놓는다.
https://myserver.duckdns.org/stock/api/get/ticker
그러면 엑셀에서는 dbc 연결등도 필요없이 단순한 power query 의 웹쿼리 기능만으로 db 정보를 갖고올수 있게된다.
이는 구글시트에서도 마찬가지이다. 구글시트 app script 에서도 db 연동이 가능하지만, db 쿼리값이 수천개가 넘어가면 쿼리의 내용을 처리하는데 너무 시간이 오래걸려 timeout 이 나서 사용거의 불가능할정도이다. 이럴때도 db연결 쿼리말고 웹쿼리를 이용하면 빠르게 붙일수있다.
- 필요 배경지식 : db 기본사용법, python:flask, 웹쿼리, restful-api
2.6 자동 분석 결과서 : streamlit
streamlit 은 최근에 웹검색하다가 알게된 모듈이다.
기존에 내가 분석한 데이터를 기반으로 하나의 web page 를 만들어서 매일매일 새로운 보고서를 만드는데 jupiter 를 사용하였다. 사용하다보니, 붊만이 뭔가 깔끔하지 않았으며.. 그래프를 보기좋게 만든는데 약간의 공수가 들었다.
streawmit 을 사용하면 jupyter 보다 좀더 작은 공수로, 좀더 깔끔하게 웹페이지를 구성할 수있다.
- 필요 배경지식 : db 기본사용법, python:streamlit
2.7 투자 아이디어
위에서 클로링한 데이터들을 바탕으로 몇몇 가정, 시나리오로를 엑셀로 1차 검증한다.
어느정도 검증이 끝났으면 streawmit 으로 자동으로 매일매일 보고서를 볼수있도록하고, 의미있는 시그널이 나올경우 telegram 으로 노티를 보내서 게으른 나를 위해 일하도록할 것이다.
3 앞으로 계획
위에서 구성한 내용들을 하나하나 구현하여 코딩할 것이다. 현재는 대략적으로 구현은 되어있으나 가다듬지 않아 엉망이다.
남에게 보여준다는 생각으로 코드도 정리하고 과정들을 블로그에 작성할 예정이다.
단, 크롤링이나 저작권과 같이 예민한부분은 공개하지 않을것이다.
또한 어느정도 분석이 끝난 데이터들은 자동으로 블로그에 발행할 것이다.
- 다음의 모든 과정은 다음의 링크로 올릴것이다
4 사실 이모든게...
사실 위에서 말한 모든게 의미가 있나 싶긴하다.
저렇게 투자라는게 간단한방법으로 되는거면 모두가 부자가되어있겠지... 그냥 난 재밌게 코딩을 취미로 하고싶을뿐....
재밌게 코딩합시다.
...
- 해당 포스팅은 tistory-posting-cli 를 이용해 발행되었습니다.