2019년 9월 10일 화요일

Zipline 백테스팅


Zipline은 알고리즘 트레이딩 라이브러리로서 백테스팅 기능을 제공합니다
Zipline 은 quantopian 에서 만든 오픈소스이다.

quantopian
https://www.quantopian.com/

zipline
https://github.com/quantopian/zipline

기본 사용법
https://www.zipline.io/beginner-tutorial

conda 를 통한 가상환경 설정....

집라인은 python 3.5 버전까지 지원하여,
최신버전(3.7)에서는 conda env 를 통하여 3.5버전을 사용하면 쉽게 할수 있다.

$ conda create -n py35 python=3.5 anaconda
마지막에 anaconda 는 아나콘다 페키지를 설치 하는듯함.


env list
$ conda env list

env 활성화
$ conda activate 이름

env 삭제
$ conda env remove -n 이름


1. 설치 ( os: ubuntu 18.04 ) (콘다를 이용하여 설치 하는것을 추천함.)
conda env 를 통하여 3.5 python 환경을 만들자.
$ conda create -n zipline_env python=3.5

- install with pip
$ pip install zipline

- pip uninstall 페키지
$ pip uninstall (페키지명)

https://www.zipline.io/install 에 보면 pip 를 사용하여 설치 하는것이 복잡하다고 나와있다.
자세한 사항은 링크를 통해 확인 필요합니다.
(설치는 되는데 아무것도 안되는듯 하다...)

- install with conda
$ conda install -c Quantopian zipline

conda install 로 하면 zipline 에서 필요한 페키지 들을
- conda version 4.7.11 에서 문제가 있는 듯 // https://github.com/quantopian/zipline/issues/2514 )
- conda version 4.7.12 에서는 설치 됨.

conda 페키지 설치 (해당 버전)
$ conda install 페키지이름=버전이름
$ conda install -c conda-forge 페키지이름=버전이름

conda 페키지 삭제
$ conda remove 페키지이름





2. Tutorial

import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt
from zipline.api import order, symbol
from zipline.algorithm import TradingAlgorithm

# datastart = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2016, 3, 19)
data = web.DataReader("AAPL", "yahoo", start, end)

data = data[['Adj Close']]
data.columns = ['AAPL']
data = data.tz_localize('UTC')


def initialize(context):
    pass

def handle_data(context, data):
    order(symbol('AAPL'), 1)


algo = TradingAlgorithm(initialize=initialize, handle_data=handle_data)
result = algo.run(data)

plt.plot(result.index, result.portfolio_value)
plt.show()




참고: https://wikidocs.net/4429

zipline 1.3.0 기준입니다.
위와 같이 하면 아래와 같은 에러가 나옴.


$ /home/kj/anaconda3/envs/zipline/bin/python /home/kj/PycharmProjects/stock/zipline_.py

        Traceback (most recent call last):
        File "/home/kj/PycharmProjects/stock/zipline_.py", line 40, in <module>

    algo = TradingAlgorithm(initialize=initialize, handle_data=handle_data)
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/site-packages/zipline/algorithm.py", line 279, in __init__
            self.trading_environment = TradingEnvironment()
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/site-packages/zipline/finance/trading.py", line 103, in __init__
            self.bm_symbol,            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/site-packages/zipline/data/loader.py", line 149, in load_market_data
            environ,            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/site-packages/zipline/data/loader.py", line 216, in ensure_benchmark_data
            data = get_benchmark_returns(symbol)
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/site-packages/zipline/data/benchmarks.py", line 35, in get_benchmark_returns
            data = r.json()
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/site-packages/requests/models.py", line 897, in json
            return complexjson.loads(self.text, **kwargs)
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/json/__init__.py", line 319, in loads
            return _default_decoder.decode(s)
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/json/decoder.py", line 339, in decode
            obj, end = self.raw_decode(s, idx=_w(s, 0).end())
            File "/home/kj/anaconda3/envs/zipline/lib/python3.5/json/decoder.py", line 357, in raw_decode
            raise JSONDecodeError("Expecting value", s, err.value) from None
            json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)


json.decoder.JSONDecodeError 의 에러 가 난다.
해당 에러는 아래 링크를 통해 해결해 볼수 있을 것 같다.

https://github.com/quantopian/zipline/issues/2480

https://blog.naver.com/rhgkrsus1/221621557450

윗 링크에 따르면,
Zipline에서 benchmark.py 통하여 데이터를 받아오는 것에 실패
-> None 를 Json으로 전달해서 에러가 나는 것으로 보여진다.

해당 에러를 고치는 방법은

1.  https://iextrading.com/developer/#sunset-schedule 회원 가입(무료), PUBLISHABLE 토큰을 받는다.












2. zipline 이 설치 되어 있는 폴더에서 zipline\data\benchmark.py 파일을 열어서

    r = requests.get(
        'https://api.iextrading.com/1.0/stock/{}/chart/5y'.format(symbol)
    )

해당 소스를 수정한다.

~~ 요기서 중요~~~

conda 가상환경을 사용중이라면

anaconda 설치 폴더에 가상 envs 라는 폴더안에 있는 zipline 에서 수정해야 한다

ex) 우분투 anaconda3/envs/(가상환경이름)/lib/python3.5/site-packages/zipline/data/benchmarks.py


IEX_KEY = '키키키키키키키'
r = requests.get(
"https://cloud.iexapis.com/stable/stock/{}/chart/5y?chartCloseOnly=True&token={}".format(symbol, IEX_KEY)
)

# r = requests.get(
#     'https://api.iextrading.com/1.0/stock/{}/chart/5y'.format(symbol)
# )


해당 파일을 수정 하고 실행 하면 정상적으로 동작한다..




















마지막 수정 : 19년 11월 08일



댓글 3개:

  1. IEX API 토큰까지는 수정을 했는데 하기와 같은 error가 발생합니다.
    혹시 어떤 문제인지 아시나요? ;;

    File "D:\Anaconda3\envs\py35\lib\site-packages\pandas\io\parsers.py", line 1807, in _set
    x = names.index(x)
    ValueError: 'Time Period' is not in list

    답글삭제
    답글
    1. 저도 이러한 문제가 발생되었는데 어찌 해결하셨는지요?

      삭제