PYTHON/Back test

1.1 백테스팅하기 - 총괄 프로그램인 boss 파일 제작하기

  • -

이전에 제작했던 백테스팅 관련 게시글들은 한 가지 전략을 기반으로 하여 종목들의 주가 데이터 흐름을 분석하는 것이었다. 따라서 이번에는 여러 가지 전략들을 선택하여 실행할 수 있도록 하는 백테스팅 프로그램을 제작해보고자 한다. 실제로 백테스팅 과정에 있어서 다양한 설정값들을 변경하면서 실행해주어야 할 필요가 있는 만큼, 메인 화면에서 세부 값들을 설정한 후 백테스팅을 진행한다면 백테스팅을 조금 더 수월하게 진행할 수 있을 것이다.

 

 

UI 파일 생성하기

기본적으로 알고리즘을 선택할 수 있도록 하는 기능만 구현하면 된다는 점을 고려하여   lineEdit    pushButton  하나를 추가하자. 그리고   lineEdit  에 값을 입력한 후   pushButton  이 클릭될 경우 입력된 값을 바탕으로 알고리즘을 선택한 후 백테스팅을 진행하도록 할 것이다. 

UI 파일 설치하는 방법 바로가기
※ 파이썬과 UI 파일 연결하는 방법 바로가기

 

 

코드 작성 : 버튼 연결하기

class tradesystem(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton_4.clicked.connect(self.pushB_4)
        self.lineEdit.returnPressed.connect(self.pushB_4)

위와 같이 pushButton_4가 클릭되면(clicked) self.pushB_4라는 함수가 실행되도록 설정한 후, self.lineEdit에 마우스 커서가 올라가 있는 상태에서 엔터키가 눌리면(returnPressed) 마찬가지로 self.pushB_4라는 함수가 실행되도록 구축했다. 다시 말해, pushButton_4가 클릭되거나 엔터키가 눌린 경우 pushB_4라는 함수가 실행되도록 하는 것이다.

그렇다면 pushB_4에는 어떤 내용의 코드가 포함되어 있어야 할까? 일단 lineEdit 안에서 입력한 값은 알고리즘의 번호이니 만큼 그 값을 구분해서 알고리즘을 실행하는 내용의 코드가 있어야 한다. 그렇다면 입력된 값을 바탕으로 몇 번 알고리즘을 실행할 것인지를 결정하는 조건문을 작성한 후에, 해당 조건문 아래에서 어떤 알고리즘을 실행할지를 명령하는 코드가 존재해야 한다.

 

 

코드 작성 : 입력된 값 가져오기

일단 lineEdit에 어떤 값이 입력되었는지를 확인하고 그 값을 이용해서 알고리즘과 연결해야 한다. 여기서 lineEdit에 입력되어 있는 값을 가져오는 메서드는   text()  이다. 아래 코드의 2번 라인을 보면   self.algorithm_num = self.lineEdit.text()  라는 코드가 있는데, 이 부분이 바로 lineEdit에 입력되어 있는 값을   self.algorithm_num  이라는 변수에 저장하라는 부분에 해당한다.

이제 그 아래 부분에서는 조건문을 통해   self.algorithm_num  이라는 변수 안에 어떤 값이 입력되어있는지를 확인해서 각각의 알고리즘을 실행하도록 하면 된다.

def pushB_4(self):
    self.algorithm_num = self.lineEdit.text()

    if self.algorithm_num == "1":
        pass

    elif self.algorithm_num == "2":
        pass

    elif self.algorithm_num == "3":
        pass

하지만 여기서 고려해야 하는 부분은 오류 발생의 가능성이다. 다시 말해,   self.algorithm_num  이라는 변수 안에 1 또는 2, 3이 입력되었다면 문제가 없는데 4, 5 등과 같은 수를 입력했을 경우 어떻게 처리할 것인지에 대해 생각해보아야 한다. 어차피 나만 쓸테니까 그딴 건 필요 없다면 상관없겠지만, 알고리즘 번호가 많아지게 된다면 알고리즘의 존재 유무를 확인해야 하는 번거로움이 발생하게 된다. 따라서 입력된 값이 아닌 경우에는 올바르지 않은 알고리즘이라는 내용을 출력하도록 하자.
※ 추가된 코드 : 13, 14번째 줄

def pushB_4(self):
    self.algorithm_num = self.lineEdit.text()

    if self.algorithm_num == "1":
        pass

    elif self.algorithm_num == "2":
        pass

    elif self.algorithm_num == "3":
        pass

    else:
        print("알고리즘 번호가 없습니다.")

 

 


728x90

 

 

알고리즘 파일 생성하기

앞서 pushB_4라는 함수 내에서 lineEdit에 입력된 값을 얻어와서 그를 바탕으로 알고리즘을 실행하도록 하는 코드를 구축했고 이제는 실행할 알고리즘을 제작하면 된다. 다시 말해, lineEdit에 입력된 값이 1이라면 1번 알고리즘을 실행해야 하는데 그 1번 알고리즘을 만들어서 실행되도록 하자는 것이다.

본인의 경우 위와 같이 back_Test라는 폴더 내에 algorithm 폴더를 만들어서 그 안에 각각 algorithm_1, algorithm_2, algorithm_3 파일을 생성했으며, 이 세 가지 파일을 boss 파일의 self.pushB_4 함수 내에서 실행하도록 할 것이다. 각 파일 내에서는 아래와 같이 파일 이름과 동일한 알고리즘 번호가 적힌 클래스 class algo_()가 작성되어 있다.

## algorithm 폴더 내 algortihm_1.py 파일 내 코드
class algo_1():
    print("1번 알고리즘입니다.")
    
## algorithm 폴더 내 algortihm_2.py 파일 내 코드
class algo_2():
    print(("2번 알고리즘입니다.")

## algorithm 폴더 내 algortihm_3.py 파일 내 코드
class algo_3():
    print("2번 알고리즘입니다.")


## boss 파일 코드
import algorithm

class tradesystem(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.pushButton_4.clicked.connect(self.pushB_4)
        self.lineEdit.returnPressed.connect(self.pushB_4)

    def pushB_4(self):
        self.algorithm_num = self.lineEdit.text()

        if self.algorithm_num == "1":
            algorithm.algorithm_1.algo_1()

        elif self.algorithm_num == "2":
            algorithm.algorithm_2.algo_2()

        elif self.algorithm_num == "3":
            algorithm.algorithm_3.algo_3()

        else:
            print("알고리즘이 없습니다.")

 

이제 buss 파일을 실행한 후 lineEdit에 '1'을 입력한 채 Enter키를 누르면(또는 오른쪽의 버튼을 클릭하면) "1번 알고리즘입니다."라는 내용이 출력되는 것을 확인할 수 있다.

 

 


728x90
반응형
Contents

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

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