지난 게시글에서는 코스피와 코스닥 지수의 데이터를 불러오는 코드를 구축하고 넘어왔다. 이제 다음으로 구축할 코드는 바로 종목별 데이터가 담겨 있는 변수를 생성하는 것인데, 코스피 종목과 코스닥 종목 내에 있는 종목 개수는 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 라는 세 개의 데이터를 구축했고 이제 이 데이터들을 알고리즘 파일에 인자로 전달해주자. 그러기 위해서는 알고리즘 파일 내에서 인자로 받아올 데이터 목록을 설정해주어야 한다.