PYTHON/Back test

1.4 백테스팅하기 - 종목별 변수 자동 생성하기 (1)

  • -

지난 게시글에서는 코스피와 코스닥 지수의 데이터를 불러오는 코드를 구축하고 넘어왔다. 이제 다음으로 구축할 코드는 바로 종목별 데이터가 담겨 있는 변수를 생성하는 것인데, 코스피 종목과 코스닥 종목 내에 있는 종목 개수는 2020년을 기준으로 2,268개 종목으로 정말 무수하게 많다. 그렇다면 이 종목들을 하나하나 변수로 설정해주고 그 변수에 각각의 데이터들을 입력해주어야 그 데이터를 바탕으로 백테스팅을 할 수 있다는 것인데, 너무 복잡하지 않을까 싶다. 

 

 

어떤 방법이 있을까?

가장 먼저 떠오르는 방법으로는 시뮬레이션을 시작한 후, 데이터베이스 내에 저장되어 있는 종목 코드들을 모두 불러온 후에 하나 하나 돌면서 주가 데이터를 불러온 후 그 주가 데이터를 바탕으로 백테스팅을 진행하고, 한 종목이 끝나면 다음 종목의 주가 데이터를 불러온 후에 그 데이터를 바탕으로 또 백테스팅을 진행하는 방법이 있겠다. 하지만 매 순간 순간 종목별 데이터를 불러오는 건 너무 오랜 시간이 소요되는 일이다. 실제로 해봤던 경험에 따르면, 반년치 데이터를 백테스팅하는 데에 7시간이 넘게 걸린다.(그 정도로 백테스팅을 효율적이고 효과적으로 수행해내는 코드를 구축하는 것은 어려운 일이다.)

그렇다면 다음 방법으로는 종목마다 별도로 부여된 종목 코드를 변수 이름으로 설정한 후에, 그 변수 이름에 각각의 차트 데이터를 입력해주는 방법이 있겠다. 그렇다면 종목 코드를 어떻게 변수로 설정해줄 수 있을까? 종목 코드는 기본적으로 숫자로 시작하기 때문에 숫자만으로 이루어진 변수는 생성할 수 없다. 따라서 앞에 문자 하나를 추가해서 변수임을 사전에 설정해주는 방법이 있을 것이다. 일단은 종목 코드 리스트를 불러온 후에, 지수 데이터들과 함께 알고리즘 파일 내에 하나의 인자로 전달해주자.

 

 

[파일명 : boss] 종목 코드 리스트 불러오기

이전 게시글에서도 확인했었겠지만, 본인의 종목별 데이터는 item_data라는 데이터베이스 내에 있는 'sv_load_chart'라는 테이블에 입력되어 있다. sv는 save의 약자로, 종목별로 주가 데이터를 저장한 경우 그때마다 1이라는 값을 입력함으로써 이어받기가 가능하도록 만들기 위해 제작한 테이블이다. 이 테이블 내에는 현재 상장되어 있는 모든 종목의 종목 코드들이 다 입력되어 있고, 해당 종목의 주가 데이터가 입력되어 있는지 없는지 여부까지도 입력되어 있다. 종목 코드를 불러오는 코드는 앞서 코스피 지수와 코스닥 지수를 불러왔던 것과 동일한 메커니즘으로 제작하면 된다.
※ 추가된 코드 : 15번째 줄

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

        ## QT GUI 이벤트 연결 메서드
        self.pushButton_4.clicked.connect(self.pushB_4)
        self.lineEdit.returnPressed.connect(self.pushB_4)

        ## LOAD INDEX DATA
        self._load_index_data()

        ## LOAD ITEM DATA
        self.item_data = dbf.load('item_data', 'sv_load_chart', row=None).fillna(0)
    
    
    ## LOAD INDEX DATA
    def _load_index_data(self):
        kospi_index = dbf.load('kos_data', 'kospi_index', row=None).sort_values('date').reset_index(drop=True)
        self.kospi_index = talc.all_MA(kospi_index)
        kosdaq_index = dbf.load('kos_data', 'kosdaq_index', row=None).sort_values('date').reset_index(drop=True)
        self.kosdaq_index = talc.all_MA(kosdaq_index)
        
        
    ## JUSTIFY ALGO NUMBER
    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("알고리즘 번호가 잘못되었습니다. 입력값은 " + str(self.algorithm_num) + "입니다.")

 

 


728x90

 

 

[파일명 : boss] 알고리즘 파일로 지수 데이터와 종목별 데이터 전달하기

  boss  파일 내에서   self.item_data  와   self.kospi_data   self.kosdaq_data  라는 세 개의 데이터를 구축했고 이제 이 데이터들을 알고리즘 파일에 인자로 전달해주자. 그러기 위해서는 알고리즘 파일 내에서 인자로 받아올 데이터 목록을 설정해주어야 한다.

## [파일명 : algorithm_1] ##
class algo_1():
    def __init__(self, kospi_data, kosdaq_data, item_data):
        self.kospi_data = kospi_data
        self.kosdaq_data = kosdaq_data
        self.item_data = item_data

 

그 후에 이제   def pushB_4()  함수 내에서 algo_num == "1"인 경우에 algo_1()을 실행하도록 입력해두었는데, 그 안에 전달해 줄 데이터들을 순서대로 입력해주도록 하자.
※ 수정된 코드 : 29번째 줄

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

        ## QT GUI 이벤트 연결 메서드
        self.pushButton_4.clicked.connect(self.pushB_4)
        self.lineEdit.returnPressed.connect(self.pushB_4)

        ## LOAD INDEX DATA
        self._load_index_data()

        ## LOAD ITEM DATA
        self.item_data = dbf.load('item_data', 'sv_load_chart', row=None).fillna(0)
    
    
    ## LOAD INDEX DATA
    def _load_index_data(self):
        kospi_index = dbf.load('kos_data', 'kospi_index', row=None).sort_values('date').reset_index(drop=True)
        self.kospi_index = talc.all_MA(kospi_index)
        kosdaq_index = dbf.load('kos_data', 'kosdaq_index', row=None).sort_values('date').reset_index(drop=True)
        self.kosdaq_index = talc.all_MA(kosdaq_index)
        
        
    ## JUSTIFY ALGO NUMBER
    def pushB_4(self):
        self.algorithm_num = self.lineEdit.text()
        if self.algorithm_num == "1":
            algorithm.algorithm_1.algo_1(self.kospi_data, self.kosdaq_data, self.item_data)
        elif self.algorithm_num == "2":
            algorithm.algorithm_2.algo_2()
        elif self.algorithm_num == "3":
            algorithm.algorithm_3.algo_3()
        else:
            print("알고리즘 번호가 잘못되었습니다. 입력값은 " + str(self.algorithm_num) + "입니다.")

 

 

728x90
반응형
Contents

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

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