코드로 우주평화
파이썬으로 해외 증권거래소 개장일/휴장일 확인하는 방법 본문
덴마크 증권거래소는 몇 시에 열릴까?
국내 증권거래소의 정보는 손쉽게 구할 수 있다. 특히 개장일/휴장일의 경우 우리가 보는 달력만으로도 알 수 있다.
하지만 해외 증권거래소는 파악이 어렵다. 각 국가별로 공휴일이 다를 수 있고 시간도 상이하다. 특히 지역 시간대로 인해 정확한 시간을 파악하는 것이 더 어렵다.
덴마크 증권거래소를 예로 들어보겠다. 덴마크 장시작 시간이 몇 시인지 알고 있는가?
정답은 한국 시간으로 16시에 열린다.(이는 서머타임 시간이며 겨울에는 17시에 열린다.) 이미 본인에게 익숙한 시장이라면 어느 정도 파악해두고 있겠지만 그럼에도 각 국가별로 정확한 개장일과 개장시간을 파악하고 있는 것은 여간 성가신일이 아니다.
이러한 문제를 Python 라이브러리 exchange_calendars를 사용하면 쉽게 해결할 수 있다. 이 글에서는 exchange_calendars을 이용해 8월 뉴욕 증권거래소의 개장일과 장시작, 장마감 시간까지 구해보겠다.
사용법
1. 설치
pip install exchange_calendars
2. import
import exchange_calendars as market
라이브러리 이름이 길어 'market'이라는 임의의 단어로 사용하겠다.
3. 증권거래소 calendar 가져오기
new_york = market.get_calendar("XNYS")
'XNYS'는 뉴욕 증권거래소를 의미한다. 이를 가져와 'new_york'이라는 변수에 담았다.
4. 지정한 범위 내, 개장일 가져오기
open_days = new_york.sessions_in_range(start="2022-08-01", end="2022-08-31")
exchange_calendars 라이브러리가 제공하는 'sessions_in_range()' 메서드를 사용하여 8월 중 개장일 'open_days'라는 변수에 담았다.
print(open_days)
>>> DatetimeIndex(['2022-08-01', '2022-08-02', '2022-08-03', '2022-08-04',
'2022-08-05', '2022-08-08', '2022-08-09', '2022-08-10',
'2022-08-11', '2022-08-12', '2022-08-15', '2022-08-16',
'2022-08-17', '2022-08-18', '2022-08-19', '2022-08-22',
'2022-08-23', '2022-08-24', '2022-08-25', '2022-08-26',
'2022-08-29', '2022-08-30', '2022-08-31'],
dtype='datetime64[ns]', freq='C')
'open_days' 변수를 출력해보면 위에 처럼 8월 동안의 개장일을 배열 형태로 보여준다.
5. 날짜별 장시작, 장마감 시간을 구한다.
for day in open_days:
open = new_york.session_open(day)
close = new_york.session_close(day)
print(open, close)
'session_open()', 'session_close()' 메서드를 이용해 날짜별 장시작, 장마감 시간을 구할 수 있다. 이를 'open', 'close'라는 변수에 담고 print로 출력하면 아래와 같은 결과물을 얻을 수 있다.
2022-08-01 13:30:00+00:00 2022-08-01 20:00:00+00:00
2022-08-02 13:30:00+00:00 2022-08-02 20:00:00+00:00
2022-08-03 13:30:00+00:00 2022-08-03 20:00:00+00:00
2022-08-04 13:30:00+00:00 2022-08-04 20:00:00+00:00
2022-08-05 13:30:00+00:00 2022-08-05 20:00:00+00:00
2022-08-08 13:30:00+00:00 2022-08-08 20:00:00+00:00
2022-08-09 13:30:00+00:00 2022-08-09 20:00:00+00:00
2022-08-10 13:30:00+00:00 2022-08-10 20:00:00+00:00
2022-08-11 13:30:00+00:00 2022-08-11 20:00:00+00:00
2022-08-12 13:30:00+00:00 2022-08-12 20:00:00+00:00
2022-08-15 13:30:00+00:00 2022-08-15 20:00:00+00:00
2022-08-16 13:30:00+00:00 2022-08-16 20:00:00+00:00
2022-08-17 13:30:00+00:00 2022-08-17 20:00:00+00:00
2022-08-18 13:30:00+00:00 2022-08-18 20:00:00+00:00
2022-08-19 13:30:00+00:00 2022-08-19 20:00:00+00:00
2022-08-22 13:30:00+00:00 2022-08-22 20:00:00+00:00
2022-08-23 13:30:00+00:00 2022-08-23 20:00:00+00:00
2022-08-24 13:30:00+00:00 2022-08-24 20:00:00+00:00
2022-08-25 13:30:00+00:00 2022-08-25 20:00:00+00:00
2022-08-26 13:30:00+00:00 2022-08-26 20:00:00+00:00
2022-08-29 13:30:00+00:00 2022-08-29 20:00:00+00:00
2022-08-30 13:30:00+00:00 2022-08-30 20:00:00+00:00
2022-08-31 13:30:00+00:00 2022-08-31 20:00:00+00:00
출력 결과를 보면 뉴욕 증권거래소는 13:30분에 열리고 20시에 닫히는 것을 확인할 수 있다.
?? 오후 1시 30분에 시장이 열린다고?
실제 뉴욕 증권거래소는 09:30에 열리지만 결과물은 13:30분으로 출력된다. 이것이 앞서 언급한 timezone(시간대) 문제이다.
exchange_calendars 라이브러리는 기본적으로 UTC 시간을 기준으로 한다. 뉴욕 시간은 UTC - 04:00 이므로 09:30 + 04:00 인 13:30으로 출력된 것이다.
즉 결과물에는 이상이 없다. UTC 시간대가 틀린 게 아니니까. 하지만 우리가 이해하기 쉽도록 UTC시간대를 현지 시간인 뉴욕 시간대로 바꿔줄 필요가 있다.
6. timezone 적용하기
for day in open_days:
open = new_york.session_open(day).tz_convert("America/New_York")
close = new_york.session_close(day).tz_convert("America/New_York")
print(f"개장일: {day.date()}, 장시작: {open.time()}, 장마감: {close.time()}")
뉴욕 시간대를 적용하기 위해 이전의 코드에서 .tz_convert() 메서드를 추가했다. 메서드 안에는 뉴욕 시간대를 의미하는 "America/New_York" 문자열을 넣어주었다.
그리고 마지막 줄에는 f-string을 이용해 개장일, 장시작, 장마감 시간을 출력하도록 print를 작성했다.
이제, 결과를 보자!
개장일: 2022-08-01, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-02, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-03, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-04, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-05, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-08, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-09, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-10, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-11, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-12, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-15, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-16, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-17, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-18, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-19, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-22, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-23, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-24, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-25, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-26, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-29, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-30, 장시작: 09:30:00, 장마감: 16:00:00
개장일: 2022-08-31, 장시작: 09:30:00, 장마감: 16:00:00
우리가 원하는 데이터를 얻었다!
마무리
이 글은 사용법을 쉽게 보여주기 위해 print로 결과를 보여주었다. 물론 이것만으로도 인터넷 검색보다는 더 유용히 사용할 수 있겠지만, exchange_calendars를 실제 시스템 트레이딩에도 적용할 수 있을 것이다. 개장시간에 맞춰 거래가 발생하도록 알고리즘을 구현하거나 혹은 과거 데이터를 분석하는 퀀트 등에도 사용할 수도 있다.
exchange_calendars가 제공하는 증권거래소는 미국, 유럽, 아시아를 넘어 50여 개가 넘는다. 그동안 인터넷을 검색하는데 지쳤다면 이번 기회에 사용해보는 것을 추천한다. exchange_calendars에 대해 더 자세히 알고 싶다면 아래 공식문서를 참고하기 바란다.
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
Pydantic 의 Datetime 타입으로 날짜와 시간을 다뤄보자 (0) | 2023.08.21 |
---|---|
requests _ response 상태에 따라 raise를 할 수 있다? (0) | 2022.10.18 |
Tenacity _ 예외가 발생한 함수를 다시 실행하려면? (0) | 2022.08.27 |
Click _ argument, option으로 인자 전달하기 (0) | 2022.08.21 |
Black _ Code Formatter 회피하는 방법 (0) | 2022.08.19 |