< 6. 알고리즘 전 후 수익율 테스트 (키움 open api 주식 알고리즘 테스트 프로그래밍) >


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

2. DB 설계

3. DB 구현

4. 주식 데이터 불러오기

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


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


우리는 이전 포스트까지 구현한 알고리즘을 통해 KODEX 코스닥 150 레버리지를 가상으로 매수/매도했고 이를 DB에 저장했다. 이번 포스트에서는 알고리즘을 이용한 매수/매도가 알고리즘 전보다 얼마나 효율적인치 비교하는 코드를 구현할 것이다. 사용자가 일정 기간을 설정하면 알고리즘 적용한 매수/매도의 당일 수익율과 적용 전 당일 수익율을 구한 다음 이를 그래프로 나타낼 것이다. 알고리즘 적용 전 매수/매도는 KODEX 코스닥 150 레버리지 당일 시초가에 매수하고 당일 종가에 매도하는 걸로 설정할 것이다. 

다음은 구현할 클래스의 초기화 부분이다.
class Main:
    def __init__(self):
        self.db = Db.StockDb()
        self.backTracking = Backtracking.OrderBacktraking(var1,var2)
        self.before_profits = pd.DataFrame(columns=('date','profit','total_profit'))
        self.after_profits = pd.DataFrame(columns=('date','profit', 'total_profit'))

DB를 이용하기 때문에 DB 객체를 만들고 지난 포스트에서 배운 OrderBacktracking 객체를 만든다. var1과 var2는 지난 포스트에서도 말했지만 알고리즘에 적용하는 변수이다. 이 변수를 기준으로 매수/매도한다. 'self.before_profits' 변수는 알고리즘 적용 전 수익율을 저장한다. date은 수익율을 계산한 일을 의미한다. profit는 당일 수익률이다. total_profit는 총수익율을 의미한다. 매수/매도하는 기간을 정하는 데 기간을 적용한 일부터의 총 수익율이다. 'self.after_profits'는 알고리즘 적용 후 수익율을 저장한다.



다음은 'self.before_profits'와 'self.after_profits'에 데이터를 저장하는 메서드이다. 알고리즘 적용 전과 적용 후 일정기간동안 수익율을 저장한다. 

def compare_Algorithm(self,start, end): self.after_profits = self.backTracking.get_days_profit(start,end) total_profit=1 before_data = self.db.select_Daily_Data(start,end) for i in range(len(before_data)): profit = before_data['end'][i]/before_data['start'][i]*0.9997 total_profit *=profit self.before_profits = self.before_profits.append(pd.Series({'date' : before_data['date'][i], 'profit' : profit, 'total_profit' : total_profit}),ignore_index=True)

매수/매도할 기간을 start와 end로 정한다. start일부터 end일까지의 당일 수익율과 총 수익율을 구한다. 지난 포스트에서 'get_days_profit(start, end)' 메서드를 배웠다. 'get_days_profit()'는 start일부터 end일까지 알고리즘을 적용한 매수/매도의 당일 수익율과 총 수익율을 구한다. 그리고 알고리즘 적용 전 매수/매도 수익율을 구한다. 'select_Daily_Data'로 시가와 종가 데이터를 가져온다. 수익율과 총 수익율을 구한 후 'self.before_profits'에 저장한다.  


지금까지 알고리즘을 적용 후와 전 매수/매도 당일 수익율과 총 수익율을 구했다. 이를 그래프에 표현해서 비교해보자. 실행 결과물은 다음과 같다. "2017년 10월 1일"부터 "2017년 11월 7일"까지 데이터를 이용한 실행 결과물이다. 아래 그래프에서 10월 10일부터 표시된 이유는 추석연휴기간이였기 때문이다. 주황색 선은 알고리즘을 이용한 매수/매도 수익율이고 파란색 선은 알고리즘 적용 안 한 매수/매도 수익율이다. 두 개의 그래프 중 위 그래프는 당일 수익율을 나타내고 아래 그래프는 총 수익율을 나타낸다. 비교 결과 알고리즘 적용 후가 수익율이 5퍼 정도 높게 나오는 걸 알 수 있다. 이에 대한 코드는 아래와 같다.


    def show_compare_Algorithm(self,start,end):
        main.compare_Algorithm(start, end)

        fig = plt.figure()
        top_axes = fig.add_subplot(2, 1, 1)
        bottom_axes = fig.add_subplot(2, 1, 2)

        day_index = [datetime.datetime.strptime(sday, "%Y%m%d") for sday in main.before_profits['date']]
        top_axes.set_xlabel('날짜')
        top_axes.set_ylabel('당일 수익')
        top_axes.grid(True)
        top_axes.plot(day_index, main.before_profits['profit'], label='before profit')
        top_axes.plot(day_index, main.after_profits['profit'], label='after profit')
        top_axes.legend(loc='upper left')

        bottom_axes.set_xlabel('날짜')
        bottom_axes.set_ylabel('총 수익')
        bottom_axes.grid(True)
        bottom_axes.plot(day_index, main.before_profits['total_profit'], label='before total_profit')
        bottom_axes.plot(day_index, main.after_profits['total_profit'], label='after total_profit')
        bottom_axes.legend(loc='upper left')

        plt.tight_layout()
        plt.show()

위 코드는 필자가 소개했던 '파이썬으로 배우는 알고리즘 트레이딩' 사이트에 나와있다. 모르겠다면 해당 사이트에 들어가서 찾아보길 바란다.



이번 포스트를 통해 알고리즘 적용 전과 후의 수익율을 비교해보았다. 다음 포스트에서는 알고리즘에 적용된 변수를 최적화해 최대 수익율을 낼 수 있는 알고리즘 변수를 구하는 방법에 대해서 알아보겠다.

+ Recent posts