파이썬 퀀트투자 쉽게하기 - 9. 영업일만 가져와서 List로 만들기(주식거래일 구하기)
본문 바로가기
파이썬으로 만든 것들/퀀트투자

파이썬 퀀트투자 쉽게하기 - 9. 영업일만 가져와서 List로 만들기(주식거래일 구하기)

by Squat Lee 2021. 12. 22.


이번에는 백테스트 할 날짜를 구하는 코드를 만들어 보겠습니다.

백테스트 방법은 2003년 부터 2021년까지 특정월 특정일에 투자하고 1년이 지난 후 매도 후 다시 매수하는 것입니다.

18년 기간동안 일일이 달력을 찾아보며 증권거래일(휴일이 아닌 날짜)을 지정하는 방법도 있습니다. 하지만, 백테스트의 목적은 가장 수익이 많이 나는 날짜와 방법을 사용하는 것이기에 여러 조건들을 계속에서 변경할 필요가 있습니다.

수기로 날짜와 조건을 바꾸면 상당한 시간과 노력이 들기에 자동으로 변하게 할 필요가 있습니다.

이때 사용하는 개념이 "변수"입니다.

= 10
= 4

우선 달을 지정할 변수를 'm'으로 지정하고, 숫자 10을 넣어줍니다. 날짜는 'd'라는 변수에 4를 지정합니다.

이제 2003년부터 2021년까지 매년 10월 4일에 투자를 한다고 가정하고, 날짜를 리스트로 만듭니다. 만약 올해 10월 4일이 휴일이 아니더라도 다른해에는 휴일이 될 수 있습니다. 휴일이면 10월 3일, 그 날도 휴일이면 10월 2일 이런식으로 워킹데이만 리스트로 만들도록 하겠습니다.

date_list = []

날짜 List를 담을 변수를 'date_list'라고 만듭니다. '[]' 표시한 이유는 빈 리스트를 만든다는 의미입니다.

for y in range(20032021):
    day = str(y) + str(m) + str(d)
    b_day = stock.get_nearest_business_day_in_a_week(date=day) #휴일이면 근처의 영업일로 변경
    date_list.append(b_day)

2003년부터 2021년까지 자동으로 년도를 생성하기 위해 'for' 문을 사용합니다.

'day'라는 변수를 만들어서 연도(str(y))와 월(str(m)) 그리고 일(str(d))을 합쳐서 날짜를 만듭니다.

'str'은 문자형으로 만들어주는 함수입니다. 예를들어 1은 숫자형입니다. 이것을 문자형으로 만들어 주기 위해 str(1)을 사용하면 문자로 인식합니다.

날짜는 '20211215' 이런식으로 문자형으로 만들어야지 krx에서 해당 날짜의 데이터를 불러올 수 있습니다.

b_day = stock.get_nearest_business_day_in_a_week(date=day)

pykrx라이브러리의 'stock' 이라는 클래스(?)에서 'get_nearest_business_day_in_a_week'라는 함수를 사용하면, 지정한 날이 휴일일때 근처에 있는 영업일을 가져옵니다. 여기서 파라미터는 날짜를 넣어 주면 됩니다.(date=day)

함수는 특정한 인자(파라미터)를 넣으면 결과값이 나오는 구조입니다.

예를들어 고등학교 때 배운 'f(x) = x + 1' 이라는 함수에서 x는 파라미터이고, 결과값은 f(x)가 되는 것입니다.

"stock.get_nearest_business_day_in_a_week(date=day)" 함수로 나온 결과값은 "b_day"라는 변수에 저장합니다.

저 설명 너무 잘하지 않나요? 독학으로 배웠는데 제가 생각해도 설명을 정말 잘하는 것 같아요. ㅎㅎㅎ

'get_nearest_business_day_in_a_week'라는 함수에서 결과값 즉 영업일을 하나씩 산출하면 이것을 아까만든 리스트에 넣어 줄 필요가 있습니다.

이때 "date_list.append(b_day)"라고 적어주면 산출해 낸 결과값이 차례로 리스트에 저장하게 됩니다.

print(date_list)

print 함수를 써서 리스트의 결과를 보겠습니다.

전체 코드는 아래와 같으며, 'Shift' + 'Alt' + 'F10' 을 눌러서 결과를 확인해 보겠습니다.

1
2
3
4
5
6
7
8
9
10
= 10
= 4
 
date_list = []
for y in range(20032021):
    day = str(y) + str(m) + str(d)
    b_day = stock.get_nearest_business_day_in_a_week(date=day) #휴일이면 근처의 영업일로 변경
    date_list.append(b_day)
 
print(date_list)
cs

결과값이 제대로 잘 나오네요.

여기까지 잘 따라 오시나요? 혹시 이해가 잘 안되는 부분이 있으면 구글에 검색을 해 보세요. 하나씩 배우면서 하면 금방 늘어요.

이제 백테스트를 할 날짜를 전부 구했으니 이걸 함수로 만들어 보겠습니다.

함수를 만들때는 'def 함수이름(파라미터):' 이런 형식으로 만들어 주면 되겠습니다.

1
2
3
4
5
6
7
def make_date_list(m, d):
    date_list = []
    for y in range(20032021):
        day = str(y) + str(m) + str(d)
        b_day = stock.get_nearest_business_day_in_a_week(date=day) #휴일이면 근처의 영업일로 변경
        date_list.append(b_day)
    return date_list
cs

위의 코드와 같이 작성해 보시면 됩니다.

함수 이름을 'make_date_list'로 만들었고, 파라미터는 'm', 'd'를 사용했습니다.

주위할 점은 함수 아래의 코드는 들여쓰기를 해야합니다. Tab키를 눌러도 되고, 스페이스바를 4칸 이동해도 됩니다.

더 쉬운 방법은 처음에 만든 코드를 마우스 드레그를 통해 다 선택하고 탭키를 누르면 됩니다.

결과값을 지정해야 하는데 이것은 'return'이라고 사용하면 됩니다. 결과값은 'date_list'를 반환하도록 만들었습니다.

1
print(make_date_list(10,4))
cs


프린트 함수를 통해 결과값이 제대로 나오는지 확인합니다. 파라미터는 10월 4일을 지정했습니다.

728x90
반응형

댓글