[컴퓨터] 경제적 독립하기/[투자] Project tatabox

파이썬 백테스팅 패키지 (backtesting.py)

Bright_Ocean 2021. 8. 22. 11:51
반응형

backtesting 을 수행할 수 있는 backtesting.py 패키지에 대하여 알아보자


최근 변동성을 어떤 식으로 표현하는지에 관심이 생겨

일명 공포지수라고 불리는 VIX에 관해 공부를 하던 중

흥미로운 파이썬 패키지를 발견하여 한번 튜도리얼을 따라해보았다

 

https://kernc.github.io/backtesting.py/doc/backtesting/#gsc.tab=0

 

backtesting API documentation

Package backtesting Manuals Tutorials These tutorials are also available as live Jupyter notebooks: In Colab, you might have to !pip install backtesting. Example Strategies Tip For an overview of recent changes, see What's New. FAQ Some answers to frequent

kernc.github.io

이 포스팅은 백테스팅 패키지에 나온 튜토리얼을 그대로 이용하였음을 밝힌다.

 

 

결과적으로! 아래의 plot을 보자

 

 

나의 전략을 코드화 해서 넣으면, 이전의 데이터들을 이용하여

백테스팅을 해주고 결과를 시각적으로 볼 수 있을 뿐만 아니라

각각 position들의 통계들도 살펴볼 수 있다. (AWESOME!)

이제 호주 ETF들로 백테스팅을 해볼 수 있으려나? 굿굿..!

 

그렇다면 tutorial을 따라 진행하면서 백테스팅 패키지가 어떤식으로 진행되는지 살펴보자.

 

 

우선 백테스팅을 이용하기 위해서 당연히 주식이 되든 코인이 되든... 시간에 따른 가격 데이터가 필요하다.

시가, 종가, 고가, 저가 (Open, Close, High, Low)를 모은 데이터를 OHLC 데이터라고 부르고 이 OHLC 형테의 데이터를 인풋으로 넣어준다.

 

 

하지만, 이 패키지는 그런 정보들까지 제공해 주지 않는다

(사람마다 다 다른 주식정보가 필요할테니까 당연한 소리이다)

이러한 정보를 얻기 위해서 이 패키지에서는 

아래의 패키지 들을 소개하고 있다 이 패키지들에 대해서는

좀 더 공부를 하고 포스팅 할 계획에 있다.

 

https://www.quandl.com/tools/python

 

Quandl

The source for financial, economic, and alternative datasets, serving investment professionals.

www.quandl.com

https://github.com/cuemacro/findatapy

 

GitHub - cuemacro/findatapy: Python library to download market data via Bloomberg, Eikon, Quandl, Yahoo etc.

Python library to download market data via Bloomberg, Eikon, Quandl, Yahoo etc. - GitHub - cuemacro/findatapy: Python library to download market data via Bloomberg, Eikon, Quandl, Yahoo etc.

github.com

 

튜토리얼에 필요한 데이터셋은 기본적으로 패키지에서 제공해주는 google 데이터셋을 이용하면 되서

편하게 따라해 볼 수 있었다.

 

 

데이터는 기본적인 pandas dataframe 형태로 변환하면 되며,

row index를 datatime index로 가져야하는데 이는 (pd.to_datatime) 함수로 쉽게 변환할 수 있다.

 

 

자 이제 시간에 따른 가격데이터가 생겼다면 나만의 투자 전략을 코드화하면 된다.

다만, 이 패키지는 trading indicator들을 (이동평균선 이런것들...) 내장하고 있지 않기 때문에

직접 코드화 하거나 기본적인 indicator들은 아래의 패키지들에서 가져오라고 추천하고 있다.

 

https://github.com/mrjbq7/ta-lib

 

GitHub - mrjbq7/ta-lib: Python wrapper for TA-Lib (http://ta-lib.org/).

Python wrapper for TA-Lib (http://ta-lib.org/). Contribute to mrjbq7/ta-lib development by creating an account on GitHub.

github.com

https://tulipindicators.org/

 

Tulip Indicators Open-Source Technical Analysis Indicator Library - Tulip Indicators

Tulip Indicators (TI) is a library of functions for technical analysis of financial time series data. It is written in ANSI C for speed and portability. Bindings are available for many other programming languages too. Tulip Indicators is intended for progr

tulipindicators.org

 

둘러보니 기본적인 MA(이동평균) 부터 Momentum indicator, Volume indicator, Volatility indicator 같은 어지간한 

주식 HTS에서 넣을 수 있는 지표들은 다 있기 때문에 편하게 끌어와서 이용 하면 될 것 같다.

나중에 전략을 새로 짜서 만들게 되면 사용법들도 함께 포스팅 하겠다.

 

 

자 이제까지 우리는 

가격데이터를 모으고, 지표를 적용시킬 수 있는 알고리즘들을 끌어왔다.

즉, HTS에서 주식창을 열고, 지표들을 선택하는 행위를 한것과 유사하다.

이제 원하는 지표들을 잘 버무려서 전략을 코드화하는 과정을 수행해보자.

 

백테스팅 패키지에서는 이 과정을 

Strategy 라는 class를 이용한다. 이 class 안에는 두개의  메소드를 포함하게 되는데

init() 과 next()이다.

코드의 구조를 보면서 살펴보자.

중요! 이 코드는 내가 작성한 것이 아니다. 튜토리얼에 있는 코드를 일부 참조한 것이다.

형태만 살펴보자.

 

https://kernc.github.io/backtesting.py/doc/examples/Quick%20Start%20User%20Guide.html

 

우선 데이터들의 파라미터를 설정해 준 뒤 (이 부분은 최적화 해서 구할 수 있다.)

init() 함수 안에는 indicator (위의 TA-lab 이나 tulipy 에서 가져온) 를 넣어준다.

중요한 점은 indicator 들을 self.I()로 감싸준다는 것이다.

 

self.I('지표', '종가', '파라미터')의 형태가 된다.

 

여기서 파라미터는 이동평균선을 예로들면 몇일간격의 이동평균선을 이용할것인지를 의미한다.

 

 

next() 함수 안에는 지표를 이용한 전략과, 포지션등의 설정을 한다.

위의 참고 전략은 이동평균선의 crossover시 구매하는 것을 담고 있는데,

언제든지 다양한 전략을 코드화하여 사용할 수 있고.

이부분이 트레이더의 창의성과 아이디어가 반짝일 수 있는 부분일 것이다.

 

 

자. 이제 전략을 다 만들었고 이제 실제로 백테스팅을 명령하는 함수를 불러보자.

 

https://kernc.github.io/backtesting.py/doc/examples/Quick%20Start%20User%20Guide.html

 

이는 Backtest 함수를 이용하여 콜하면 되며, 구매하고자 하는 unit수,

브로커에게 뜯기는 커미션의 % 등의 현식적인 부분을 설정할 수있다.

 

 

결과를 살펴보라 매우 흥미롭다. 

return뿐만 아니라 변동성, 내가 얼마나 깨질 수 있을 지 알 수있는 drawdown 까지

한번에 제공해 줄 뿐만아니라 plot() 함수를 이용하면

포스팅 맨위의 plot과 같이 시각적으로 나타낼 수 있다.

 

 

정리하자면 아래와 같이 나타낼 수 있다.

 

#주가 데이터 불러오기
#Quandl 이나 findatapy 이용하기
#데이터 형태는 pandas dataframe! with datatime row index!!

#Strategy 작성

from backtesting import Strategy
class '전략이름'(Strategy):
	파라미터 value 설정
    
    def init(self):
    	#지표는 TA-Lib 이나 Tulipy에서 불러오자
    	self.지표 = self.I(지표, 종가(혹은 시가, 고가, 저가 중 필요한 것), 파라미터 value)
        
    def next(self):
    	if 내가 원하는 진입 조건:
        	self.buy() 포지션 진입!!!!!!
        elif 탈출 조건:
        	self.sell() 포지션 탈출!!!!!
            

#백테스팅 콜하기
#진입 unit수는 기입안하면 최대한 많은 포지션이 들어감 
from backtesting import Backtest

bt = Backtest(주가데이터, 전략(위에서만든 '전략이름', cash = 진입 unit수 (주식 수), 
commission = 거래세 etc..(거래시 뜯기는 돈))
#통계 수치들을 보고싶다면
stats = bt.run()
stats
#시각적으로 나타내려면
bt.plot()

한국어로 적은 부분을 수정하면 된다.

 

반응형