본문 바로가기

퀀트

[퀀트 프로젝트] 종목코드 및 섹터 데이터 크롤링

1. 목차

 

  • 최근 영업일의 데이터, 주식 종목코드, 그리고 섹터 정보를 포함한 필수 정보를 수집하고, 이를 Mysql 데이터베이스에 저장하는 파트입니다. 
  • 최근 영업일을 구해야 시장의 최신 상태를 반영하여 효율적인 데이터 관리와 분석이 가능하죠.

1.1 최근 영업일 크롤링

  • 네이버페이 증권의 국내증시 자금동향에서 최근 영업일 날짜를 자동으로 가져오려고 합니다.
    • 이건 매일 바뀌는 날짜를 프로그램이 실행될 때마다 자동으로 모으기 위해서입니다.
    • 자동화를 통해 최신 시장 상황을 반영한 데이터를 효율적으로 관리할 수 있게 되죠!
    • 개발자 도구로 그 위치를 알아내고 크롤링하면, 최근 영업일 날짜 데이터를 정확히 가져올 수 있습니다.

1.2 종목코드 크롤링

generate.cmd
download.cmd

  • KRX 정보시스템의  업종분류 탭에서 국내 종목의 기본 정보 자동으로 수집합니다.
  • 이 정보는 CSV 파일로 다운로드 가능하지만, 매일 수동으로 다운로드하는 것은 자동화 목표에 부합하지 않죠.
  • 그래서 개발자 도구의 네트워크 탭을 통해 CSV 다운로드 과정에서 발생하는 네트워크 요청을 분석할 거예요.
  • 분석 결과, 특정 URL에 정보(쿼리)를 제출하면 OTP를 받을 수 있음을 확인했습니다. 

  • 분석을 마쳤으니 코드를 쓰기만 하면 되겠죠!
  • 쿼리에서 날짜 부분을 최근 영업일로 바꾸고, 시장을 코스피와 코스닥으로 나눠 각각 데이터를 모은 다음, 이 두 데이터 프레임을 합치면 됩니다.

  • 데이터 클린징 작업으로, 추후 데이터 활용을 용이하게 하기 위해 변환 작업을 진행했습니다.
  • 종목구분 컬럼을 추가해, 종목명을 통해 종목을 구분할 수 있게 했습니다.
  • 예를 들어, '스팩'이라고 표기된 종목은 스팩으로, '우선주'라고 적힌 종목은 우선주로, '리츠'가 포함된 종목은 리츠로 분류했어요. 그 외에도 여러 사소한 클린징 작업을 진행했습니다.

  • 이제 크롤링한 데이터를 MySQL에 데이터베이스화 해야 합니다.
    • 물론 엑셀파일에 데이터를 저장할 수도 있겠지만, MySQL 테이블을 정의하고 저장하는 건, 데이터의 무결성과 처리 속도를 위해서 입니다.
  • 일단 왼쪽의 그림처럼 테이블을 정의합니다.
  • 크롤링하고 클린징한 데이터를 '업서트' 방식으로 넣습니다.
    • 업서트는 삽입하고 갱신하는 것을 의미합니다.
    • 예를 들어, 같은 종목코드와 날짜의 데이터가 있으면, 그걸 새 정보로 업데이트하라는 뜻이에요.
    • 같은 종목코드와 날짜 데이터가 두 개 있다면 무결성 원칙에 어긋나겠죠!

 

MYSQL 테이블에 기본 정보 데이터가 저장된 모습


1.3 섹터 정보 크롤링

Fnguide Index

  • 이번엔 섹터 정보 크롤링을 할 겁니다.
  • 우리나라 지수 제공 업체인 FnGuide Index에서 WICS 산업분류 정보를 발표하니, 그 정보를 크롤링해 보려고 합니다.
  • 왼쪽 메뉴에서 [WICS → 에너지] 클릭!

  • 여기서 Components tab으로 이동!
  • 개발자 도구의 네트워크를 열어두면서, 현 날짜를 입력해주고 데이터 센터 바로가기를 누르기!

  • 네트워크 흐름을 보면 특정 Request URL이 나타납니다.
  • 이 URL을 주소창에 붙여넣으면 바로 섹터 정보가 페이지에 나타난다는 걸 볼 수 있습니다.
  • 이 데이터는 HTML 형식이 아니라 JSON 형식으로 되어 있어서, 문법이 간단하고 데이터 용량도 작고 데이터 교환도 빠르죠!
  • 쿼리 파라미터, 즉 주소 뒤에 '?' 뒤에 오는 부분에서 날짜 값과 섹터 값을 바꾸면 해당하는 다른 데이터도 쉽게 볼 수 있습니다.

  • 그래서 코드 짜기도 쉽습니다.
  • URL 주소를 가져와서 날짜와 섹터 값을 바꿀 수 있도록 변수로 설정하기만 하면 완성!

  • 이후 단계는 비슷해요. 테이블을 정의하고, 업서트 방식으로 데이터를 넘기면, 오른쪽의 사진처럼 MYSQL에서 정보가 테이블에 저장된 것을 확인할 수 있습니다.