PYTHON/Back test

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

 

 


728x90

 

 

이제 우리는 (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]

 

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.