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

Uploaded CPython 3.11 Windows x86-64

zipline_tej-2.1.0rc2-cp311-cp311-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 macOS 11.0+ ARM64

zipline_tej-2.1.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.1.0rc2-cp38-cp38-win_amd64.whl (4.3 MB view details)

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 macOS 11.0+ ARM64

zipline_tej-2.1.0rc2-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.1.0rc2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 792c20ee7b83eefd9ba7f9e9e22c6dcdee5e6a8e46395eeb9836f91213c0318f
MD5 06be08a870f5e770e07a5426e129658e
BLAKE2b-256 96f7a46aec35be046c655221a5f9c10e133d225f894f3f00706a1fb3a1e6c017

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4896c672e2a53d668c3e3350dbe113773e45bdd0b7c091e040015dbc634637c7
MD5 17878ce5ab00295732ed823e1f905ad9
BLAKE2b-256 367be8e1a83105f1c95bff5422a5166c35169b973d62135bb2b28e07a6062bf9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8898034315c9fc5f3264507c375bd6fddfdd6c989472edc8dd38bc2e43e95096
MD5 232a80a138606a7ca59b61f95d777923
BLAKE2b-256 5c1b6afbf395cd8cf093b417fac9f26758b1f941455c8aec9ed186fecf811894

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8d12361bb2176b7ae161586220b40751dd0ee1b87b138dd6f53677de58a6ae00
MD5 9ffacc089b8906f03a5017d6b48f712c
BLAKE2b-256 84a4c172fcfe5e13a96b6b719b44502deef903b3d7a30dc2d8718ce6b6d364f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b89a0c2aa8317a96ded42100ae9cebcbcec6dd1ff4d6ab616904a84f7caaf753
MD5 107efc4b55464f63a7f8d7f6774f24a6
BLAKE2b-256 922b9973556dd9882a193571ba68d1a5d114784a4c71874cb743a8ef8dd3042d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b45b4ee7e8e659c08bcc94685a53fba17bacc4427be872fb7a822c30b3030407
MD5 3bd2291e27192a3070a510e2aefbc226
BLAKE2b-256 3740328c665ce163904bd1c9fa338e9ecaafb5a405f518f46a0e9d05b6c1cf9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a0b9c292eef1f4771c0095e261417f943b81f6c96fa15fed429092c2791a517d
MD5 7acc0f36bf0c7a340c84cd43e6151fb4
BLAKE2b-256 7b24b35dcacf8ac3db7796d1c182bd93d6968f9082dff21d24517d1890efbc92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd8da1783bcf1637c6d7e856c5d5981bdaaf457255e623e204794fd47809eb88
MD5 55dd8cc2aa9664281b354e8b7110a09a
BLAKE2b-256 69cad77ea237810eb261885ffda3613ca51ee034eae38aacf544a8d8be79bb4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 abdb104a9aa74b8603ef87e3ad76c4cd4229b5d172774945583e4aaffb854d42
MD5 133a3ef2d26d69a8fe6b8ec62ea1ac2a
BLAKE2b-256 1148949658cd53e5dce9b602ffc82e8e9e9e8d8af9ffeacc7a08f4df8e3faa29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 066e8ea02e040f0adc8550a33bb02d4075b0ce3942b46a0a43b7786a7d3463b6
MD5 d94fa1b27c5df60c027bb6aafc223003
BLAKE2b-256 ca54ed6db277984c4081cd915bedae909888d71ace6c42a86253a64828b00405

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4214f782fc0dd719f6c0171f44d399661a8d7e035d50cc9bae1d0250b9b30bfc
MD5 b4d98a2e7ad095ec9c80fe359dc4ff74
BLAKE2b-256 5d2d41ad2795cda092599053ed2263ef8a6f437ea682ab1ad57595a884612c2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zipline_tej-2.1.0rc2-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bd128e6214029be4b4ca254cc9d9ea6561d1ca13b901a4a867f0d16ebf3c9f40
MD5 275638d211a4fad5b98d6e3d4d76440b
BLAKE2b-256 e4771d77c1b30b080c0bcd9656208ebfca69370e9757192ea185e53296a14c56

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