본문 바로가기

금융 데이터 분석/실험실

주식시장의 정량적 분석에 필요한 재료들은 어디에 있을까?

 코딩을 활용하여 무언가를 해보려면 데이터 수집을 해야한다. 기관의 연구원이라면 이미 활용할 수 있는 데이터가 많겠지만 우리는 개인이니까 직접 데이터를 모아야한다. github에서 소스를 공유하듯이 데이터도 공유를 하면 좋으련만 돈놀이와 관련된 데이터라 그런지 유용한 데이터를 공유해주는 사람은 거의 없다.

 

 데이터 스크랩퍼를 만들기 위해서는 어떤 프로그래밍 언어를 사용하여도 무관하지만 대부분은 생산성이 좋은 python을 사용한다. python에서 주로 활용되는 라이브러리는 html 파싱을 위한 BeautifulSoup, html request를 보내기 위한 requests 이다. 그 외에 필수적인 도구는 chrome 브라우저의 개발자 도구이다. 개발자 도구는 파싱을 위해 html 페이지 구조를 분석하거나 html request header를 만들 때 참고하기 위해 사용된다. 간혹 html request를 날릴 때 header를 웹브라우저와 똑같이 쌓아도 응답이 오지 않는 괴상한 사이트들이 있다. 그 경우에는 개발자 도구의 console에서 간단한 javascript 코딩을 통해 원하는 정보를 긁어올 수 있다.

 

 본 포스트는 스크랩핑을 전수하기 위한 포스트가 아니다. 그러므로 별도의 코드는 올려두지 않을 것이다. 위에서 언급된 언어, 라이브러리, 도구의 사용법은 구글링을 통해 익히길 바란다. 대신 본 포스트에서는 주식시장의 정량적 분석에 유용할만한 데이터를 얻을 수 있는 사이트들을 소개하고자 한다.

상장 종목리스트

 각 종목의 정보를 얻기 이전에 코스피와 코스닥 시장에 어느 종목들이 존재하는지를 알아야 한다. 코스피와 코스닥의 상장종목 리스트는 아래의 링크에서 '검색' 버튼을 클릭하여 얻을 수 있다.

marketdata.krx.co.kr/contents/MKD/04/0402/04020100/MKD04020100T1.jsp

크롬에서 개발자 도구를 켜고 '검색' 버튼을 누르면 response에 데이터가 담겨있는 request를 찾을 수 있다.

어느 request에서 데이터를 가져오는지 알아냈으므로 남은 할 일은 python으로 request를 보내는 것이다. 해당 request에 대한 자세한 정보는 header 탭에서 볼 수 있다.

Network의 Headers 탭에서 request url, method, header의 내용 등을 확인할 수 있다.

Python으로 데이터를 가져오기 위해서는 OTP를 가져오는 부분까지 구현해야 해서 까다로울 수 있다. robots.txt에 disallow가 찍혀있기도 하고. 그냥 Response에 있는 json 데이터를 전체선택하여 파싱한 후 사용하는 것이 속편하다.

캔들차트

 투자를 할 때 시세가 가장 중요하므로 대부분의 사람들은 캔들차트를 기본으로 사용한다. 네이버 금융, 다음 금융, yahoo finance 등 캔들차트 데이터를 얻을 수 있는 곳은 많지만 필자는 다음 금융을 주로 이용한다 (yahoo finance는 국내 시장의 전 종목 데이터를 제공하지 않고, 네이버는 액면분할 했을 때 액면분할 전의 시세를 보정하지 않는다). 아래의 링크는 크롬 개발자 도구를 활용하여 얻어낸 url 들이다. 데이터를 가져오는 request는 종목 페이지의 차트를 축소하여 얻어낼 수 있다.

1 day

https://finance.daum.net/api/charts/A005930/days?limit=200&adjusted=true&to=2019-12-12%2000%3A00%3A00.0

종목코드 A005930과 날짜를 바꿔 request를 보내면 데이터를 얻을 수 있다. header를 제대로 쌓지 않으면 403 forbidden이 뜰 수 있으므로 header도 신경쓰도록 하자.

1 hour

https://finance.daum.net/api/charts/A005930/60/minutes?limit=200&adjusted=true&to=2020-08-21%2012%3A00%3A00.0

30 minutes

https://finance.daum.net/api/charts/A005930/30/minutes?limit=200&adjusted=true&to=2020-08-21%2012%3A00%3A00.0

 

재무제표

 캔들차트에 비해 과거의 재무정보를 얻는 것은 어렵다. 10년치 정도의 데이터를 얻기 위해서는 유료 서비스를 활용해야 한다. 

오랜 기간의 데이터를 제공하지는 않지만 무료로 재무 정보를 얻고 싶다면 daum이나 네이버 금융을 참고할 수 있다. 아래의 url은 daum 금융 종목페이지의 기업정보 탭에서 얻어낼 수 있다.

wisefn.finance.daum.net/v1/company/cF1001.aspx?cmp_cd=005930&frq=0&rpt=1&finGubun=MAIN

wisefn.finance.daum의 robots.txt는 scraping을 허용하지 않으므로 이에 주의하여 데이터를 수집하도록 하자.

발행주식수

 발행주식수는 매일 변하는 시가 총액을 구하는데 필요하므로 중요한 정보이다. 최근 4년 간의 발행주식수는 재무정보를 얻을 수 있는 위의 링크에서도 얻을 수 있다. 더 오랜 기간의 발행주식수를 얻기 위해서는 dart를 scraping 해야할 수 있다.

배당

 배당 관련 정보는 위에서 언급한 재무정보 페이지에서도 얻을 수 있다. 5년치 이상의 배당 내역은 SEIBro 에서 얻을 수 있다.

SEIBro 에서 제공하는 배당내역 검색기

'조회' 버튼을 누를 때 보내는 request를 잡아 장기간의 배당 내역을 얻는 scraper를 만들 수 있다. SEIBro에서 배당 정보를 얻기 위해서는 session 값이 필요하므로 다른 페이지보다 scraping 하기가 까다로울 수 있다.

자연어

 수치적인 데이터만 가지고 수익을 내는 알고리즘을 만드는 것은 불가능할 수 있다. 경우에 따라서는 자연어 데이터를 활용할 필요가 있다.

네이버 종목토론방

 각 종목에 대한 사람들의 관심도와 여론을 파악하는데 유용하다. 종목토론방 데이터는 아래의 페이지를 저장하여 직접 parsing 해야 얻을 수 있다. finance.naver.com의 robots.txt에서는 일반 user의 페이지 수집을 허용하지 않으므로 주의하도록 하자.

finance.naver.com/item/board.nhn?code=005930

Parsing 작업을 직접하기 귀찮다면 gyusu 님이 만든 훌륭한 scraper를 아래의 repository에서 가져다 써먹을 수 있다.

github.com/nomorecoke/naver-finance-board-crawler

뉴스

 관심종목이 언급된 뉴스는 테마나 종목의 예후에 대한 여론을 파악하는 데에 유용하게 사용할 수 있다. 구글 뉴스의 경우 페이지 수집을 허용하고 있으므로 이를 잘 활용하도록 하자. 아래의 링크는 구글 뉴스의 비즈니스 토픽 페이지이다.

news.google.com/topics/CAAqJggKIiBDQkFTRWdvSUwyMHZNRGx6TVdZU0FtdHZHZ0pMVWlnQVAB?hl=ko&gl=KR&ceid=KR%3Ako

 

 

 

 지금까지 데이터 수집을 위한 여러 사이트와 도구들을 소개했다. 이외에도 유용한 데이터를 얻을 수 있는 사이트를 찾아내면 본 포스트에 추가할 예정이다. Scraper를 만들거나 사용할 때에는 각 사이트의 이용약관 잘 확인하고 서비스에 지장을 주지 않도록 주의하자.

'금융 데이터 분석 > 실험실' 카테고리의 다른 글

주식 데이터 수집을 위한 DB 스키마  (0) 2021.01.07
본 블로그는 쿠팡 파트너스 활동을 포함하고 있으며, 이에 따른 일정액의 수수료를 제공받습니다.