퀀트투자 백테스트 - 파이썬 코드로 특정기간 영업일만 가져오기
본문 바로가기
파이썬(Python)/퀀트투자

퀀트투자 백테스트 - 파이썬 코드로 특정기간 영업일만 가져오기

by 만초손겸수익 2021. 11. 13.

본 포스트는 퀀트투자를 위한 개인적인 백테스트 기록이며, 테스트 과정이 올바르게 진행되었다는 어떠한 증명도 할 수 없음을 알려드립니다. 본 포스트를 참고하셔서 투자를 하는 행위는 삼가하여 주시기 바랍니다.

백테스트를 하기 위해서는 테스트 기간동안의 영업일만 가져와야 한다.

 

구글에서 검색해 보면 다양한 방법이 많이 나온다. 하지만, 잘 안된다. 

 

나는 pykrx를 이용해서 영업일을 가져왔다. 아주 잘 된다. 영업일을 가져오기 위해 2가지 방법을 찾았다.

 

첫번째는 datetime 라이브러리를 이용하는 방법이고, 다른 방법은 pandas의 date_range를 이용하는 방법이다.

 

우선 datetime 라이브러를 이용하는 방법부터 살펴보겠다.

 

1
2
3
4
5
6
7
8
9
from datetime import datetime, timedelta
from pykrx import stock
 
def date_range(start, end):
    start = datetime.strptime(start, '%Y%m%d')
    end = datetime.strptime(end, '%Y%m%d')
    dates = [(start + timedelta(days=i)).strftime('%Y%m%d'for i in range((end-start).days+1)]
    dates = [stock.get_nearest_business_day_in_a_week(d) for d in dates]
    return dates
cs

 

테스트기간의 시작과 끝을 정해서 영업일만 뽑아내는 함수다.

 

구글링을 하다보니 list comprehension을 아주 잘 사용한 예제가 있어서 활용해 보았다.

 

원래 내가 하는 스타일대로 코딩을 한다면, 5줄 이상 길어졌을텐데 세상에 똑똑한 사람이 많아서 그 어깨를 잠시 빌렸더니 아주 간결하게 코드가 완성되었다.

 

datetime.strptime 함수를 사용해서 시작일과 마지막일을 변수에 저장한다.

 

그리고 For 문을 활용해서 투자기간(끝나는 일 - 시작일) 동안 반복해서 매일 1일씩 더한 List를 뽑아낸다.

 

이 Date List 중 영업일만 구해야하 하기 때문에 stock.get_nearest_business_day_in_a_week(d) 함수를 사용해서 또 다시 영업일로만 구성된 Date List를 만든다.

 

아주 간단하지만, 나는 머리가 나빠서 아주 많이 고민했다.

 

 

작동이 잘 된다.

 

이제 다음 방법인 pandas 라이브러리를 이용해서 영업일만 리스트로 뽑아내는 방법을 알아보겠다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from datetime import datetime, timedelta
from pykrx import stock
import pandas as pd
 
 
def date_range(start, end):
    start = datetime.strptime(start, '%Y%m%d')
    end = datetime.strptime(end, '%Y%m%d')
    dates = [d.strftime('%Y%m%d'for d in pd.date_range(start, periods=(end-start).days + 1)]
    dates = [stock.get_nearest_business_day_in_a_week(d) for d in dates]
    inv_dates = []
    for d in dates:
        if d not in inv_dates and (datetime.strptime(d, '%Y%m%d')-start).days >=0:
            inv_dates.append(d)
    return inv_dates
 
print(date_range('20210101''20210131'))
cs

 

방법은 첫 번째 방법과 유사하다. 단지, pandas의 date_range 함수를 사용했다.

 

특정기간 동안 뽑은 날짜들을 다시 stock.get_nearest_business_day_in_a_week(d) 을 사용해서 영업일만 리스트로 뽑았다.

 

그런데 위의 코드에서 약간의 문제가 발생했다. 

 

연휴가 생겨서 근처의 영업일을 지정하다보니 중복된 날짜가 발생했다.

 

그래서 중복된 날짜를 없애주는 코드를 추가했다. 그리고 지정된 날짜의 영업일이 시작일 보다 더 앞에 있는 경우가 발생해서 이것 또한 시작일 이후부터 날짜 리스트를 만들도록 했다.

 

 작동이 잘 된다.

 

사실 어렵지 않은 방법이지만, 막상 내가 하려면 아이디어가 잘 떠오르지 않는다. 

 

이렇게 기록으로 남기면, 나중에 코딩을 하면서 다른사람 뿐만 아니라 나에게도 많은 도움이 되는 것 같다.

 

728x90
반응형

댓글