< 1. 주가 일봉 데이터 저장 프로그램 개발 - 개요>

해당 포스트를 시작으로 여러 번에 걸쳐 주가 일봉 데이터 저장 프로그램을 개발해 본다. 마지막 포스트에 개발이 완료된 프로그램을 첨부파일로 올려주겠습니다. 이 프로그램을 통해 종목의 일봉 데이터('시가', '고가', '저가', '종가', '거래량) 를 DB 또는 엑셀에 저장한다. 물론 일봉 데이터 기간은 종목의 상장 이후로 한다. 종목 뿐만 아니라 코스피 지수, 코스닥 지수 데이터, KODEX 코스닥 150 레버리지 같은 ETF도 추가로 저장할 수 있다. 다음은 개발할 프로그램 UI 이다. 


  


간단하게 살펴보자. 종목 코드를 입력하고 "엑셀 저장" 버튼을 누르면 종목의 일봉 데이터가 엑셀에 저장된다. 참고로 "2333740"은 KODEX 코스닥 150 레버리지이다. 종목 코드는 네이버나 카카오 스탁에서 종목 이름을 입력하면 바로 얻을 수 있다. 다음은 개발한 프로그램으로 다운로드한 엑셀 파일이다. 날짜, 종가, 고가, 저가, 시가, 거래량 데이터가 종목 상장일부터 다운로드한 시점의 전날까지 데이터를 다운로드한다.(이 글을 쓰고 있는 오늘은 18년 1월 5일이다.)  

















엑셀 뿐만 아니라 DB에도 데이터를 저장할 수 있다. DB에 로그인 한 후 종목 코드를 입력하고 "DB 저장" 버튼을 누르면 DB에 데이터가 저장된다. DB에 모르는 분이 많을 것이다. DB를 사용하지 않고 엑셀만 이용한다면 DB에 대해 몰라도 된다. 



간단하게 기능은 위와 같고 이 프로그램 개발에 필요한 기초 지식 및 개발 환경은 다음과 같다.


1. 파이썬을 이용해 개발한다. 개발환경으로 PyCharm을 활용하고 UI 구성을 위해 Qt Designer을 이용한다.

2. 주식 데이터를 얻기 위해 키움 OPEN API를 이용한다.

3. DB로는 mysql을 사용한다.


'1'번과 '2'번 사항은  "파이썬으로 배우는 알고리즘 트레이딩" 사이트에서 모두 배울 수 있다. 프로그래밍을 잘 모르는 초보자도 쉽게 배울 수 있다. url은 아래와 같다.

"파이썬으로 배우는 알고리즘 트레이딩"


'3'번 사항 같은 경우 독자들 재량 것 공부하길 바란다. 물론 개발할 프로그램을 사용할 때 엑셀만 사용한다면 mysql에 대해 몰라도 된다. 


여러 포스트를 통해 주가 일봉 데이터 저장 프로그램을 개발해 볼 것이다. 기초적인 부분은 과감히 생략할 것이다. 또한 범용 프로그램이 아니기에 예외 처리는 최소화 했다. 



필자는 파이썬을 전문으로 하는 현업 프로그래머가 아니라 평범한 컴퓨터 공학과 대학생입니다. 따라서 코드의 효율성, 최적화 측면에서 부족한 면이 있을 겁니다. 잘못된 부분이나 좀 더 효율적으로 수정해야할 부분이 있다면 댓글 부탁드립니다.

해당 프로그램의 최종 결과 파일 및 소스 코드는 시리즈 마지막 포스트에 첨부할 예정입니다. 



< 7. 알고리즘 최적화를 통한 수익율 극대화 (키움 open api 주식 알고리즘 테스트 프로그래밍) >


1. 키움 open api를 이용한 주식 알고리즘 테스트 프로그래밍

2. DB 설계

3. DB 구현

4. 주식 데이터 불러오기

5. 알고리즘을 통한 매수, 매도 테스트


해당 포스트를 읽기 전에 위의 포스트들을 읽기 바란다.


우리는 지난 포스트까지 알고리즘을 적용하기 전과 후의 매수/매도 수익율을 구한 다음 비교해보았다. 이번에는 구현한 알고리즘의 변수를 조정해서 수익율을 극대화하는 코드를 구현할 것이다. 구현은 간단하다. '5. 알고리즘을 통한 매수,매도 테스트' 에서 배운 'set_var1_and_var2(self,var1,var2)' 메서드를 이용하면 된다. var1과 var2는 알고리즘내에 기준 변수가 되어 해당 변수를 토대로 매수할 지 매도할 지 결정한다. 


'optimize()' 메서드는 사용자가 var1과 var2에 대한 범위를 주면 범위 내의 var1과 var2에 대한 총 수익율을 구하고 이를 DB에 저장한다. 

    def optimize(self,var1_start, var1_end, var2_start, var2_end,start, end):
        self.optimize_profit = pd.DataFrame(columns=('var1','var2','profit'))
        while var1_start<=var1_end:
            var2 = var2_start
            while var2<=var2_end:
                self.backTracking.set_var1_and_var2(var1,var2)
                profits_data = self.backTracking.get_days_profit(start,end)
                profit = profits_data['total_profit'][len(profits_data)-1]
                self.optimize_profit = self.optimize_profit.append(pd.Series({'var1' : var1, 'var2' : var2, 'profit' : profit}),ignore_index=True)
                self.db.insert_Profit(var1,var2,profit)
                var2+=0.0003

            var1_start+=1
        self.db.commit()

'var*_start'와 'var*_end'로 범위를 주고 start와 end로 수익율을 구할 기간을 정한다. 'self.optimize_profit'는 var1과 var2에 따른 수익율을 저장한다. for문을 통해 var1과 var2가 일정 간격으로 변한다. 'set_var1_and_var2(var1,var2)'로 알고리즘의 var1과 var2 값을 설정하고 'get_days_profit()'를 이용해 지정된 기간동안 수익율을 정한다. 결과 값을 'optimize_profit'에 저장하고 'insert_Profit'를 이용해 DB에 데이터를 저장한다.


'optimize' 함수를 이용해 var1과 var2에 따른 수익율을 'self.optimize_profit'에 저장했다. 수익율을 최대화하는 var1과 var2를 구하려면 다음 코드처럼 하면 된다. 

max_profit_data = self.optimize_profit.ix[self.optimize_profit['profit'].idxmax()]
print("최대 이익 : var1 => " + str(max_profit_data['var1']) + " var2 => "+ str(max_profit_data['var2']) + " profit : " + str(max_profit_data['profit']) )

더 구체적인 데이터 분석을 하고 싶다면 DB에 데이터를 저장했기 때문에 DB SQL문을 이용하면 된다.

 

+ Recent posts