레이블이 TA-lib인 게시물을 표시합니다. 모든 게시물 표시
레이블이 TA-lib인 게시물을 표시합니다. 모든 게시물 표시

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에 리스트로 관리하여 나중에 한꺼번에 그리게 됩니다.



2022년 1월 15일 토요일

TA-lib 설치하기 간단 사용기, python, talib, ta-lib

TA-Lib

TA-Lib은 금융 시장 데이터의 기술적 분석을 수행하는데 필요한 멀티플랫폼 라이브러리 입니다.


1. 공식 홈페이지

http://ta-lib.org/

https://mrjbq7.github.io/ta-lib/ Python wrapper


2. 설치 방법

python의 경우 pip로 설치가 되지 않습니다.


2.2 다른사람이 컴파일된 파일 사용

https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

자신의 python 버전과 같은 파일을 다운로드 해줍니다. 64bit는 amd64, 32bit는 win32

이것은 python을 실행시키면 어떤 python인지 나옵니다.

제가 사용하는 python은 64bit 3.8 입니다.

1
2
3
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^C

그래서 다음 파일을 다운로드 받았습니다. 

TA_Lib‑0.4.24‑cp38‑cp38‑win_amd64.whl

그리고 pip install <다운로드한 whl 파일> 을 적어줍니다.

pip install C:\Users\USER\Downloads\TA_Lib-0.4.24-cp38-cp38-win_amd64.whl
Processing c:\users\user\downloads\ta_lib-0.4.24-cp38-cp38-win_amd64.whl
Requirement already satisfied: numpy in c:\users\user\appdata\local\programs\python\python38\lib\site-packages (from TA-Lib==0.4.24) (1.19.5)
Installing collected packages: TA-Lib
Successfully installed TA-Lib-0.4.24



2.1 직접 컴파일하는 방법

2.1.1 컴파일러 설치

Windows라면 Visual Studio 를 설치해야합니다. 

링크가 새버전이 나오면 변경되는 경우가 많습니다. 무료 버전을 설치합니다.

https://visualstudio.microsoft.com/ko/downloads/ 여기에서 VC 설치합니다.

리눅스라면 g++ 컴파일러를 설치하면 됩니다.


2.1.2 소스 받기

소스는 https://ta-lib.org/hdr_dw.html 여기에서 받습니다.

Windows

Download ta-lib-0.4.0-msvc.zip and unzip to C:\ta-lib


Linux

Download ta-lib-0.4.0-src.tar.gz and:

$ untar and cd

$ ./configure --prefix=/usr

$ make

$ sudo make install

If you build TA-Lib using make -jX it will fail but that's OK! Simply rerun make -jX followed by [sudo] make install.


2.1.3 설치

pip install ta-lib


만약 2.1.2가 제대로 설치 안된 경우 오류 문구가 이렇습니다.

... 생략 ...

  _ta_lib.c

  talib/_ta_lib.c(680): fatal error C1083: Cannot open include file: 'ta_libc.h': No such file or directory

  error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

  ----------------------------------------

  ERROR: Failed building wheel for ta-lib



3. 간단 테스트

이동 평균을 구하는 간단한 테스트 입니다.

1
2
3
4
5
6
import numpy
import talib

close = numpy.random.random(100)
output = talib.SMA(close)
print(output)

random이라 수치는 변하지만 앞쪽에 데이터가 nan 으로 나오는것으로 보아 정상적으로 출력되었습니다.

[       nan        nan        nan        nan        nan        nan
        nan        nan        nan        nan        nan        nan
        nan        nan        nan        nan        nan        nan
        nan        nan        nan        nan        nan        nan
        nan        nan        nan        nan        nan 0.54678791
 0.57007161 0.58258517 0.60569491 0.59433131 0.58889661 0.58745031
 0.60175934 0.60535614 0.63403022 0.60845597 0.60211001 0.57738737
 0.55490891 0.536957   0.54230833 0.52856405 0.52749476 0.50920791
 0.52008813 0.50787048 0.49562483 0.47569089 0.49272626 0.49750908
 0.49134292 0.50854827 0.51223004 0.50155896 0.48841843 0.50848775
 0.50470717 0.49691073 0.49896802 0.5006335  0.4930974  0.47837944
 0.47318858 0.477317   0.45739367 0.47636315 0.47304526 0.50062967
 0.51889451 0.52806633 0.5283228  0.55600092 0.55185113 0.55855475
 0.55284348 0.56611087 0.57569171 0.57796734 0.5687871  0.579755
 0.56692988 0.55129066 0.53231503 0.5189919  0.51302749 0.49365671
 0.49553806 0.47400186 0.45729707 0.44564002 0.44066557 0.43706963
 0.42651171 0.42860744 0.43217339 0.42055159]

만약 제대로 설치되지 않았다면 import 시 오류가 발생합니다.


4. 사용하기+

어떤 함수가 존재하는지와 어떤 인자를 넘겨야할지 모를때에는 https://mrjbq7.github.io/ta-lib/ 여기의 function groups 링크를 이용합니다.

Function Groups


MACD의 경우

https://mrjbq7.github.io/ta-lib/func_groups/momentum_indicators.html 여기에서 찾을 수 있습니다.

MACD - Moving Average Convergence/Divergence

macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)