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.0rc2-cp311-cp311-win_amd64.whl (4.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

zipline_tej-2.0.0rc2-cp311-cp311-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

zipline_tej-2.0.0rc2-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.0rc2-cp310-cp310-win_amd64.whl (4.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

zipline_tej-2.0.0rc2-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.0rc2-cp39-cp39-win_amd64.whl (4.1 MB view details)

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 macOS 11.0+ ARM64

zipline_tej-2.0.0rc2-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.0rc2-cp38-cp38-win_amd64.whl (4.2 MB view details)

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 macOS 11.0+ ARM64

zipline_tej-2.0.0rc2-cp38-cp38-macosx_10_15_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 77c4a39f086f7b9bb189aec2e90c39386745a3bb9a3a61326bd62babb66ef287
MD5 d99b3a18f2c722b7372a32233e1aba8b
BLAKE2b-256 8b5dc7069a64a07a5fb8ddaf01daf3479c85355e95c4a4402bad6ec39e523c40

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bdb7f98ecc878e2f261ffac09b8317f89760403a4b47e69369bd1b289b74f460
MD5 eab26237583cc0749e5201c172278108
BLAKE2b-256 d81516c057b97a746f698d6505e26d76a9ed1165d210cd90e928ea09e16a7b01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 500f93f5b27673a3d7b882d60a8cf5ae02fd9fa6f4efc1ea3268dafbbd8eae2d
MD5 41b88bf62d89a027af8ddf8ab85aef4f
BLAKE2b-256 b8d18832b687b8072ae954fa1d07c181802a0003d19b197c170d6e2b27474b1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d2673deed0f29a8bcfad03edb9a7925a95b9de94665f0bbc05e61b46c03ae3a7
MD5 fa9c869ecdb9ecb201eb1425aa3d21fa
BLAKE2b-256 4fe8f86d09b8a06391f971accb151f40997ea5bf4b744e301bb84dc7200b7fe8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ac76e4d3d424461a39528ea1d2ba617ad21e78e0f09bc8d39ee2731c0574cb7a
MD5 e0d7a7024173b6efbe4d3f7cd97be06f
BLAKE2b-256 49a03ae4f229e1dbd329cd4cee3a1d6bb9fbf9594d94724ff410dc7b6ef78464

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 156c081197fab22d9648922e688d674bd0a34bf5b43c42a2b60d4b05af2fce08
MD5 c9267b9ee1aa332ca2a5e0c800397b76
BLAKE2b-256 acaefa681394eeb778c990cf8be9ed29309d602e5c9f7091580dda0db4f4ebd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 3ba64807ace96a9ed3fbd8c9d1c6589e1d9867a2694f8b8caf6e80ba01930d36
MD5 ea21d80908c8f2fb965b6016913bcd4a
BLAKE2b-256 682e73287d19db0dd1591f98df5e2178c3938ec5754f8eb98478f19b2aa167fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 31c5e174cfac804ae96c7e50b441071a8f43c73dfe98c1a6c9d7187a82a0cadf
MD5 40a9e2f0b8f8e06cc8f235c05bbdd0c9
BLAKE2b-256 9694ae5d15a67682c9894df094ba6b9d89db273377f529958a4e95f4fd695f7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 95f9ac2ead5117f8cb5021477fb133164cfc6ff288f1794a0bc83b81e7040d1b
MD5 03928c92f4338a9b4c4f4992f52c9f5e
BLAKE2b-256 d0febdeb03070039e4c2673ab2c5114967f970f45edba3d3f5f8c7001d6e3cc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 d13778a9b4c5a180fdc592c7d7c32d98d47c0dcd9c611d22248503225e8b192d
MD5 3141e1f922866cc3296791170d8fda01
BLAKE2b-256 7633f68987b342aa2e6d55d833dcf200314b4464659116bcce90b4cb8f912971

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 545dc8bc93a001ed65b0867f975092ba70f4f7a10f4a9ee12caaf155f7130530
MD5 2d39a81a4e420fafcafba919d3376f1f
BLAKE2b-256 b848bc12dc4e6a69287b3c00daea27f2224124b7c484fc6bcd3113c4200dd9fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.0.0rc2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4cbc28bfd31b7f3ec4a275646758b498e4ce11a34923a75b46867802a66f24d2
MD5 f7cd27da5ce6f22740bdf35369565e62
BLAKE2b-256 485951fbc32e1fd8f13fb6888f5b907d8bb9c40ad3dc3fb8be82b99cc1aadc8c

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