본문 바로가기
programming language/Python

Python 주식 시장 개장일/휴장일 대체휴일 확인하기

by __observer__ 2021. 10. 11.
반응형

최근에 공휴일이 주말과 겹치면서 대체 휴일이 많아지고 있습니다.

이번 년도 대체 휴일은 광복절, 개천절, 한글날 이렇게 3일 이었습니다.

휴장일

아래 포스팅에서 ‘Python 주식 시장 개장일/휴장일 확인하기” 에 대해 소개한 적이 있는데 ~

https://iamaman.tistory.com/3542

trading_calendars, pandas_market_calendars, exchange_calendars 모듈을 사용했을때는 대체휴일이 파악되지 않더군요.

그래서 대체 휴일까지도 확인을 하기 위해서는 어쩔 수 없이 아래 주소의 한국거래소 페이지에서 데이터를 읽어 와야 할 필요가 있었습니다.

https://open.krx.co.kr/contents/MKD/01/0110/01100305/MKD01100305.jsp

Python 에서 HTML 페이지는 requests, urllib, selenium 등의 모듈을 사용하여 읽어 올 수 있습니다.

또한 table 태그의 경우에는 pandas 의 read_html() 함수를 사용해서도 굉장히 쉽게 읽어 올 수가 있습니다.

저 역시도 처음에는 위 한국거래소 페이지에 대하여 pandas 의 read_html() 함수를 사용하여 읽어 오도록 시도를 해 보았습니다. 그런데 정상적으로 읽어오지를 못 하더군요.

이럴 때는 브라우저의 개발자 도구를 사용하여 브라우저와 서버 통신간에 어떤 데이터를 주고 받게 되는지를 확인할 필요가 있습니다. 그리고 내가 원하는 정보가 언제 수신을 하게 되는지를 확인해서 해당 방법으로 데이터를 읽어와야 합시다. 크롬 브라우저 네트워크 분석 방법에 대해서는 아래 유튜브 동영상을 참고하시면 될 것 같습니다.

https://www.youtube.com/watch?v=-eVe2Dzj6lI

결론적으로 위에서 소개한 한국거래소 휴장일 페이지는 비동기 방식으로 휴장일 데이터를 가져오게 되는 것이었고~

크롬 브라우저 네트워크 분석

Header 를 확인해 보니 post 방식으로 동작 한다는 것을 알 수 있었습니다~

Request URL : https://open.krx.co.kr/contents/OPN/99/OPN99000001.jspx

Request Method: POST

Header post 방식, Encoding 정보

다음으로 해당 페이지에서 조금 밑에 내려보면 아래와 같이 어떤 데이터를 써 줘야 하는지도 확인할 수가 있습니다.

추가해줄 data 내용

이제 네트워크 분석은 끝났으므로 해당 내용에 맞춰서 코딩만 진행하면 될 것입니다.

제가 작성한 코드는 아래와 같습니다.

 

import requests
import datetime
import pickle


url = "https://open.krx.co.kr/contents/OPN/99/OPN99000001.jspx"
year = datetime.date.today().year			# 휴장일 검색 연도
data = {"search_bas_yy": year,"gridTp": "KRX", "pagePath": "/contents/MKD/01/0110/01100305/MKD01100305.jsp",
"code": 'VwN0qWxNxoQd3GptLiFi7VpQSV4Ewa+d2Su7DXPyhf9QzGrcwc/rwEcTS38k4e2df5Yx0Mfnbi2PWDHmer4lQzKMoOk5t9O8/DabZgelyz9UBc82a6GP7G4MABRDdIaJ7T+v79W6ON5hsRRGRUrUj69+eqY/BlbgIhBGzjGwqsT+CtNJN0ckkY/7efqYEaL7',
'pageFirstCall': 'Y'}
content_type = 'application/x-www-form-urlencoded; charset=UTF-8'
response = requests.post(url=url, data=data, headers={'Content-Type': content_type})   
resultJson = response.json()
# print(response.json())
holidays = [x['calnd_dd_dy'] for x in resultJson['block1']]

print(f'휴장일 수 : {len(holidays)}, 날짜 : {holidays}')

with open('marketHoliday.pickle', 'wb') as f:
	pickle.dump(holidays, f) #입력

marketHoliday.pickle 파일에 holidays 라는 변수명으로 저장하도록 구성을 했습니다.

2021 년도 휴장일은 위 결과와 같이 13일이 나오는 것을 확인할 수 있었습니다. 다른 해에 대해 확인하고 싶은 경우에는 year 변수의 값을 변경하고 실행하면 될 것입니다~

2022 년에는 며칠의 휴장 일이 있을지 궁금해서 year = 2022 로 변경 후에 실행을 해보니 아래와 같이 12 일이 나오는 것을 확인할 수 있습니다.

반응형

댓글