(07.20) 수정됨.
주식시장 개장일과 휴장일 정보
주식시장 개장일과 휴장일 정보는 별 쓸모가 없어보이지면서, 은근히 중요한 데이터 중 하나다.
api를 통해 과거 주식 시세 정보를 요청하기 위해서는 요청하는 날짜가 거래가 있었던 개장일인지, 거래가 없었떤 휴장일인지 알아야 하기 때문이다.
아이러니하게도 이런 정보는 따로 제공되는 것이 아니기 때문에 은근히 구하기 어렵다.
인터넷을 돌아다니면 개장일이나 휴장일 정보를 쉽게 구할 수 있긴 한데, 이런 정보들을 신뢰하고 사용하긴 어렵다.
국가기념일(빨간날)이 매년 다르고, 어떤 해에는 공휴일이었던 날이 어떤 해에는 공휴일이 아니기도 하기 때문이다.
대부분 실측 데이터가 아닌 추상적으로 만들어낸 데이터를 모은 경우가 많았다.
여기에 임시공휴일 정보까지 생각한다면 휴장일 정보를 추상적으로 만들어낸 경우에는 실제로 사용하기 매우 껄끄러울 수 밖에 없다.
간단하게 생각하자
황당하게도 주식 개장일 정보는 증권계좌 1개만 있다면 아주 손쉽게 손에 넣을 수 있다.
증권사 HTS를 실행한 다음, "KOSPI(코스피, 유가증권)" 지수 차트를 조회하면 되기 때문이다.
코스피 차트를 조회한 다음, 차트 데이터를 엑셀로 추출하면 다음과 같이 날짜와 지수가 정리된 데이터를 손에 넣을 수 있다.
다올 투자증권에서 얻은 코스피 지수 데이터는 1985년 1월 4일부터 시작된다.
개장일 정보 추출하기
실제 거래 자료를 얻었다면 그 다음은 매우 쉽다.
파이썬으로 파일을 읽고, 날짜 부분만 뽑아 정리하면 되기 때문이다.
이렇게 추출한 데이터는 나중에 필요할 수 잇으니 깃헙에 올려두기로 한다.
from datetime import datetime
import json
path_file = input('코스피 데이터 파일 경로 : ')
with open(path_file, 'r', encoding='ansi') as txt:
l = txt.readlines()
print(l[:3])
>> ['일자\t시가\t고가\t저가\t종가\t5\t10\t20\t60\t거래량\n', '2025-07-18\t"3,200.44"\t"3,204.75"\t"3,169.69"\t"3,188.07"\t"3,196.81"\t"3,165.12"\t"3,121.00"\t"2,834.03"\t"393,449"\n', '2025-07-17\t"3,201.42"\t"3,201.42"\t"3,152.42"\t"3,192.29"\t"3,194.35"\t"3,151.74"\t"3,112.69"\t"2,822.28"\t"424,788"\n']
print(l[-3:])
>> ['1985-01-07\t145.51\t145.51\t145.51\t145.51\t0\t0\t0\t0\t"47,277"\n', '1985-01-05\t141.79\t141.79\t141.79\t141.79\t0\t0\t0\t0\t"16,992"\n', '1985-01-04\t139.53\t139.53\t139.53\t139.53\t0\t0\t0\t0\t"7,411"\n']
date_list = [datetime.strptime(i.split(maxsplit=1)[0], '%Y-%m-%d') for i in l[1:]]
print(len(date_list))
>> 10647
print(date_list[0])
>> datetime.date(2025, 7, 18)
print(date_list[-1])
>> datetime.date(1985, 1, 4)
path_json = input('개장일 json 파일 경로 : ')
with open(path_json, 'w', encoding='utf-8') as txt:
json.dump([i.strftime('%Y-%m-%d') for i in date_list], txt, indent=' ')
개별 종목을 사용하지 않은 이유
(개장일) = (거래가 이루어진 날)이라는 것을 기반으로 했기 때문에 개장일 정보를 가져오는 데 코스피 지수 데이터를 사용했다.
다르게 생각하면 삼성전자나 LG전자, 국민은행이나 신한은행같이 오랜 기간 상장되어있던 주식의 시세 정보를 가지고도 이런 데이터를 추출할 수 있을 것이라는 생각을 할 수 있게 된다.
개별 종목의 경우 거래정지가 있을 수 있다. 회사 합병, 액면 병합, 그 외 다양한 사유들로 인해 거래정지가 이루어진 경우 그 기간동안 거래는 이루어지지 않는다.
거래가 이루어지지 않은 날이어도 데이터가 존재한다면 문제가 없겠지만, 데이터가 반드시 존재할 것이라는 확신은 없다.
반면, 주가 지수의 경우 개별 종목 몇몇개가 거래정지가 된다 하더라도 다른 종목들이 거래되기 때문에 영향을 받지 않는다.
이런 이유로 인해 개별 종목이 아닌 주가 지수의 데이터를 사용한다.
크롤링으로 해결하기
개장일 정보가 필요할 때마다 증권사 HTS를 실행하고, 차트를 조회하고, 엑셀로 변환하고, 거기서 필요한 데이터만 추출하고...
매번 그러기엔 너무 번거롭다.
주식 시세 정보를 크롤링하는 파이썬 패키지를 사용하여 이런 번거로움을 덜 수 있는데, 야후 파이낸스의 데이터를 가져오는 yfinance 모듈을 사용해 이를 해결할 수 있다.
코드를 다음과 같은 결과를 얻을 수 있다. 코드는 깃헙에서 확인 가능하다.
date_list = get_trading_day()
print(f'{date_list[0]=}')
print(f'{date_list[-1]=}')
print(f'{len(date_list)=:,}')
>> date_list[0]=datetime.date(1996, 12, 11)
date_list[-1]=datetime.date(2025, 7, 18)
len(date_list)=7,043
githup
https://github.com/white-seolpyo/trading-day/
회색지대인 크롤링
크롤링 자체는 법적인 문제가 없지만, 크롤링하는 행위에 대해서는 불법과 합법 사이의 애매한 위치를 가지고 있다.
이에 대해 관심이 있다면 이 글을 한 번 읽어보자.