상세 컨텐츠

본문 제목

파이썬(Python) backtesting.py 라이브러리(삼성전자 백테스팅)

Financial/Quant

by 조대리 2022. 7. 21. 10:45

본문

반응형

백테스팅(Backtesting) 이란?

백테스팅(Backtesting)은 과거(history) 데이터를 기반으로 예측 모델을 테스트하기 위해 모델링에 사용되는 용어이다.

주식 및 금융 영역에서는 나의 전략이 과거에 어떻게 수행되었는지, 성과(performance)는 어땠는지 확인하여 좋은 결과가 나올 경우 실제(미래) 투자에 적용해 볼 수 있다. 알고리즘 트레이딩 전략과 보다 전문적인 수준을 원한다면 백테스팅은 필수다.

파이썬 라이브러리, Backtesting.py

파이썬에는 백테스팅을 보다 쉽게 진행할 수 있도록 만들어진 라이브러리가 있다. 이 중 'Backtesting.py'를 사용해 진행할 것이다.(https://github.com/kernc/backtesting.py)

얼마 전까지만 해도 관련 책에서도 많이 언급되던 Zipline(https://github.com/quantopian/zipline

)는 업데이트되지 않은지 2년 가까이 되었다. Python 3.6 버전까지만 지원하는 것도 최대 단점이다.

이 외에 관련된 많은 라이브러리가 관리되고 있지 않다고 설명되어 있다.

(AlephNull, ProfitPy, prophet, pybacktest, quant, QuantSoftware Toolkit, QuantStart QSForex, tia: Toolkit for integration and analysis, TradingWithPython, Ultra-Finance, visualize-wealth)

현재 관리되고 있다고 설명되어 있는 라이브러리는 다음과 같다.

(bt, vectorbt, Backtrader, PyAlgoTrade, Pinkfish, finmarketpy, QuantStart QSTrader, pysystemtrade, QTPyLib, Gemini, Quantdom, Clairvoyant, optopsy, RQalpha, zvt, AwesomeQuant)

라이브러리 별 간단 설명 : https://github.com/kernc/backtesting.py/blob/master/doc/alternatives.md

Backtesting.py 설치와 삼성전자 백테스팅

Backtesting.py는 현재 확인 가능한 것으로는 Python 3.7~3.9 버전에 호환되고 있다.

아래 명령어를 입력해 설치한다.

pip install backtesting​

코드를 작성해 전략을 설정하면 되는데, 현금 1억과 수수료율 0.015%로 설정하여 삼성전자(005930)를 가격 이동평균(moving average) 20일선과 60일선이 크로스 하면 전량 매수, 전량 매도하는 방식으로 백테스팅을 하는 것으로 수정해 보았다.

 

from backtesting import Backtest, Strategy
from backtesting.lib import crossover


class SmaCross(Strategy):
    
    n1 = 20
    n2 = 60
    
    def init(self):
        # price = self.data.Close
        price = df['Close'].values
        self.ma1 = self.I(SMA, price, self.n1)
        self.ma2 = self.I(SMA, price, self.n2)

    def next(self):
        if crossover(self.ma1, self.ma2):
            self.buy()
        elif crossover(self.ma2, self.ma1):
            self.position.close()


bt = Backtest(df, SmaCross, commission=.015, cash=100000000, 
              exclusive_orders=True)

stats = bt.run()
bt.plot()

투자 기간은 2010년 1월 4일부터 2022년 7월 5일까지 설정했다. 결과는 최고 수익률 320%, 현재 260% 수익을 낸 것을 우측 상단에서 확인할 수 있다.

이 외에도 간단한 조작만으로 차트를 확대, 이동할 수 있는 기능도 있고, 언제 매수, 매도를 진행했는지와 수익률 차트, 주가차트와 같이 수익&손실 구간을 확인할 수 있어 매우 직관적이다.

Backtesting.py 기능들(stats, 백테스팅 상세 내용)

stats를 입력하면 백테스팅에 대한 상세 내용들도 확인할 수 있다.

리스크(위험 수준)에 비해 수익이 효율적으로 나오는지 확인하는 지수인 샤프지수(Sharpe Ratio)와 소티노 비율(Sortino Ratio), 그리고 최대손실을 평균수익률에 대비한 칼마 비율(Calmar Ratio)도 확인할 수 있다.

Backtesting.py 기능들(optimize, 옵티마이즈)

Backtesting.py 라이브러리에서는 최적화(optimize) 기능도 제공한다. 전략 파라미터에 여러 숫자들을 대입해 최적의 수익을 내는 수치를 찾아낼 수 있는 것이다.

위에서 나의 전략은 '삼성전자(005930)를 가격 이동평균 20일선과 60일선이 크로스 하면 전량 매수, 전량 매도'이었다. 여기서 20일선과 60일선이 아닌 여러 숫자들을 대입해 제일 좋은 수익률을 찾아낸다.

stats = bt.optimize(n1=range(1, 60, 5),
                    n2=range(2, 120, 5),
                    maximize='Equity Final [$]',
                    constraint=lambda param: param.n1 < param.n2)

 

위 전략에서 삼성전자는 가격 이동평균 16일선과 47일선 크로스 매매가 가장 좋은 수익률을 낸다는 것을 optimize를 통해 확인할 수 있었다.

이전 20일선 60일선 크로스 매매 전략은 최고 수익률 320%, 현재 260% 수익을 기록했으나, optimize를 통해 발견한 16일선 47일선 크로스 매매 전략은 최고 수익률 418%, 현재 372% 수익을 기록했다.

같은 기간(2010년 1월 4일~2022년 7월 5일) 삼성전자의 수익률은 257.95% 수익률을 기록했으니, 최적화로 시장보다 상회하는 수익을 얻을 수 있을 것이다. 물론 과거의 데이터가 미래의 수익을 보장해 주지는 않는다.

 

마무리, 나만의 지표 백테스팅 수익률

 

많이 사용하는 RSI 지표나 MACD 지표 등은 Backtesting.py에서 제공하지 않는다. 공식 자료에서는 TA-Lib or Tulipy 를 이용할 것을 추천하고 있다.

그러나 이러한 지표를 제공하지 않는 것은 전혀 문제 될 것이 없다. 위에서 언급한 매우 직관적인 차트 시각화, 빠른 속도, 내장 옵티마이저 기능 등... 장점이 너무도 많다.

그리고 이 라이브러리를 사용하면서 나만의 지표를 만들었고 코스피 지수에 대입하여 백테스팅을 시도, 나름 괜찮은 수익률을 보여주었다.

투자 기간은 1996년 06월~2022년 07월까지, 코스피 지수 수익률은 160.61%(898.56->2,341.78)인 반면 동기간 나만의 지표는 최고 수익률 853%, 현재 786% 수익률을 기록했다.(숏포지션 매매까지 할 경우 1,073% 수익률) 좀 더 보완해서 실제 투자에도 적용할 수 있을지, 오류가 발생할 가능성에 대해 판단해보고 실전투자에 사용해 보도록 해야겠다.

반응형

관련글 더보기