Skip to main content

A Pythonic backtester for trading algorithms

Project description

Installation

Used packages and environment

  • Main package: Zipline
  • Python 3.8 or above (currently support up to 3.11)
  • Microsoft Windows OS or macOS or Linux
  • Other Python dependency packages: Pandas, Numpy, Logbook, Exchange-calendars, etc.

How to install Zipline Reloaded modified by TEJ

  • We're going to illustrate under anaconda environment, so we suggest using Anaconda as development environment.

  • Download dependency packages.

  1. Windows (zipline-tej.yml)

  2. Mac (zipline-tej_mac.yml)

  • Start an Anaconda (base) prompt, create an virtual environment and install the appropriate versions of packages: (We strongly recommand using virtual environment to keep every project independent.) (reason)
Windows Users
# change directionary to the folder exists zipline-tej.yml
$ cd <C:\Users\username\Downloads>

# create virtual env
$ conda env create -f zipline-tej.yml

# activate virtual env
$ conda activate zipline-tej
Mac Users
# change directionary to the folder exists zipline-tej_mac.yml
$ cd <C:\Users\username\Downloads>

# create virtual env
$ conda env create -f zipline-tej_mac.yml

# activate virtual env
$ conda activate zipline-tej

Also, if you are familiar with Python enough, you can create a virtual environment without zipline-tej.yml and here's the sample :

# create virtual env
$ conda create -n <env_name> python=3.10

# activate virtual env
$ conda activate <env_name>

# download dependency packages
$ pip install zipline-tej

While encountering environment problems, we provided a consistent and stable environment on Docker hub.

For users that using docker, we briefly introduce how to download and use it.

First of all, please download and install docker-desktop.


1. Start docker-desktop. (Registration is not must.)

2. Select the "images" on the leftside and search "tej87681088/tquant" and click "Pull".

3. After the image was downloaded, click the "run" icon the enter the optional settings.

3-1. Contaner-name: whatever you want.

3-2. Ports: the port to connect, "8888" is recommended.

3-3. Volumes: the place to store files. (You can create volume first on the left side.)

e.g. created a volume named "data", host path enter "data", container path "/app" is recommended.

4. Select the "Containers" leftside, the click the one which its image name is tej87681088/tquant

5. In its "Logs" would show an url like 
http://127.0.0.1:8888/tree?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

6. Go to your browser and enter "http://127.0.0.1:<port_you_set_in_step_3-2>/tree?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

6-1. If your port is 8888, you can just click the hyperlink.

7. Start develop your strategy!

NOTICE: Next time, we just need to reproduce step4 to step6.

Quick start

CLI Interface

The following code implements a simple buy-and-hold trading algorithm.

from zipline.api import order, record, symbol

def initialize(context):
    context.asset = symbol("2330")
    
def handle_data(context, data):
    order(context.asset, 10)
    record(TSMC=data.current(context.asset, "price"))
    
def analyze(context=None, results=None):
    import matplotlib.pyplot as plt

    # Plot the portfolio and asset data.
    ax1 = plt.subplot(211)
    results.portfolio_value.plot(ax=ax1)
    ax1.set_ylabel("Portfolio value (TWD)")
    ax2 = plt.subplot(212, sharex=ax1)
    results.TSMC.plot(ax=ax2)
    ax2.set_ylabel("TSMC price (TWD)")

    # Show the plot.
    plt.gcf().set_size_inches(18, 8)
    plt.show()

You can then run this algorithm using the Zipline CLI. But first, you need to download some market data with historical prices and trading volumes:

  • Before ingesting data, you have to set some environment variables as follow:
# setting TEJAPI_KEY to get permissions loading data
$ set TEJAPI_KEY=<your_key>
$ set TEJAPI_BASE=https://api.tej.com.tw

# setting download ticker
$ set ticker=2330 2317

# setting backtest period
$ set mdate=20200101 20220101

  • Ingest and run backtesting algorithm
$ zipline ingest -b tquant
$ zipline run -f buy_and_hold.py  --start 20200101 --end 20220101 -o bah.pickle --no-benchmark --no-treasury 

Then, the resulting performance DataFrame is saved as bah.pickle, which you can load and analyze from Python.

More useful zipline commands

Before calling zipline in CLI, be sure that TEJAPI_KEY and TEJAPI_BASE were set. Use zipline --help to get more information.

For example : We want to know how to use zipline run, we can run as follow:

zipline run --help

Usage: zipline run [OPTIONS]
  Run a backtest for the given algorithm.

Options:
  -f, --algofile FILENAME         The file that contains the algorithm to run.
  -t, --algotext TEXT             The algorithm script to run.
  -D, --define TEXT               Define a name to be bound in the namespace
                                  before executing the algotext. For example
                                  '-Dname=value'. The value may be any python
                                  expression. These are evaluated in order so
                                  they may refer to previously defined names.
  --data-frequency [daily|minute]
                                  The data frequency of the simulation.
                                  [default: daily]
  --capital-base FLOAT            The starting capital for the simulation.
                                  [default: 10000000.0]
  -b, --bundle BUNDLE-NAME        The data bundle to use for the simulation.
                                  [default: tquant]
  --bundle-timestamp TIMESTAMP    The date to lookup data on or before.
                                  [default: <current-time>]
  -bf, --benchmark-file FILE      The csv file that contains the benchmark
                                  returns
  --benchmark-symbol TEXT         The symbol of the instrument to be used as a
                                  benchmark (should exist in the ingested
                                  bundle)
  --benchmark-sid INTEGER         The sid of the instrument to be used as a
                                  benchmark (should exist in the ingested
                                  bundle)
  --no-benchmark                  If passed, use a benchmark of zero returns.
  -bf, --treasury-file FILE       The csv file that contains the treasury
                                  returns
  --treasury-symbol TEXT          The symbol of the instrument to be used as a
                                  treasury (should exist in the ingested
                                  bundle)
  --treasury-sid INTEGER          The sid of the instrument to be used as a
                                  treasury (should exist in the ingested
                                  bundle)
  --no-treasury                   If passed, use a treasury of zero returns.
  -s, --start DATE                The start date of the simulation.
  -e, --end DATE                  The end date of the simulation.
  -o, --output FILENAME           The location to write the perf data. If this
                                  is '-' the perf will be written to stdout.
                                  [default: -]
  --trading-calendar TRADING-CALENDAR
                                  The calendar you want to use e.g. TEJ_XTAI.
                                  TEJ_XTAI is the default.
  --print-algo / --no-print-algo  Print the algorithm to stdout.
  --metrics-set TEXT              The metrics set to use. New metrics sets may
                                  be registered in your extension.py.
  --blotter TEXT                  The blotter to use.  [default: default]
  --help                          Show this message and exit.

Difference of tquant and fundamentals

  • Basically, tquant is the one that only contain OHLCV and cash dividend date. And fundamentals is the data that exclude from OHLCV, like EPS, gross margin, operating income, etc.

  • So in both fundamentals and tquant, we can add tickers as follow :

Add tickers

$ zipline add -t "<ticker_wants_to_add>"

If tickers are more than 1 ticker, split them apart by " " or "," or ";".

[fundamentals only] Add fields

$ zipline add -f "<field_wants_to_add>"
  • NOTICE that you CAN'T add field and ticker simultaneously.

For more detail use zipline add --help .

Display bundle-info

$ zipline bundle-info

To show what the tickers are there in newest bundle.

For more detail use zipline bundle-info --help .

Switch bundle

Before using switch, use zipline bundles to get the timestamp of each folder.

$ zipline switch -t "<The_timestamp_of_the_folder_want_to_use>"

Due to zipline only using the newest folder, switch can make previous folder become newest.

For more detail use zipline switch --help .

Update bundle

  • You can either update tquant or fundamentals by using -b to select which one you want to update the bundle information to newest date.[DEFAULT:tquant]
$ zipline update -b tquant
$ zipline update -b fundamentals

For more detail use zipline update --help .

Jupyter Notebook

Change Anaconda kernel

  • Since we've downloaded package "nb_conda_kernels", we should be able to change kernel in jupyter notebook.

How to new a notebook using specific kernel

(1) Open anaconda prompt

(2) Enter the command as follow :

# First one can be ignore if already in environment of zipline-tej
$ conda activate zipline-tej 
# start a jupyter notebook
$ jupyter notebook 

(3) Start a notebook and select Python[conda env:zipline-tej]

(4)(Optional) If you have already written a notebook, you can open it and change kernel by clicking the "Kernel" in menu and "Change kernel" to select the specfic kernel.

Set environment variables TEJAPI_KEY, ticker and mdate

* ticker would be your target ticker symbol, and it should be a string. If there're more than one ticker needed, use " ", "," or ";" to split them apart.

* mdate refers the begin date and end date, use " ", "," or ";" to split them apart.

In[1]:
import os    
os.environ['TEJAPI_KEY'] = <your_key>    
os.environ['ticker'] ='2330 2317'     
os.environ['mdate'] ='20200101 20220101'  

Call ingest to download data to ~\.zipline

In[2]:    
!zipline ingest -b tquant
[Out]: 
Merging daily equity files:
[YYYY-MM-DD HH:mm:ss.ssssss] INFO: zipline.data.bundles.core: Ingesting tquant.

Design the backtesting strategy

In[3]:
from zipline.api import order, record, symbol

def initialize(context):
    context.asset = symbol("2330")
    
def handle_data(context, data):
    order(context.asset, 10)
    record(TSMC=data.current(context.asset, "price"))
    
def analyze(context=None, results=None):
    import matplotlib.pyplot as plt

    # Plot the portfolio and asset data.
    ax1 = plt.subplot(211)
    results.portfolio_value.plot(ax=ax1)
    ax1.set_ylabel("Portfolio value (TWD)")
    ax2 = plt.subplot(212, sharex=ax1)
    results.TSMC.plot(ax=ax2)
    ax2.set_ylabel("TSMC price (TWD)")

    # Show the plot.
    plt.gcf().set_size_inches(18, 8)
    plt.show()

Run backtesting algorithm and plot

In[4]:
from zipline import run_algorithm
import pandas as pd
from zipline.utils.calendar_utils import get_calendar
trading_calendar = get_calendar('TEJ_XTAI')

start = pd.Timestamp('20200103', tz ='utc' )
end = pd.Timestamp('20211230', tz='utc')

result = run_algorithm(start=start,
                  end=end,
                  initialize=initialize,
                  capital_base=1000000,
                  handle_data=handle_data,
                  bundle='tquant',
                  trading_calendar=trading_calendar,
                  analyze=analyze,
                  data_frequency='daily'
                  )
[Out]:

output

Show trading process

In[5]: 
result
[Out]:
period_open period_close starting_value ending_value starting_cash ending_cash portfolio_value longs_count shorts_count long_value ... treasury_period_return trading_days period_label algo_volatility benchmark_period_return benchmark_volatility algorithm_period_return alpha beta sharpe
2020-01-03 05:30:00+00:00 2020-01-03 01:01:00+00:00 2020-01-03 05:30:00+00:00 0.0 0.0 1.000000e+06 1.000000e+06 1.000000e+06 0 0 0.0 ... 0.0 1 2020-01 NaN 0.0 NaN 0.000000 None None NaN
2020-01-06 05:30:00+00:00 2020-01-06 01:01:00+00:00 2020-01-06 05:30:00+00:00 0.0 3320.0 1.000000e+06 9.966783e+05 9.999983e+05 1 0 3320.0 ... 0.0 2 2020-01 0.000019 0.0 0.0 -0.000002 None None -11.224972
2020-01-07 05:30:00+00:00 2020-01-07 01:01:00+00:00 2020-01-07 05:30:00+00:00 3320.0 6590.0 9.966783e+05 9.933817e+05 9.999717e+05 1 0 6590.0 ... 0.0 3 2020-01 0.000237 0.0 0.0 -0.000028 None None -10.038514
2020-01-08 05:30:00+00:00 2020-01-08 01:01:00+00:00 2020-01-08 05:30:00+00:00 6590.0 9885.0 9.933817e+05 9.900850e+05 9.999700e+05 1 0 9885.0 ... 0.0 4 2020-01 0.000203 0.0 0.0 -0.000030 None None -9.298128
2020-01-09 05:30:00+00:00 2020-01-09 01:01:00+00:00 2020-01-09 05:30:00+00:00 9885.0 13500.0 9.900850e+05 9.867083e+05 1.000208e+06 1 0 13500.0 ... 0.0 5 2020-01 0.001754 0.0 0.0 0.000208 None None 5.986418
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2021-12-24 05:30:00+00:00 2021-12-24 01:01:00+00:00 2021-12-24 05:30:00+00:00 2920920.0 2917320.0 -1.308854e+06 -1.314897e+06 1.602423e+06 1 0 2917320.0 ... 0.0 484 2021-12 0.232791 0.0 0.0 0.602423 None None 1.170743
2021-12-27 05:30:00+00:00 2021-12-27 01:01:00+00:00 2021-12-27 05:30:00+00:00 2917320.0 2933040.0 -1.314897e+06 -1.320960e+06 1.612080e+06 1 0 2933040.0 ... 0.0 485 2021-12 0.232577 0.0 0.0 0.612080 None None 1.182864
2021-12-28 05:30:00+00:00 2021-12-28 01:01:00+00:00 2021-12-28 05:30:00+00:00 2933040.0 2982750.0 -1.320960e+06 -1.327113e+06 1.655637e+06 1 0 2982750.0 ... 0.0 486 2021-12 0.233086 0.0 0.0 0.655637 None None 1.237958
2021-12-29 05:30:00+00:00 2021-12-29 01:01:00+00:00 2021-12-29 05:30:00+00:00 2982750.0 2993760.0 -1.327113e+06 -1.333276e+06 1.660484e+06 1 0 2993760.0 ... 0.0 487 2021-12 0.232850 0.0 0.0 0.660484 None None 1.243176
2021-12-30 05:30:00+00:00 2021-12-30 01:01:00+00:00 2021-12-30 05:30:00+00:00 2993760.0 2995050.0 -1.333276e+06 -1.339430e+06 1.655620e+06 1 0 2995050.0 ... 0.0 488 2021-12 0.232629 0.0 0.0 0.655620 None None 1.235305

488 rows × 38 columns


More Zipline Tutorials

Suggestions

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

zipline_tej-2.0.0rc4-cp311-cp311-win_amd64.whl (4.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

zipline_tej-2.0.0rc4-cp311-cp311-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

zipline_tej-2.0.0rc4-cp311-cp311-macosx_10_15_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

zipline_tej-2.0.0rc4-cp310-cp310-win_amd64.whl (4.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

zipline_tej-2.0.0rc4-cp310-cp310-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

zipline_tej-2.0.0rc4-cp310-cp310-macosx_10_15_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

zipline_tej-2.0.0rc4-cp39-cp39-win_amd64.whl (4.1 MB view details)

Uploaded CPython 3.9 Windows x86-64

zipline_tej-2.0.0rc4-cp39-cp39-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

zipline_tej-2.0.0rc4-cp39-cp39-macosx_10_15_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

zipline_tej-2.0.0rc4-cp38-cp38-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.8 Windows x86-64

zipline_tej-2.0.0rc4-cp38-cp38-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

zipline_tej-2.0.0rc4-cp38-cp38-macosx_10_15_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file zipline_tej-2.0.0rc4-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3a5428e2e48d64633468232807678744b19f4fd023e2190b99e34127918471ea
MD5 6584e74e44d21e393b4bb21b9b586c68
BLAKE2b-256 7dc592c16ea29c1990f2372e9b3bcb6d64379c5b01b88059850248fb0971069b

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ff3cb44aa2bb6501e919eb273976b30ca4e21c074fdea87f86cf5f6b57290de
MD5 72f4a70ca493a1454954b290fa65cc6d
BLAKE2b-256 1e5bcdf7b38e5cb0f34866a2b8e9d48510818827b74b443a622a2333f9730357

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 41d6e51ba2c49d8703b03cc268c053d3db204dad75b344856f4c442fb7473cf9
MD5 7033057cbc34f9a70f6406227c7af36d
BLAKE2b-256 da7dd14e2d8b90ded9d6cc6662317ca050343d3e4a58c6ac0d808d0c3c8890c3

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3ba522059118712db0bdd0d486cbb20a6e4ed56dce596787b27f02069140665e
MD5 a4b6cc289c9d49d8036402d5042e02e1
BLAKE2b-256 6af21b1f07566eb115317df19df459668f974c15d8a4e90d7aba8d71db990dce

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b148d77618dd345a9c3a8b6f19884a6ff3e60c84b2a759635a3f48ccc5f6cc7f
MD5 4b2dd6cab4b5cd79fcc845eaf4cb91ba
BLAKE2b-256 8ee846df67b65c7e81e55cce2f0a625cde99405d0e1f6683a35dc54b6affe1c7

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 fe3832adeca32a7e2c2ff1107638c483a33432fe2eda2496129c227686ad1804
MD5 25eba15a869ccc592cb1bc42a5e43f26
BLAKE2b-256 b8e122fd6f1ee0956409c5ff78a68b507d6f11d4f28681e4588da617a1bed87e

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1391adcb06009194acc167b31f3b8a9e5f83d211db5170e553e414c9de59e7e2
MD5 d304dcf23a0ca844bc57621cbf7f5abb
BLAKE2b-256 d7ac75a7727a3f3413608bd7515355f251d187a1e7493bb2c622e0a3bc49964d

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2ae1292b0fab1319c2bcb92b014b33ce2f09129dcb26e9f9d86a5abd46159317
MD5 6fdbd0b36f8e8d1cae558e5e3729206f
BLAKE2b-256 4c8794446052c80f27173290cc9eea329cc8298a84ea8cf57b88fc3faea914c6

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 38af3cfc08662a353f5d936406d0fa4acc339d6fa99cbddde5126478b98a1d2d
MD5 a46abeab8ca7964f350fd7eb6940d6b5
BLAKE2b-256 2e99a7f18ba2dc94c6ec43d2601fd5236cdfd4d00148ff5978a9ea7056e108e4

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 213d6b3ef813478889ebd3953b2bf72a6d216d4d9a761da20d9109c165986dc1
MD5 9d58ec38bd879a4cc204c4a89627b507
BLAKE2b-256 f568ed061b02fd7b02d7f95ce2ed5bba48ad1d604b89a5779ae79358af3c7f3a

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 369c9fad39d5f821d1eff6c5da931227aba62c0225fd7a87559c64f4aa46bf1a
MD5 68c8726b6ab823ffe19eff41072f32e2
BLAKE2b-256 b9bdee88f815849578b613ba91ee484736b3e21154d17b49873b55e103bc3654

See more details on using hashes here.

File details

Details for the file zipline_tej-2.0.0rc4-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc4-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f0df88d50765925c03c89174d42fa0a25b65df961fc32e42a3c4c2e25bd393e9
MD5 be41922257df857b5c3d0c1aad15ee6f
BLAKE2b-256 e4a67f12e3dd9a00ab379f70a1d7385ce9b3ffa5dc47731db161af64c779fc7a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page