규도자 개발 블로그

파이썬(Python)으로 다음 옵션만기일 구하기 본문

Finance/With Python

파이썬(Python)으로 다음 옵션만기일 구하기

규도자 (gyudoza) 2021. 3. 2. 19:06

파이썬(Python)으로 다음 옵션만기일 구하기

요즘 금융권에 있는 친구와 프로젝트로 퀀트 프로그램을 하나 만들고 있다. 이래저래 처음 만들어보는 데다가 증권사에서 제공하는 API 방식이 익숙치 않아(COM형이니 DLL이니) 난항을 겪고 있는 와중에 주식선물상품과 연계해서 거래하는 상품을 만드는 도중 선물 코드에 규칙성이 있다는 걸 알게 됐다.

 

예를 들어 3월 만기인 삼성전자의 주식선물코드는 111R3000인데 사실 삼성전자를 나타내는 건 앞의 111이 전부이고 뒤에 R3은 만기날짜, 그리고 000은 의미 없는 숫자이다. R은 년도를 의미하고, 3은 3월을 의미한다.

 엥 그럼 10월 11월은 어떻게 한자리에 집어넣지? 3의 자리에 들어갈 것은 16진수(10->a, 11->b, 12->c)이다. 그러니까 이번년도 삼성전자의 10월물은 111RA3000이 되는 것이다.

 엥 그럼 2021년은 R이니까 2022년은 S인가? 맞다. 근데 이런식으로 접근하면 큰일난다. 년도는 규칙이 없기 때문이다. 현재까지 정해진 옵션만기일 년도 코드는 다음과 같다.

 

근데 그렇다고 해서 2월엔 3월상품을 만기로 잡고, 3월엔 4월상품을 만기로 잡으면 큰일난다. 왜냐. 각 월의 옵션 만기일은 두번째 목요일이기 때문이다.

 

 그러니까 이번달을 기준으로 두번째 목요일이 지나지 않았으면 이번달 두번째주 목요일이 다음 옵션만기일이 되는 것이고, 지났으면 다음달 두번쨰주 목요일이 다음 옵션만기일이 되는 것이다. 사람이 인식하기에는 꽤나 간단하지만 컴퓨터가 이걸 알게 하려면 꽤나 고민이 필요하다. 그래서 코드로 정리했다.

import datetime

# option code
OPTION_EXPIRATION_YEAR_CODE = {
    2021: 'R',
    2022: 'S',
    2023: 'T',
    2024: 'V',
    2025: 'W',
    2026: 6,
    2027: 7,
    2028: 8,
    2029: 9,
    2030: 0,
    2031: 1,
    2032: 2,
    2033: 3,
    2034: 4,
    2035: 5
}


def get_next_month_stock_future_tail_code():
    next_option_expiration_date = get_next_option_expiration_date()
    expiration_year = next_option_expiration_date.year
    expiration_month = next_option_expiration_date.month
    return str(OPTION_EXPIRATION_YEAR_CODE[expiration_year]) + format(expiration_month, 'X') + '000'


def get_next_option_expiration_date():
    today = datetime.date.today()
    next_thursday = today + datetime.timedelta(((3 - today.weekday()) % 7))
    while True:
        if 8 <= next_thursday.day <= 14:
            next_option_expiration_date = next_thursday
            break
        else:
            next_date = next_thursday + datetime.timedelta(days=1)
            next_thursday = next_date + datetime.timedelta(((3 - next_date.weekday()) % 7))
    return next_option_expiration_date

print(get_next_option_expiration_date())식으로 실행하여 확인해보면 정확히 다음 옵션 만기일이 출력되는 걸 확인할 수 있다. 오늘이 아니라 다른날짜로도 실험해보고 싶으면 get_next_option_expiration_date()함수 밑 today의 오른쪽에 + datetime.timedelta(days=10)이런식으로 today를 바꿔가면서 실험해보면 될 것이다. 그럼 20000.

 아 그리고 새로 알게 된 사실인데 해당일이 한국의 공휴일이면 그 전날이 다음 옵션만기일이 된다고 한다. 이건 적용 안했다. 주의하도록 하자!

Comments