한국 거래소의 규정/제도에선 매매거래시간 및 휴장일을 안내하고 있다.
휴장일
- 「관공서의 공휴일에 관한 규정」에 따른 공휴일
- 「근로자의 날 제정에 관한 법률」에 따른 근로자의 날
- 토요일
- 12월 31일(공휴일 또는 토요일인 경우에는 직전의 매매거래일로 한다)
- 그 밖에 경제사정의 급격한 변동 또는 급격한 변동이 예상되거나 거래소가 시장관리상 필요하다고 인정하는 날
import requests
import pandas as pd
from bs4 import BeautifulSoup
매매거래시간 이외의 시간 및 휴장일에선 거래가 발생하지 않으므로 이 시간대에선 프로그램을 계속 켜놓을 이유가 없다. 따라서 해당 시간대에선 프로그램을 바로 종료할 수 있도록 코드를 작성할 것이다.
휴장일 제외하기 -1
한국 거래소의 휴장일은 국가지정 공휴일, 토요일과 일요일, 근로자의 날 및 연말휴장일, 크게 3가지로 구분지을 수 있다. 공공데이터 openAPI의 특일 정보를 제공해주는 API를 사용하면 공휴일을 휴장일로 구분지을 수 있다.
공공데이터 포털에 로그인 후 해당 API를 신청해 일반 인증키를 제공받고 공휴일 정보 조회를 신청하면 된다. solYear(필수)와 solMonth(선택), serviceKey(필수)로 연결한 url에 접속하여 정보를 조회하면 기본적으로 xml 파일 형식으로 제공되며, _type 요소를 json으로 신청하면 json 파일로도 정보를 받아 파싱할 수 있다.
def koreaHoliday():
# 공공데이터 공휴일 정보 OpenAPI 이용을 위한 url, key값 설정
operation = "getRestDeInfo"
year = 2021
mykey = "일반 인증키"
url = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService"
# locDate : 공휴일 정보, dateName : 공휴일 이름
locDate = []
dateName = []
# 1월 ~ 12월
for i in range(1, 13):
if i >= 10:
month = str(i)
elif i < 10:
month = "0" + str(i)
# url 접속 후 데이터 받아오기
request_url = url + "/" + operation + "?solYear=" + str(year) + "&solMonth=" + month + "&serviceKey=" + mykey
resp = requests.get(request_url)
if resp.ok:
soup = BeautifulSoup(resp.text, 'html.parser')
item = soup.find_all('item')
for i in item:
date = i.find("locdate").get_text()
locDate.append(date[:4] + "-" + date[4:6] + "-" + date[6:])
dateName.append(i.find("datename").get_text())
locDate.append("2021-05-01")
dateName.append("근로자의 날")
locDate.append("2021-12-31")
dateName.append("연말휴장일")
return locDate, dateName
일반 인증키 자리에 본인이 발급받은 API 인증키를 작성해주면 된다. 공휴일 데이터에는 "근로자의 날"과 "연말휴장일" 데이터는 따로 존재하지 않으므로 마지막에 추가해준다.
휴장일 제외하기 -2
위처럼 공공데이터의 API를 사용해 공휴일을 구분해줄 수 있지만 한국거래소에서는 공식적으로 휴장일 데이터를 제공해주고 있어 더욱 쉽게 휴장일을 구분해줄 수 있다.
위 링크에 접속해서 한국거래소 2021년 휴장일을 검색한 후 나온 데이터를 다운로드 하면 다음과 같은 엑셀 파일의 데이터가 다운로드된다.
공휴일이 토요일 및 일요일인 경우에는 따로 드러나있지 않으며, (2021.05.01 근로자의 날도 토요일이라 엑셀 파일에 따로 적혀있지 않다.) 연말 휴장일도 엑셀 파일에 포함되어 있는 것을 확인할 수 있다. 우리는 그저 이 파일을 파이썬으로 불러와 리스트 형태로 저장해주기만 하면 된다.
먼저 데이터를 사용하고자 하는 폴더 안에 엑셀 파일을 "2021_holiday"로 저장해주었다. (파일 형식은 xls) pandas의 read_excel 함수를 이용해서 파일을 불러오면 holiday_data에는 DataFrame 형태로 데이터가 저장되며, to_list() 메서드를 이용해 데이터를 리스트화 하였다.
def krx_holiday_data():
holiday_data = pd.read_excel("2021_holiday.xls")
locDate = holiday_data["일자 및 요일"].to_list()
dateName = holiday_data["비고"].to_list()
return locDate, dateName
공휴일이 토요일 및 일요일인 경우를 제외하면 앞서 공공데이터 특일 정보 API를 사용했던 것과 동일한 결과를 얻을 수 있다.
위 두 함수를 "korea_holiday.py" 라는 파이썬 파일에 담아 main 함수에 import해주었다.
import requests
import pandas as pd
from bs4 import BeautifulSoup
def koreaHoliday():
# 공공데이터 공휴일 정보 OpenAPI 이용을 위한 url, key값 설정
operation = "getRestDeInfo"
year = 2021
mykey = "CtSMsSzzUb6STRMoDp9D751nLaY54bG2a5vTRIo3CWwAiRRovKvhhdBikpnmXsYpopW%2FbjmsyhAjeAbqOBJXEw%3D%3D"
url = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService"
# locDate : 공휴일 정보, dateName : 공휴일 이름
locDate = []
dateName = []
# 1월 ~ 12월
for i in range(1, 13):
if i >= 10:
month = str(i)
elif i < 10:
month = "0" + str(i)
# url 접속 후 데이터 받아오기
request_url = url + "/" + operation + "?solYear=" + str(year) + "&solMonth=" + month + "&serviceKey=" + mykey
resp = requests.get(request_url)
if resp.ok:
soup = BeautifulSoup(resp.text, 'html.parser')
item = soup.find_all('item')
for i in item:
date = i.find("locdate").get_text()
locDate.append(date[:4] + "-" + date[4:6] + "-" + date[6:])
dateName.append(i.find("datename").get_text())
locDate.append("2021-05-01")
dateName.append("근로자의 날")
locDate.append("2021-12-31")
dateName.append("연말휴장일")
return locDate, dateName
def krx_holiday_data():
holiday_data = pd.read_excel("2021_holiday.xls")
locDate = holiday_data["일자 및 요일"].to_list()
dateName = holiday_data["비고"].to_list()
return locDate, dateName
'기타 > Slack Trading Bot (준영)' 카테고리의 다른 글
Slack으로 주식 현재가 알림 봇 만들기 - 최종 코드 (0) | 2021.03.09 |
---|---|
Slack으로 주식 현재가 알림 봇 만들기 - EC2를 이용한 크롤러 자동화 (0) | 2021.03.05 |
Slack으로 주식 현재가 알림 봇 만들기 - Slack 봇 만들기 (0) | 2021.03.04 |
Slack으로 주식 현재가 알림 봇 만들기 - 주식 현재가 가져오기 (0) | 2021.02.24 |
최근댓글