지난 게시글에서 일자를 계산해주는 코드를 모두 구축했으니, 이번에는 그 일자를 바탕으로 백테스팅을 진행할 때 어떤 구조로 코드를 작성해야 하는지 살펴볼 예정이다.
[파일명 : algortihm_1] while문 이용해서 일자 계산하기
일단 기본적으로 boss 파일 내에 존재하는 클래스를 사용하기 위해서는 import와 인스턴스 생성을 모두 해주어야 한다. 너무 복잡한 개념처럼 들린다면 설명은 제외하고, 아래와 같이 맨 위에서 import한 후에 def __init__ 안에서 calf = cal_function()이라는 코드를 통해 인스턴스를 생성해주면 된다.
from boss import cal_function
class algo_1():
def __init__(self, kospi_data, kosdaq_data, item_data):
calf = cal_function()
self.kospi_data = kospi_data
self.kosdaq_data = kosdaq_data
self.item_data = item_data
이제 def __init__ 함수 내에서 하루 동안의 시뮬레이션이 모두 끝났으면 자동적으로 다음 일자로 넘어가도록 하는 코드를 구축해보도록 하자. 여기서 사용할 것은 바로 while()문이다. 이 while문은 특정 조건이 충족되지 않을 때까지 계속해서 반복하게끔 하는 것이다. ※ 추가된 코드 : 10~13번째 줄
위의 코드 세 줄을 다시 한 번 살펴보도록 하자. 만약 start_date라는 변수에 20210101이라는 값이 입력되었다면 self.today에도 20210101이라는 값이 입력될 것이다. 그 후 while 문에서는 self.today 변수가 end_date(아래에서 설정할 예정)보다 작다면 self.today 값에 calf.cal_addday()를 통해 하루를 추가한 값을 입력하도록 하는 것이다.
728x90
[파일명 : algorithm_1] start_date 값과 end_date값 설정해주기
위의 코드를 봤다면 알 수 있듯이, start_date 값과 end_date 값이 별도로 설정되어 있어야만 while문이 제대로 동작한다. 그렇다면 start_date와 end_date를 코드 내에서 단순하게 입력해주어도 되겠지만, 현재 boss 파일 내에서는 ui 파일과 연결해서 사용하고 있는 만큼 프로그램에서 입력한 값을 받아와서 그 값을 바탕으로 start_date와 end_date라는 변수에 값이 설정될 수 있도록 해보자. 일단 gui 파일 안에서, 아래와 같이 두 개의 lineEdit을 추가해주도록 하자.
왼쪽이 lineEdit_2에 해당하고 오른쪽이 lineEdit_3에 해당한다. 그렇다면 여기서 각각 입력된 값들을 하나는 start_date, 하나는 end_date이라는 변수 안에 입력하도록 하는 코드를 구축해야 한다.
근데 문제는 바로 이 gui 파일이 boss 파일에서 열렸다는 것이고, 우리는 현재 algorithm_1 파일에서 작업을 진행하고 있다는 것이다. 하지만 boss 파일에서 열린 gui 파일을 algorithm_1 파일에서도 접근하기 위한 방법은 의외로 간단하다. 앞서 일자를 계산할 때 class cal_function() 을 import와 인스턴스를 생성했던 것처럼 마찬가지로 boss 파일 내에 있는 class tradesystem() 을 import하고 인스턴스를 생성해주면 된다. ※ 추가된 코드 : 4, 10, 11번째 줄
class algo_1():
def __init__(self, kospi_data, kosdaq_data, item_data):
boss = tradesystem()
calf = cal_function()
self.kospi_data = kospi_data
self.kosdaq_data = kosdaq_data
self.item_data = item_data
## 날짜 for 문 코드 구축하기
start_date = boss.lineEdit_2.text()
end_date = boss.lineEdit_3.text()
self.today = start_date
while self.today <= end_date:
self.today = calf.cal_addday(self.today, 1)
즉, tradesystem() 을 바탕으로 boss라는 인스턴스를 생성해준 후에, boss.lineEdit_2 라고 입력하면 boss 파일에서 열린 ui 파일의 lineEdit_2에 접근할 수 있는 것이다. 따라서 lineEdit에 입력되어 있는 값을 가져오는 메서드인 .text()를 이용해 boss.lineEdit_2.text() 라는 코드를 제작해주면, 입력되어 있는 값을 start_date라는 변수에 저장할 수 있는 것이다. 그와 동일한 방법으로 end_date 역시 boss.lineEdit_3.text() 와 같이 입력해주면 된다.
그러면 이제 lineEdit_2에는 20210101을, lineEdit_3에는 20211231을 입력해보도록 하자. 자동으로 입력된 값을 받아온 후에, 하루씩 계산하면서 나아가게 되고 그 과정에서 주말에 해당하는 날짜는 자동적으로 제외하게 된다. 그 과정이 궁금하다면 while문 아래에 print(self.today)를 추가해보면, 현재 어느 날짜를 계산하고 있는지 확인할 수 있으며 주말에 해당하는 날짜는 출력되지 않는다는 점을 확인할 수 있다.