2022년 1월 23일 일요일

backtesting.py 에서 TA-Lib 사용하기

 

TA-lib 은 금융 시장 데이터의 기술적 분석을 수행하는데 필요한 라이브러리가 이미 준비가 되어있습니다. 이것을 backtesting.py에서는 어떻게 사용하는지에 대한 예제입니다.


예제에서는 대표적으로 MACD와 CDLBELTHOLD라는 차트를 그려보도록 하겠습니다. 기본 소스에서 추가하는 부분은 Stragegy클래스의 I메소드를 사용 하면 됩니다. 실제 내부에서 사용하느냐 안하느냐는 관계 없습니다. 이때 MACD나 CDLBELTHOLD는 TA-Lib에서 준비된 함수이며, 인자는 아래 링크를 사용해서 적절히 변경해줍니다.

https://swlock.blogspot.com/2022/01/ta-lib-python-talib-ta-lib.html

아래 소스에서는 16, 20 라인입니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy
import talib

from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA, GOOG

class SmaCross(Strategy):
	def init(self):
		price = self.data.Close
		self.ma1 = self.I(SMA, price, 10)
		self.ma2 = self.I(SMA, price, 20)
		
		#https://mrjbq7.github.io/ta-lib/func_groups/momentum_indicators.html
		#macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
		self.macd, self.macdsignal, self.macdhist = self.I(talib.MACD, self.data.Close, fastperiod=12, slowperiod=26, signalperiod=9)
		
		#https://mrjbq7.github.io/ta-lib/func_groups/pattern_recognition.html
		#integer = CDLBELTHOLD(open, high, low, close)
		self.CDLBELTHOLD = self.I(talib.CDLBELTHOLD, self.data.Open, self.data.High, self.data.Low, self.data.Close)

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


bt = Backtest(GOOG, SmaCross, commission=.002,
			  exclusive_orders=True)
stats = bt.run()
bt.plot()

print(stats)


출력되는 그래프를 살펴보면 제일 하단에 그래프가 추가됨을 알 수 있습니다.



I 메소드에 의해 그래프를 그리는 관련 코드

https://github.com/kernc/backtesting.py/blob/master/backtesting/backtesting.py

함수의 앞부분

    def I(self,  # noqa: E741, E743

          func: Callable, *args,

          name=None, plot=True, overlay=None, color=None, scatter=False,

          **kwargs) -> np.ndarray:


함수의 끝 부분 여기에 정의 되어있습니다.

....

        value = _Indicator(value, name=name, plot=plot, overlay=overlay,

                           color=color, scatter=scatter,

                           # _Indicator.s Series accessor uses this:

                           index=self.data.index)

        self._indicators.append(value)

함수들의 인자를 읽어들여 self._indicators에 리스트로 관리하여 나중에 한꺼번에 그리게 됩니다.



댓글 없음:

댓글 쓰기