SW/주가 예측

주식, 비트코인 예측 : 백테스팅 : 방법, 특징, 종류

얇은생각 2019. 7. 5. 12:30
반응형

백테스팅

특정 기간의 과거 데이터로 알고리즘 트레이딩 시스템의 성능을 평가하는 것을 백테스팅이라 합니다. 백테스팅은 알고리즘 시스템을 파악하기 위해 시행하는 것으로 매우 중요한 부분입니다.


백테스팅은 다양한 종류와 방법이 있습니다. 대표적인 방법에 대해 알아보겠습니다.




Profit/Loss

개발한 시스템에 특정 기간의 데이터를 입력해 트레이딩을 실시합니다. 그 때, 발생하는 이익과 손실을 평가합니다.


주식, 비트코인 예측 : 백테스 : 방법, 특징, 종류




Hit Ratio

Hit Ratio는 모델을 이용해, 예측한 결과의 정확도를 의미합니다. 모델에 따라 의미가 다를 수 있습니다. 


주식, 비트코인 예측 : 백테스 : 방법, 특징, 종류


Hit Ratio는 과거 데이터를 이용합니다. 그러므로, 특히 머신러닝 모델의 경우 학습에 사용했던 데이터와 테스트에 사용한 데이터가 중복되지 않도록 합니다. 



    def getHitRatio(self,name, code, start_date,end_date,lags_count=5):
        a_predictor = self.predictor.get(code,name)

        df_dataset = self.predictor.makeLaggedDataset(
code,start_date,end_date, self.config.get('input_column'),
self.config.get('output_column'),lags_count )
        df_x_test = df_dataset[ [self.config.get('input_column')] ]
        df_y_true = df_dataset[ [self.config.get('output_column')] ]


        self.loadDataFrames(model,portfolio,start_date,end_date)
        
        for a_item in portfolio.items[model]:
            for row_index in range(a_item.df.shape[0]):
                if (row_index+1)>self.window_size:
                    position = self.determinePosition(
a_item.df,
a_item.column,
row_index)
                    if position!=HOLD:
                        self.trader.add(
model,a_item.code,
row_index,position)


        pred = classifier.predict(x_test)

        hit_count = 0
        total_count = len(y_test)
        for index in range(total_count):
            if (pred[index]) == (y_test[index]):
                hit_count = hit_count + 1

        hit_ratio = hit_count/total_count
        score = classifier.score(x_test, y_test)
        #print "hit_count=%s, total=%s, hit_ratio = %s" % (hit_count,total_count,hit_ratio)

        return hit_ratio, score
        # Output the hit-rate and the confusion matrix for each model

        #print("%s\n" % confusion_matrix(pred, y_test))



    def drawHitRatio(self,name, code, start_date,end_date,lags_count=5):
        a_predictor = self.predictor.get(code,name)

        df_dataset = self.predictor.makeLaggedDataset(
code,
start_date,
end_date,
self.config.get('input_column'),
self.config.get('output_column'),
lags_count )
        df_x_test = df_dataset[ [self.config.get('input_column')] ]
        df_y_true = df_dataset[ [self.config.get('output_column')] ].values


        df_y_pred,df_y_pred_probability = a_predictor.predict(df_x_test)


        ax = df_dataset[ [self.config.get('input_column')] ].plot()

        for row_index in range(df_y_true.shape[0]):
            if (df_y_pred[row_index] == df_y_true[row_index]):
                ax.annotate('Yes', xy=(
row_index,
df_dataset.loc[ row_index,
self.config.get('input_column') ]),
xytext=(10,30),
textcoords='offset points',
arrowprops=dict(arrowstyle='-|>'))

        plt.show()
        # Output the hit-rate and the confusion matrix for each model


drawHitRatio() 함수는 예측 결과에 따라 취한 매수 매도 포지션이 맞을 때 표식을 나타내 주가 변동에 따른 알고리즘 트레이딩 시스템 예측 성능을 팔로우업할 수 있습니다. 




Drawdown

알고리즘 트레이딩 시스템의 운영과 위험 관리에 매우 중요한 지표입니다. 잘못된 예측이 얼마나 되는 지 알 수 있습니다. 또 그 기간이 얼마인지를 알려주어서 파산의 위험성에 대한 정보를 제공합니다. 


주식, 비트코인 예측 : 백테스 : 방법, 특징, 종류


이 지표를 통해 최대 손실률, 손실 지속 기간, 손실 경향 등을 알 수 있습니다. 


이 지표는 알고리즘 트레이딩을 할 때 지속해서 확인해야 하는 것입니다. 수익률과 더불어 알고리즘 트레이딩을 지속해야 할지 말지를 결정하는 데 중요한 역할을 합니다.




Sharpe Ratio

위험을 고려한 성능을 나타내는 수치입니다. 금융에서 광범위하게 사용되는 중요한 개념입니다. 


주식, 비트코인 예측 : 백테스 : 방법, 특징, 종류


기대값/기대값 표준편차를 계산한 것입니다. 기대값은 수익률을 의미합니다. 기대값 표준편차는 수익률의 표준 편차입니다. 따라서 수익률/변동성입니다. 이것은 결국 위험을 의미합니다.


금융에서 변동성은 가장 무서운 적입니다. 알고리즘 트레이딩 시스템은 단 한번의 거래로 파산할 수 있습니다. 수익률보다는 수익률이 적더라도 위험도가 낮은 시스템을 선택하는 것이 합리적인 선택입니다. Sharpe Ratio는 이익과 위험을 고려한 수치입니다. 따라서 시스템의 성능을 균형 잡힌 시각에서 알 수 있습니다.

반응형