본문 바로가기
데이터분석/크롤링

파이썬 퀀트투자(1): 최근 영업일 기준 데이터 크롤링

by 코듀킹 2024. 10. 9.

파이썬 퀀트투자 시리즈는 '헨리의 퀀트대학' 유튜브 및 깃허브를 운영하는 이현열 작가님의 코딩과 그리고 '할 수 있다! 알고 투자' 유튜브 채널을 운영하는 강환국 작가님의 (한국)성장 가치, 소형주 전략을 합쳐서 제작하게 된 시리즈입니다. 

 

(한국)성장 가치, 소형주 전략은 아래와 같은 비중으로 투자하는 전략입니다. 미국 주식의 경우 켄 피셔 대형주 전략을 쓰지 않고, S&P500에만 투자해도 백테스트 결과 크게 차이가 없는걸로 나타났습니다. 그래서 여기서는 (미국)켄 피셔 대형주 전략은 제외할 예정입니다. 

 

 

이 전략으로 한달에 한 번씩 한국의 성장 가치, 소형주 종목을 20개 선정하고, 매달 비율에 맞춰서 리벨런싱 하는 과정까지 진행해보겠습니다.

 

최근 영업일 기준 데이터 크롤링

네이버 금융의 [국내증시 → 증시자금동향]을 들어가면, 이전 2영업일에 해당하는 날짜가 있습니다. 이 날짜는 자동으로 업데이트 되므로 해당 부분을 크롤링 한후 날짜에 해당하는 쿼리 항목에 사용할 목적으로 크롤링을 제일 먼저 해주어야합니다.

 

먼저 get() 함수를 통해 해당 페이지 내용을 받아온 후, BeautifulSoup() 함수를 이용해 해당 페이지의 HTML 내용을 BeautifulSoup 객체로 만들어 줍니다. 

import requests as rq
from bs4 import BeautifulSoup

url = 'https://finance.naver.com/sise/sise_deposit.naver'
data = rq.get(url) # 결과: <Response [200]>
data_html = BeautifulSoup(data.content) # 결과: 홈페이지 HTML 전체

 

개발자도구 화면을 이용해 해당 데이터가 있는 부분을 확인해보면 [클래스가 subtop_sise_graph2인 div 태그 → 클래스가 subtop_chart_note인 ul 태그 → li 태그 → 클래스가 tah인 span 태그]에 해당 데이터가 위치해 있다는 걸 알 수 있습니다.

 

여기서 select() 메서드를 통해 해당 태그의 데이터를 추출해보면, 아래와 같이 총 5개의 요소가 출력됩니다.

data_html.select(
    'div.subtop_sise_graph2 > ul.subtop_chart_note > li > span.tah'
)
"""
결과:
[<span class="tah">  |  2024.10.04</span>,
 <span class="tah">  |  2024.10.04</span>,
 <span class="tah">  |  2024.10.04</span>,
 <span class="tah">  |  2024.10.04</span>,
 <span class="tah">  |  2024.10.04</span>]
"""

 

우리는 2024.10.04 라는 날짜 데이터 하나만 필요하기 때문에  select() 대신 select_one() 메서드를 사용할 것입니다. 

 

data_html.select_one(
    'div.subtop_sise_graph2 > ul.subtop_chart_note > li > span.tah'
) # 결과: <span class="tah">  |  2024.10.04</span>

 

이제 text 메소드를 통해서 텍스트 데이터만 추출해줍니다. 

 

parse_day = data_html.select_one(
    'div.subtop_sise_graph2 > ul.subtop_chart_note > li > span.tah'
).text # 결과: \xa0\xa0|\xa0\xa02024.10.04

 

이렇게 추출하고 나면, 앞에 알 수 없는 텍스트가 같이 출력이 됩니다. 이 부분을 제거하기 위해서 정규표현식을 사용합니다. 먼저 위 데이터를 parse_day에 저장해준 다음, findall() 메서드 내에 정규 표현식을 이용해 숫자에 해당하는 부분만을 추출해줍니다. '[0-9]+'는 모든 숫자를 의미하는 표현식입니다.

 

import re

biz_day = re.findall('[0-9]+', parse_day) 
# 결과: ['2024', '10', '04']

 

이렇게 나온 결과를 biz_day에 담아주고, .join() 메서드를 통해서 하나의 문자열 형태로 만들어주면 끝입니다.

 

biz_day = ''.join(biz_day) # 결과: 20241004

 


전체 코드

import requests as rq
from bs4 import BeautifulSoup

url = 'https://finance.naver.com/sise/sise_deposit.naver'
data = rq.get(url)
data_html = BeautifulSoup(data.content)

parse_day = data_html.select(
    'div.subtop_sise_graph2 > ul.subtop_chart_note > li > span.tah'
)

# 똑같은 부분이 여러개 위치할 때는 select_one(제일 위에꺼 한개만 나옴.)
parse_day = data_html.select_one(
    'div.subtop_sise_graph2 > ul.subtop_chart_note > li > span.tah'
).text

biz_day = re.findall('[0-9]+', parse_day)
print(biz_day)

biz_day = ''.join(biz_day)

 

 

참고 자료

https://github.com/hyunyulhenry/quant_py/blob/main/data_korea.ipynb

 

 

다음편

 

파이썬 퀀트투자(2): 한국거래소 업종 분류 현황 크롤링

주식 관련 데이터를 구하기 위해 가장 먼저 해야할 일은 어떤 종목들이 해당 국가 거래소에 상장되어있는가에 대한 정보를 구하는 것입니다. 우리나의 경우, 한국거래소에서 제공하는 업종분류

coduking.tistory.com

 

댓글