2.1 백테스팅하기 - 일자 계산 코드 구축하기 (1)
백테스팅을 진행하는 과정에 있어서는 많은 방법들이 존재하는데, 크게 요약하자면 아래의 두 가지 방법으로 분류할 수 있다. 그 중 본인은 두 번째 방법을 선호하는 편이다. 왜냐하면 이게 실제 시장에서 실제로 개인이 거래를 진행할 때와 가장 유사한 메커니즘으로 거래를 진행하는 방법이기 때문이다.
- 한 종목 한 종목씩 조건에 부합하는지 여부를 판단하고 시뮬레이션하기
- 하루 하루 종목을 선정하여 선정된 종목들만 시뮬레이션하기
[파일명 : boss] 일자 계산 코드 구축하기
위의 두 번째 방법으로 시뮬레이션을 진행하기 위해서는 반드시 날짜 코드를 계산해야 한다. 다시 말해, 2021년 1월 1일자를 기준으로 종목을 선정한 후에 1월 2일자를 기준으로 종목을 선정할 수 있도록 2021.1.1과 2021.1.2를 계산해주는 코드가 필요하다는 것이다.
아래와 같이 boss 파일 맨 밑에, class cal_function(): 이라는 클래스를 추가한 후에 각각 더한 날짜를 계산하는 함수와 뺀 날짜를 계산하는 함수인 def cal_addday() 와 def cal_subday() 를 작성해주자. 그리고 각각의 함수 내에서는 기준이 되는 날짜가 될 standard_day 와 얼만큼의 날짜를 계산할지를 나타낸 howmany 를 인자로 받아오도록 하자.
※ 일자를 계산하기 위해 필요한 라이브러리는 time이다.
import time
class tradesystem(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setupUi(self)
class cal_function():
def cal_addday(self, standard_day, howmany):
pass
def cal_subday(self, standard_day, howmany):
pass
이제 standard_day라는 인자로 받아온 일자 데이터를 timedelta를 이용하여 일자를 계산할 수 있는 데이터 형태로 바꾸어주어야 한다. 본인의 경우에는 일자 데이터가 20210101과 같은 형태로 입력되어 있기 때문에, 이를 2021-01-01과 같은 형태로 변경해주어야 한다.
※ 추가된 코드 : 11~16번째 줄
(11번째 줄) 일단 계산한 일자 데이터를 입력할 day_list 변수를 생성한 후, 데이텨 형태를 리스트 형태로 설정하고, (12번째 줄)리스트의 맨 첫 번째 자리에 standard_day를 입력해준다. (14번째 줄) 그 다음 for문을 통해 standard_day에 하루 하루씩 계산해줄 것인데, 그 전에 앞서 (15번째 줄) standard_day의 데이터 형태를 20210101에서 2021-01-01과 같은 형태로 변경한 후 current_day라는 변수에 입력한다. 마지막으로 (16번째 줄) current_day에 for문 내에서 1, 2, 3, 4씩 변하는 i라는 값을 datetime.timedelta라는 메서드를 통해 계산해준 후에 end 변수에 입력한다.
다시 말해 standard_day에 20210101이라는 값이 입력되어 있을 경우 current_day라는 변수에는 2021-01-01이라는 값이 입력되며 end라는 변수에는 2021-01-02라는 값이 입력되는 것이다. 다시 말해, end라는 변수에는 for문의 첫 번째에는 2021-01-02가, 두 번째에는 2021-01-03이, 세 번째에는 2021-01-04가 입력되는 것이다.
import time
class tradesystem(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setupUi(self)
class cal_function():
def cal_addday(self, standard_day, howmany):
day_list = []
day_list.append(standard_day)
for i in range(1, 15):
current_day = datetime.date(int(standard_day[0:4]), int(standard_day[4:6]), int(standard_day[6:9]))
end = str(current_day + datetime.timedelta(days=i))
def cal_subday(self, standard_day, howmany):
pass
이제 우리는 (17번째 줄) 다시 2021-01-01과 같은 데이터 형태를 20210101로 변경해주어야 하기 때문에 split("-")을 통해 "-"이라는 문자를 기반으로 나누어져 있는 값을 [2021, 01, 01]과 같은 형태로 나누어준 후에 (18번째 줄) 세 개의 문자를 모두 합쳐주면 20210101이라는 값을 다시 얻을 수 있다. 즉, 현재 var_date에는 20210102라는 값이 입력되어 있는 것이다. (19번째 줄) 이제 하루가 추가된 일자 값을 day_list라는 변수 안에 입력해주도록 하자. 그러면 day_list라는 변수 안에는 [20210101, 20210102, 20210103, ---- 20210116]이라는 값들이 입력된다. (21번째 줄) 이제 이 값들 중에서 우리가 사전에 인자로 전달받았던 howmany라는 값을 통해 일자를 계산한 만큼에 해당하는 값을 반환해주는 것이다.
※ 추가된 코드 : 17~21번째 줄
import time
class tradesystem(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setupUi(self)
class cal_function():
def cal_addday(self, standard_day, howmany):
day_list = []
day_list.append(standard_day)
for i in range(1, 15):
current_day = datetime.date(int(standard_day[0:4]), int(standard_day[4:6]), int(standard_day[6:9]))
end = str(current_day + datetime.timedelta(days=i))
tempt_var_date = str(end).split("-")
var_date = tempt_var_date[0] + tempt_var_date[1] + tempt_var_date[2]
day_list.append(var_date)
return day_list[howmany]
def cal_subday(self, standard_day, howmany):
pass
다시 말해 현재 day_list 라는 변수에는 [20210101, 20210102, 20210103, 20210104, 20210105, ······] 값들이 입력되어 있고 여기서 day_list[0] 는 20210101, day_list[1] 은 20210102, day_list[2] 는 20210103을 의미하기 때문에 day_list[] 안에 입력되는 값이 곧 standard_day 를 기반으로 추가적으로 계산된 값을 의미하는 것이다.
여기서 우리는 중요한 부분 하나를 놓치고 있는 게 있는데, 여기서 제작한 날짜 계산 코드는 단순하게 원하는 일자만큼만 계산해주는 것이지 주말인지 평일인지까지 구분해서 계산해주지 않는다. 이 부분에 대해 고려해야 하는 이유는 주말에는 주식 시장이 열리지 않기 때문이다. 따라서 마지막으로 주말을 구분해주는 메서드인 weekday() 를 통해 평일과 주말을 구분한 후에 평일인 경우에만 day_list 안에 입력해주도록 해보자.
※ 추가된 코드 : 20~25번째 줄
import time
class tradesystem(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setupUi(self)
class cal_function():
def cal_addday(self, standard_day, howmany):
day_list = []
day_list.append(standard_day)
for i in range(1, 15):
current_day = datetime.date(int(standard_day[0:4]), int(standard_day[4:6]), int(standard_day[6:9]))
end = str(current_day + datetime.timedelta(days=i))
tempt_var_date = str(end).split("-")
var_date = tempt_var_date[0] + tempt_var_date[1] + tempt_var_date[2]
day_list.append(var_date)
var_week = datetime.date(int(var_date[0:4]), int(var_date[4:6]), int(var_date[6:8])).weekday()
if var_week < 5:
day_list.append(var_date)
else:
pass
return day_list[howmany]
def cal_subday(self, standard_day, howmany):
pass
마지막으로 def cal_subday() 의 경우에도 마찬가지로 일자를 계산해주는 +와 -, 그 부호만 변경해주면 된다.
※ 추가된 코드 : 30~46번째 줄
import time
class tradesystem(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setupUi(self)
class cal_function():
def cal_addday(self, standard_day, howmany):
day_list = []
day_list.append(standard_day)
for i in range(1, 15):
current_day = datetime.date(int(standard_day[0:4]), int(standard_day[4:6]), int(standard_day[6:9]))
end = str(current_day + datetime.timedelta(days=i))
tempt_var_date = str(end).split("-")
var_date = tempt_var_date[0] + tempt_var_date[1] + tempt_var_date[2]
day_list.append(var_date)
var_week = datetime.date(int(var_date[0:4]), int(var_date[4:6]), int(var_date[6:8])).weekday()
if var_week < 5:
day_list.append(var_date)
else:
pass
return day_list[howmany]
def cal_subday(self, standard_day, howmany):
day_list = []
day_list.append(standard_day)
for i in range(1, 15):
current_day = datetime.date(int(standard_day[0:4]), int(standard_day[4:6]), int(standard_day[6:9]))
end = str(current_day - datetime.timedelta(days=i))
tempt_var_date = str(end).split("-")
var_date = tempt_var_date[0] + tempt_var_date[1] + tempt_var_date[2]
var_week = datetime.date(int(var_date[0:4]), int(var_date[4:6]), int(var_date[6:8])).weekday()
if var_week < 5:
day_list.append(var_date)
else:
pass
return day_list[howmany]
'AUTO TRADE > Back test' 카테고리의 다른 글
2.3 백테스팅하기 - 종목 선정하기 (1) (0) | 2022.01.02 |
---|---|
2.2 백테스팅하기 - 일자 계산 코드 구축하기 (2) (0) | 2022.01.01 |
1.5 백테스팅하기 - 종목별 변수 자동 생성하기 (2) (0) | 2021.12.31 |
1.4 백테스팅하기 - 종목별 변수 자동 생성하기 (1) (0) | 2021.12.31 |
1.3 백테스팅하기 - talib 라이브러리 이용하기 (0) | 2021.12.30 |
소중한 공감 감사합니다