본 포스트는 퀀트투자를 위한 개인적인 백테스트 기록이며, 테스트 과정이 올바르게 진행되었다는 어떠한 증명도 할 수 없음을 알려드립니다. 본 포스트를 참고하셔서 투자를 하는 행위는 삼가하여 주시기 바랍니다.
백테스트를 하기 위해서는 테스트 기간동안의 영업일만 가져와야 한다.
구글에서 검색해 보면 다양한 방법이 많이 나온다. 하지만, 잘 안된다.
나는 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) 을 사용해서 영업일만 리스트로 뽑았다.
그런데 위의 코드에서 약간의 문제가 발생했다.
연휴가 생겨서 근처의 영업일을 지정하다보니 중복된 날짜가 발생했다.
그래서 중복된 날짜를 없애주는 코드를 추가했다. 그리고 지정된 날짜의 영업일이 시작일 보다 더 앞에 있는 경우가 발생해서 이것 또한 시작일 이후부터 날짜 리스트를 만들도록 했다.
작동이 잘 된다.
사실 어렵지 않은 방법이지만, 막상 내가 하려면 아이디어가 잘 떠오르지 않는다.
이렇게 기록으로 남기면, 나중에 코딩을 하면서 다른사람 뿐만 아니라 나에게도 많은 도움이 되는 것 같다.
'파이썬(Python) > 퀀트투자' 카테고리의 다른 글
퀀트투자 백테스트 - 내가 찾은 전략 (6) | 2021.11.17 |
---|---|
퀀트투자 백테스트 - PER X PBR 콤보 전략 (0) | 2021.11.15 |
퀀트투자 백테스트 - 저 PER 20종목 (All Market, 거래량 0이상) (0) | 2021.11.11 |
퀀트투자 백테스트 - 매수종목 20 (21.11.05~21.11.08) (4) | 2021.11.09 |
퀀트투자 백테스트 - 현실적인 백테스트 방법 - 2 (0) | 2021.11.05 |
댓글