zipline-tej


Namezipline-tej JSON
Version 2.1.0 PyPI version JSON
download
home_pageNone
SummaryA Pythonic backtester for trading algorithms
upload_time2024-10-30 01:15:53
maintainertej api Development Team
docs_urlNone
authortej
requires_python>=3.8
licenseApache-2.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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](https://www.anaconda.com/data-science-platform) as development environment.

* Download dependency packages.

1. Windows [(zipline-tej.yml)](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/tejtw/zipline-tej/blob/main/zipline-tej.yml)

2. Mac [(zipline-tej_mac.yml)](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/tejtw/zipline-tej/blob/main/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)](https://csguide.cs.princeton.edu/software/virtualenv#definition)

```
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](https://hub.docker.com/).

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

First of all, please download and install [docker-desktop](https://www.docker.com/products/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.

```python
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.

```python
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

```python
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

```python
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

```python
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](https://github.com/tejtw/zipline-tej/blob/main/output_img/output.png?raw=true)


### Show trading process
```python
In[5]: 
result
[Out]:
```
<div>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>period_open</th>
      <th>period_close</th>
      <th>starting_value</th>
      <th>ending_value</th>
      <th>starting_cash</th>
      <th>ending_cash</th>
      <th>portfolio_value</th>
      <th>longs_count</th>
      <th>shorts_count</th>
      <th>long_value</th>
      <th>...</th>
      <th>treasury_period_return</th>
      <th>trading_days</th>
      <th>period_label</th>
      <th>algo_volatility</th>
      <th>benchmark_period_return</th>
      <th>benchmark_volatility</th>
      <th>algorithm_period_return</th>
      <th>alpha</th>
      <th>beta</th>
      <th>sharpe</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2020-01-03 05:30:00+00:00</th>
      <td>2020-01-03 01:01:00+00:00</td>
      <td>2020-01-03 05:30:00+00:00</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>1.000000e+06</td>
      <td>1.000000e+06</td>
      <td>1.000000e+06</td>
      <td>0</td>
      <td>0</td>
      <td>0.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>1</td>
      <td>2020-01</td>
      <td>NaN</td>
      <td>0.0</td>
      <td>NaN</td>
      <td>0.000000</td>
      <td>None</td>
      <td>None</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2020-01-06 05:30:00+00:00</th>
      <td>2020-01-06 01:01:00+00:00</td>
      <td>2020-01-06 05:30:00+00:00</td>
      <td>0.0</td>
      <td>3320.0</td>
      <td>1.000000e+06</td>
      <td>9.966783e+05</td>
      <td>9.999983e+05</td>
      <td>1</td>
      <td>0</td>
      <td>3320.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>2</td>
      <td>2020-01</td>
      <td>0.000019</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>-0.000002</td>
      <td>None</td>
      <td>None</td>
      <td>-11.224972</td>
    </tr>
    <tr>
      <th>2020-01-07 05:30:00+00:00</th>
      <td>2020-01-07 01:01:00+00:00</td>
      <td>2020-01-07 05:30:00+00:00</td>
      <td>3320.0</td>
      <td>6590.0</td>
      <td>9.966783e+05</td>
      <td>9.933817e+05</td>
      <td>9.999717e+05</td>
      <td>1</td>
      <td>0</td>
      <td>6590.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>3</td>
      <td>2020-01</td>
      <td>0.000237</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>-0.000028</td>
      <td>None</td>
      <td>None</td>
      <td>-10.038514</td>
    </tr>
    <tr>
      <th>2020-01-08 05:30:00+00:00</th>
      <td>2020-01-08 01:01:00+00:00</td>
      <td>2020-01-08 05:30:00+00:00</td>
      <td>6590.0</td>
      <td>9885.0</td>
      <td>9.933817e+05</td>
      <td>9.900850e+05</td>
      <td>9.999700e+05</td>
      <td>1</td>
      <td>0</td>
      <td>9885.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>4</td>
      <td>2020-01</td>
      <td>0.000203</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>-0.000030</td>
      <td>None</td>
      <td>None</td>
      <td>-9.298128</td>
    </tr>
    <tr>
      <th>2020-01-09 05:30:00+00:00</th>
      <td>2020-01-09 01:01:00+00:00</td>
      <td>2020-01-09 05:30:00+00:00</td>
      <td>9885.0</td>
      <td>13500.0</td>
      <td>9.900850e+05</td>
      <td>9.867083e+05</td>
      <td>1.000208e+06</td>
      <td>1</td>
      <td>0</td>
      <td>13500.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>5</td>
      <td>2020-01</td>
      <td>0.001754</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.000208</td>
      <td>None</td>
      <td>None</td>
      <td>5.986418</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>2021-12-24 05:30:00+00:00</th>
      <td>2021-12-24 01:01:00+00:00</td>
      <td>2021-12-24 05:30:00+00:00</td>
      <td>2920920.0</td>
      <td>2917320.0</td>
      <td>-1.308854e+06</td>
      <td>-1.314897e+06</td>
      <td>1.602423e+06</td>
      <td>1</td>
      <td>0</td>
      <td>2917320.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>484</td>
      <td>2021-12</td>
      <td>0.232791</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.602423</td>
      <td>None</td>
      <td>None</td>
      <td>1.170743</td>
    </tr>
    <tr>
      <th>2021-12-27 05:30:00+00:00</th>
      <td>2021-12-27 01:01:00+00:00</td>
      <td>2021-12-27 05:30:00+00:00</td>
      <td>2917320.0</td>
      <td>2933040.0</td>
      <td>-1.314897e+06</td>
      <td>-1.320960e+06</td>
      <td>1.612080e+06</td>
      <td>1</td>
      <td>0</td>
      <td>2933040.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>485</td>
      <td>2021-12</td>
      <td>0.232577</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.612080</td>
      <td>None</td>
      <td>None</td>
      <td>1.182864</td>
    </tr>
    <tr>
      <th>2021-12-28 05:30:00+00:00</th>
      <td>2021-12-28 01:01:00+00:00</td>
      <td>2021-12-28 05:30:00+00:00</td>
      <td>2933040.0</td>
      <td>2982750.0</td>
      <td>-1.320960e+06</td>
      <td>-1.327113e+06</td>
      <td>1.655637e+06</td>
      <td>1</td>
      <td>0</td>
      <td>2982750.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>486</td>
      <td>2021-12</td>
      <td>0.233086</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.655637</td>
      <td>None</td>
      <td>None</td>
      <td>1.237958</td>
    </tr>
    <tr>
      <th>2021-12-29 05:30:00+00:00</th>
      <td>2021-12-29 01:01:00+00:00</td>
      <td>2021-12-29 05:30:00+00:00</td>
      <td>2982750.0</td>
      <td>2993760.0</td>
      <td>-1.327113e+06</td>
      <td>-1.333276e+06</td>
      <td>1.660484e+06</td>
      <td>1</td>
      <td>0</td>
      <td>2993760.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>487</td>
      <td>2021-12</td>
      <td>0.232850</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.660484</td>
      <td>None</td>
      <td>None</td>
      <td>1.243176</td>
    </tr>
    <tr>
      <th>2021-12-30 05:30:00+00:00</th>
      <td>2021-12-30 01:01:00+00:00</td>
      <td>2021-12-30 05:30:00+00:00</td>
      <td>2993760.0</td>
      <td>2995050.0</td>
      <td>-1.333276e+06</td>
      <td>-1.339430e+06</td>
      <td>1.655620e+06</td>
      <td>1</td>
      <td>0</td>
      <td>2995050.0</td>
      <td>...</td>
      <td>0.0</td>
      <td>488</td>
      <td>2021-12</td>
      <td>0.232629</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.655620</td>
      <td>None</td>
      <td>None</td>
      <td>1.235305</td>
    </tr>
  </tbody>
</table>
<p>488 rows × 38 columns</p>
</div>

---

# More Zipline Tutorials

* For more [tutorials](https://github.com/tejtw/TQuant-Lab)

# Suggestions
* To get TEJAPI_KEY [(link)](https://api.tej.com.tw/trial.html)
* [TEJ Official Website](https://www.tej.com.tw/)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "zipline-tej",
    "maintainer": "tej api Development Team",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "tej@tej.com.tw",
    "keywords": null,
    "author": "tej",
    "author_email": "tej@tej.com.tw",
    "download_url": null,
    "platform": null,
    "description": "# Installation\n\n## Used packages and environment\n* Main package: Zipline\n* Python 3.8 or above (currently support up to 3.11)\n* Microsoft Windows OS or macOS or Linux\n* Other Python dependency packages: Pandas, Numpy, Logbook, Exchange-calendars, etc.\n\n## How to install Zipline Reloaded modified by TEJ\n\n* We're going to illustrate under anaconda environment, so we suggest using [Anaconda](https://www.anaconda.com/data-science-platform) as development environment.\n\n* Download dependency packages.\n\n1. Windows [(zipline-tej.yml)](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/tejtw/zipline-tej/blob/main/zipline-tej.yml)\n\n2. Mac [(zipline-tej_mac.yml)](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/tejtw/zipline-tej/blob/main/zipline-tej_mac.yml)\n\n* Start an Anaconda (base) prompt, create an virtual environment and install the appropriate versions of packages:\n(We **strongly** recommand using virtual environment to keep every project independent.) [(reason)](https://csguide.cs.princeton.edu/software/virtualenv#definition)\n\n```\nWindows Users\n# change directionary to the folder exists zipline-tej.yml\n$ cd <C:\\Users\\username\\Downloads>\n\n# create virtual env\n$ conda env create -f zipline-tej.yml\n\n# activate virtual env\n$ conda activate zipline-tej\nMac Users\n# change directionary to the folder exists zipline-tej_mac.yml\n$ cd <C:\\Users\\username\\Downloads>\n\n# create virtual env\n$ conda env create -f zipline-tej_mac.yml\n\n# activate virtual env\n$ conda activate zipline-tej\n\n```\n\nAlso, if you are familiar with Python enough, you can create a virtual environment without zipline-tej.yml and here's the sample :\n\n```\n# create virtual env\n$ conda create -n <env_name> python=3.10\n\n# activate virtual env\n$ conda activate <env_name>\n\n# download dependency packages\n$ pip install zipline-tej\n\n```\n\nWhile encountering environment problems, we provided a consistent and stable environment on [Docker hub](https://hub.docker.com/).\n\nFor users that using docker, we briefly introduce how to download and use it.\n\nFirst of all, please download and install [docker-desktop](https://www.docker.com/products/docker-desktop/).\n\n```\n\n1. Start docker-desktop. (Registration is not must.)\n\n2. Select the \"images\" on the leftside and search \"tej87681088/tquant\" and click \"Pull\".\n\n3. After the image was downloaded, click the \"run\" icon the enter the optional settings.\n\n3-1. Contaner-name: whatever you want.\n\n3-2. Ports: the port to connect, \"8888\" is recommended.\n\n3-3. Volumes: the place to store files. (You can create volume first on the left side.)\n\ne.g. created a volume named \"data\", host path enter \"data\", container path \"/app\" is recommended.\n\n4. Select the \"Containers\" leftside, the click the one which its image name is tej87681088/tquant\n\n5. In its \"Logs\" would show an url like \nhttp://127.0.0.1:8888/tree?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\n6. Go to your browser and enter \"http://127.0.0.1:<port_you_set_in_step_3-2>/tree?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\n\n6-1. If your port is 8888, you can just click the hyperlink.\n\n7. Start develop your strategy!\n\nNOTICE: Next time, we just need to reproduce step4 to step6.\n```\n\n# Quick start\n\n## CLI Interface\n\nThe following code implements a simple buy-and-hold trading algorithm.\n\n```python\nfrom zipline.api import order, record, symbol\n\ndef initialize(context):\n    context.asset = symbol(\"2330\")\n    \ndef handle_data(context, data):\n    order(context.asset, 10)\n    record(TSMC=data.current(context.asset, \"price\"))\n    \ndef analyze(context=None, results=None):\n    import matplotlib.pyplot as plt\n\n    # Plot the portfolio and asset data.\n    ax1 = plt.subplot(211)\n    results.portfolio_value.plot(ax=ax1)\n    ax1.set_ylabel(\"Portfolio value (TWD)\")\n    ax2 = plt.subplot(212, sharex=ax1)\n    results.TSMC.plot(ax=ax2)\n    ax2.set_ylabel(\"TSMC price (TWD)\")\n\n    # Show the plot.\n    plt.gcf().set_size_inches(18, 8)\n    plt.show()\n\n```\nYou can then run this algorithm using the Zipline CLI. But first, you need to download some market data with historical prices and trading volumes:\n* Before ingesting data, you have to set some environment variables as follow:\n \n```\n# setting TEJAPI_KEY to get permissions loading data\n$ set TEJAPI_KEY=<your_key>\n$ set TEJAPI_BASE=https://api.tej.com.tw\n\n# setting download ticker\n$ set ticker=2330 2317\n\n# setting backtest period\n$ set mdate=20200101 20220101\n\n```\n* Ingest and run backtesting algorithm\n\n```\n$ zipline ingest -b tquant\n$ zipline run -f buy_and_hold.py  --start 20200101 --end 20220101 -o bah.pickle --no-benchmark --no-treasury \n```\nThen, the resulting performance DataFrame is saved as bah.pickle, which you can load and analyze from Python.\n\n### More useful zipline commands\n\nBefore calling **zipline** in CLI, be sure that TEJAPI_KEY and TEJAPI_BASE were set.\nUse **zipline --help** to get more information.\n\nFor example :\nWe want to know how to use **zipline run**, we can run as follow:\n\n```\nzipline run --help\n```\n\n```\n\nUsage: zipline run [OPTIONS]\n  Run a backtest for the given algorithm.\n\nOptions:\n  -f, --algofile FILENAME         The file that contains the algorithm to run.\n  -t, --algotext TEXT             The algorithm script to run.\n  -D, --define TEXT               Define a name to be bound in the namespace\n                                  before executing the algotext. For example\n                                  '-Dname=value'. The value may be any python\n                                  expression. These are evaluated in order so\n                                  they may refer to previously defined names.\n  --data-frequency [daily|minute]\n                                  The data frequency of the simulation.\n                                  [default: daily]\n  --capital-base FLOAT            The starting capital for the simulation.\n                                  [default: 10000000.0]\n  -b, --bundle BUNDLE-NAME        The data bundle to use for the simulation.\n                                  [default: tquant]\n  --bundle-timestamp TIMESTAMP    The date to lookup data on or before.\n                                  [default: <current-time>]\n  -bf, --benchmark-file FILE      The csv file that contains the benchmark\n                                  returns\n  --benchmark-symbol TEXT         The symbol of the instrument to be used as a\n                                  benchmark (should exist in the ingested\n                                  bundle)\n  --benchmark-sid INTEGER         The sid of the instrument to be used as a\n                                  benchmark (should exist in the ingested\n                                  bundle)\n  --no-benchmark                  If passed, use a benchmark of zero returns.\n  -bf, --treasury-file FILE       The csv file that contains the treasury\n                                  returns\n  --treasury-symbol TEXT          The symbol of the instrument to be used as a\n                                  treasury (should exist in the ingested\n                                  bundle)\n  --treasury-sid INTEGER          The sid of the instrument to be used as a\n                                  treasury (should exist in the ingested\n                                  bundle)\n  --no-treasury                   If passed, use a treasury of zero returns.\n  -s, --start DATE                The start date of the simulation.\n  -e, --end DATE                  The end date of the simulation.\n  -o, --output FILENAME           The location to write the perf data. If this\n                                  is '-' the perf will be written to stdout.\n                                  [default: -]\n  --trading-calendar TRADING-CALENDAR\n                                  The calendar you want to use e.g. TEJ_XTAI.\n                                  TEJ_XTAI is the default.\n  --print-algo / --no-print-algo  Print the algorithm to stdout.\n  --metrics-set TEXT              The metrics set to use. New metrics sets may\n                                  be registered in your extension.py.\n  --blotter TEXT                  The blotter to use.  [default: default]\n  --help                          Show this message and exit.\n\n``` \n\n### Difference of tquant and fundamentals\n\n* 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.\n\n* So in both fundamentals and tquant, we can add tickers as follow :\n\n#### Add tickers\n\n```\n$ zipline add -t \"<ticker_wants_to_add>\"\n```\nIf tickers are more than 1 ticker, split them apart by \" \" or \",\"  or \";\".\n\n#### [fundamentals only] Add fields\n\n```\n$ zipline add -f \"<field_wants_to_add>\"\n```\n\n* NOTICE that you `CAN'T` add field and ticker simultaneously.\n\nFor more detail use **zipline add --help** .\n\n#### Display bundle-info\n```\n$ zipline bundle-info\n```\nTo show what the tickers are there in newest bundle.\n\nFor more detail use **zipline bundle-info --help** .\n\n#### Switch bundle\n\nBefore using switch, use **zipline bundles** to get the timestamp of each folder.\n\n```\n$ zipline switch -t \"<The_timestamp_of_the_folder_want_to_use>\"\n```\n\nDue to zipline only using the newest folder, switch can make previous folder become newest.\n\nFor more detail use **zipline switch --help** .\n\n#### Update bundle\n\n* 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]\n\n```\n$ zipline update -b tquant\n$ zipline update -b fundamentals\n```\n\nFor more detail use **zipline update --help** .\n\n## Jupyter Notebook \n\n### Change Anaconda kernel\n\n* Since we've downloaded package \"nb_conda_kernels\", we should be able to change kernel in jupyter notebook.\n\n#### How to new a notebook using specific kernel \n\n(1) Open anaconda prompt\n\n(2) Enter the command as follow :\n```\n# First one can be ignore if already in environment of zipline-tej\n$ conda activate zipline-tej \n# start a jupyter notebook\n$ jupyter notebook \n```\n(3) Start a notebook and select Python[conda env:zipline-tej]\n\n(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.\n\n\n### Set environment variables TEJAPI_KEY, ticker and mdate\n\n\\* 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. \n\n\\* mdate refers the begin date and end date, use \" \", \",\" or \";\" to split them apart.\n\n```python\nIn[1]:\nimport os    \nos.environ['TEJAPI_KEY'] = <your_key>    \nos.environ['ticker'] ='2330 2317'     \nos.environ['mdate'] ='20200101 20220101'  \n```\n### Call ingest to download data to ~\\\\\\.zipline\n\n```python\nIn[2]:    \n!zipline ingest -b tquant\n[Out]: \nMerging daily equity files:\n[YYYY-MM-DD HH:mm:ss.ssssss] INFO: zipline.data.bundles.core: Ingesting tquant.\n```\n\n\n### Design the backtesting strategy\n\n```python\nIn[3]:\nfrom zipline.api import order, record, symbol\n\ndef initialize(context):\n    context.asset = symbol(\"2330\")\n    \ndef handle_data(context, data):\n    order(context.asset, 10)\n    record(TSMC=data.current(context.asset, \"price\"))\n    \ndef analyze(context=None, results=None):\n    import matplotlib.pyplot as plt\n\n    # Plot the portfolio and asset data.\n    ax1 = plt.subplot(211)\n    results.portfolio_value.plot(ax=ax1)\n    ax1.set_ylabel(\"Portfolio value (TWD)\")\n    ax2 = plt.subplot(212, sharex=ax1)\n    results.TSMC.plot(ax=ax2)\n    ax2.set_ylabel(\"TSMC price (TWD)\")\n\n    # Show the plot.\n    plt.gcf().set_size_inches(18, 8)\n    plt.show()\n```\n### Run backtesting algorithm and plot\n\n```python\nIn[4]:\nfrom zipline import run_algorithm\nimport pandas as pd\nfrom zipline.utils.calendar_utils import get_calendar\ntrading_calendar = get_calendar('TEJ_XTAI')\n\nstart = pd.Timestamp('20200103', tz ='utc' )\nend = pd.Timestamp('20211230', tz='utc')\n\nresult = run_algorithm(start=start,\n                  end=end,\n                  initialize=initialize,\n                  capital_base=1000000,\n                  handle_data=handle_data,\n                  bundle='tquant',\n                  trading_calendar=trading_calendar,\n                  analyze=analyze,\n                  data_frequency='daily'\n                  )\n[Out]:\n```\n![output](https://github.com/tejtw/zipline-tej/blob/main/output_img/output.png?raw=true)\n\n\n### Show trading process\n```python\nIn[5]: \nresult\n[Out]:\n```\n<div>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>period_open</th>\n      <th>period_close</th>\n      <th>starting_value</th>\n      <th>ending_value</th>\n      <th>starting_cash</th>\n      <th>ending_cash</th>\n      <th>portfolio_value</th>\n      <th>longs_count</th>\n      <th>shorts_count</th>\n      <th>long_value</th>\n      <th>...</th>\n      <th>treasury_period_return</th>\n      <th>trading_days</th>\n      <th>period_label</th>\n      <th>algo_volatility</th>\n      <th>benchmark_period_return</th>\n      <th>benchmark_volatility</th>\n      <th>algorithm_period_return</th>\n      <th>alpha</th>\n      <th>beta</th>\n      <th>sharpe</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2020-01-03 05:30:00+00:00</th>\n      <td>2020-01-03 01:01:00+00:00</td>\n      <td>2020-01-03 05:30:00+00:00</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.000000e+06</td>\n      <td>1.000000e+06</td>\n      <td>1.000000e+06</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>1</td>\n      <td>2020-01</td>\n      <td>NaN</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>0.000000</td>\n      <td>None</td>\n      <td>None</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>2020-01-06 05:30:00+00:00</th>\n      <td>2020-01-06 01:01:00+00:00</td>\n      <td>2020-01-06 05:30:00+00:00</td>\n      <td>0.0</td>\n      <td>3320.0</td>\n      <td>1.000000e+06</td>\n      <td>9.966783e+05</td>\n      <td>9.999983e+05</td>\n      <td>1</td>\n      <td>0</td>\n      <td>3320.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>2</td>\n      <td>2020-01</td>\n      <td>0.000019</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>-0.000002</td>\n      <td>None</td>\n      <td>None</td>\n      <td>-11.224972</td>\n    </tr>\n    <tr>\n      <th>2020-01-07 05:30:00+00:00</th>\n      <td>2020-01-07 01:01:00+00:00</td>\n      <td>2020-01-07 05:30:00+00:00</td>\n      <td>3320.0</td>\n      <td>6590.0</td>\n      <td>9.966783e+05</td>\n      <td>9.933817e+05</td>\n      <td>9.999717e+05</td>\n      <td>1</td>\n      <td>0</td>\n      <td>6590.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>3</td>\n      <td>2020-01</td>\n      <td>0.000237</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>-0.000028</td>\n      <td>None</td>\n      <td>None</td>\n      <td>-10.038514</td>\n    </tr>\n    <tr>\n      <th>2020-01-08 05:30:00+00:00</th>\n      <td>2020-01-08 01:01:00+00:00</td>\n      <td>2020-01-08 05:30:00+00:00</td>\n      <td>6590.0</td>\n      <td>9885.0</td>\n      <td>9.933817e+05</td>\n      <td>9.900850e+05</td>\n      <td>9.999700e+05</td>\n      <td>1</td>\n      <td>0</td>\n      <td>9885.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>4</td>\n      <td>2020-01</td>\n      <td>0.000203</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>-0.000030</td>\n      <td>None</td>\n      <td>None</td>\n      <td>-9.298128</td>\n    </tr>\n    <tr>\n      <th>2020-01-09 05:30:00+00:00</th>\n      <td>2020-01-09 01:01:00+00:00</td>\n      <td>2020-01-09 05:30:00+00:00</td>\n      <td>9885.0</td>\n      <td>13500.0</td>\n      <td>9.900850e+05</td>\n      <td>9.867083e+05</td>\n      <td>1.000208e+06</td>\n      <td>1</td>\n      <td>0</td>\n      <td>13500.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>5</td>\n      <td>2020-01</td>\n      <td>0.001754</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.000208</td>\n      <td>None</td>\n      <td>None</td>\n      <td>5.986418</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>2021-12-24 05:30:00+00:00</th>\n      <td>2021-12-24 01:01:00+00:00</td>\n      <td>2021-12-24 05:30:00+00:00</td>\n      <td>2920920.0</td>\n      <td>2917320.0</td>\n      <td>-1.308854e+06</td>\n      <td>-1.314897e+06</td>\n      <td>1.602423e+06</td>\n      <td>1</td>\n      <td>0</td>\n      <td>2917320.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>484</td>\n      <td>2021-12</td>\n      <td>0.232791</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.602423</td>\n      <td>None</td>\n      <td>None</td>\n      <td>1.170743</td>\n    </tr>\n    <tr>\n      <th>2021-12-27 05:30:00+00:00</th>\n      <td>2021-12-27 01:01:00+00:00</td>\n      <td>2021-12-27 05:30:00+00:00</td>\n      <td>2917320.0</td>\n      <td>2933040.0</td>\n      <td>-1.314897e+06</td>\n      <td>-1.320960e+06</td>\n      <td>1.612080e+06</td>\n      <td>1</td>\n      <td>0</td>\n      <td>2933040.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>485</td>\n      <td>2021-12</td>\n      <td>0.232577</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.612080</td>\n      <td>None</td>\n      <td>None</td>\n      <td>1.182864</td>\n    </tr>\n    <tr>\n      <th>2021-12-28 05:30:00+00:00</th>\n      <td>2021-12-28 01:01:00+00:00</td>\n      <td>2021-12-28 05:30:00+00:00</td>\n      <td>2933040.0</td>\n      <td>2982750.0</td>\n      <td>-1.320960e+06</td>\n      <td>-1.327113e+06</td>\n      <td>1.655637e+06</td>\n      <td>1</td>\n      <td>0</td>\n      <td>2982750.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>486</td>\n      <td>2021-12</td>\n      <td>0.233086</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.655637</td>\n      <td>None</td>\n      <td>None</td>\n      <td>1.237958</td>\n    </tr>\n    <tr>\n      <th>2021-12-29 05:30:00+00:00</th>\n      <td>2021-12-29 01:01:00+00:00</td>\n      <td>2021-12-29 05:30:00+00:00</td>\n      <td>2982750.0</td>\n      <td>2993760.0</td>\n      <td>-1.327113e+06</td>\n      <td>-1.333276e+06</td>\n      <td>1.660484e+06</td>\n      <td>1</td>\n      <td>0</td>\n      <td>2993760.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>487</td>\n      <td>2021-12</td>\n      <td>0.232850</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.660484</td>\n      <td>None</td>\n      <td>None</td>\n      <td>1.243176</td>\n    </tr>\n    <tr>\n      <th>2021-12-30 05:30:00+00:00</th>\n      <td>2021-12-30 01:01:00+00:00</td>\n      <td>2021-12-30 05:30:00+00:00</td>\n      <td>2993760.0</td>\n      <td>2995050.0</td>\n      <td>-1.333276e+06</td>\n      <td>-1.339430e+06</td>\n      <td>1.655620e+06</td>\n      <td>1</td>\n      <td>0</td>\n      <td>2995050.0</td>\n      <td>...</td>\n      <td>0.0</td>\n      <td>488</td>\n      <td>2021-12</td>\n      <td>0.232629</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.655620</td>\n      <td>None</td>\n      <td>None</td>\n      <td>1.235305</td>\n    </tr>\n  </tbody>\n</table>\n<p>488 rows \u00d7 38 columns</p>\n</div>\n\n---\n\n# More Zipline Tutorials\n\n* For more [tutorials](https://github.com/tejtw/TQuant-Lab)\n\n# Suggestions\n* To get TEJAPI_KEY [(link)](https://api.tej.com.tw/trial.html)\n* [TEJ Official Website](https://www.tej.com.tw/)\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "A Pythonic backtester for trading algorithms",
    "version": "2.1.0",
    "project_urls": {
        "homepage": "https://tquant.tejwin.com/",
        "repository": "https://github.com/tejtw/zipline-tej"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c79303b3e188a882b205e1fdd21eae3e5456ec024ca13c7f33bdb177ce4fa04a",
                "md5": "2e7c14074e44c824694b02d69d361124",
                "sha256": "4f3e316f27ffffca15e55e89142695bd7592baf658aca0120939bbbb2bfffa1b"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp310-cp310-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2e7c14074e44c824694b02d69d361124",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 4318586,
            "upload_time": "2024-10-30T01:15:53",
            "upload_time_iso_8601": "2024-10-30T01:15:53.332755Z",
            "url": "https://files.pythonhosted.org/packages/c7/93/03b3e188a882b205e1fdd21eae3e5456ec024ca13c7f33bdb177ce4fa04a/zipline_tej-2.1.0-cp310-cp310-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7b1517277de2dcfb7658a96c89249839a32268b08cf8c8e982a3b19a61f6ef1f",
                "md5": "fcfd6b3930443dca8eebc08368661052",
                "sha256": "5b22be3fd8652baaa31145b6e095c96d7e882527b65d86fb1619838ffb4be01d"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "fcfd6b3930443dca8eebc08368661052",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 4186475,
            "upload_time": "2024-10-30T01:15:55",
            "upload_time_iso_8601": "2024-10-30T01:15:55.609888Z",
            "url": "https://files.pythonhosted.org/packages/7b/15/17277de2dcfb7658a96c89249839a32268b08cf8c8e982a3b19a61f6ef1f/zipline_tej-2.1.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d361d584eb1e69baf63a53e79ce2dd36896bb6140aa737487eda59ee2a8c377a",
                "md5": "badff041fc8b170b4657aeaa2a672661",
                "sha256": "c6c434170970abd837782da79b44404f48571ee87b330ef497c6f3db180506ee"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "badff041fc8b170b4657aeaa2a672661",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 4127629,
            "upload_time": "2024-10-30T01:15:57",
            "upload_time_iso_8601": "2024-10-30T01:15:57.676325Z",
            "url": "https://files.pythonhosted.org/packages/d3/61/d584eb1e69baf63a53e79ce2dd36896bb6140aa737487eda59ee2a8c377a/zipline_tej-2.1.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a807c8bd123463ff09416b2bb42d7c6372f5f35306b1c47aa0d97fb59bc391d2",
                "md5": "b2b122075fb014128aff8d6ea184e237",
                "sha256": "3c221454c3f0a4a0d274940c0fc47d0559d0fae0765559393de061d075906429"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b2b122075fb014128aff8d6ea184e237",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 4304555,
            "upload_time": "2024-10-30T01:15:59",
            "upload_time_iso_8601": "2024-10-30T01:15:59.621243Z",
            "url": "https://files.pythonhosted.org/packages/a8/07/c8bd123463ff09416b2bb42d7c6372f5f35306b1c47aa0d97fb59bc391d2/zipline_tej-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7d62cce155412c8f8a86378e510d816fcc6336cf82317aa43969f61bc79c8f16",
                "md5": "b94569ca64b4c180de14489e9c19a001",
                "sha256": "8732e62c1d242591a479aabbfb024ee0dec621ccf90ec91e4f4fc7201c963eee"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "b94569ca64b4c180de14489e9c19a001",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 4171554,
            "upload_time": "2024-10-30T01:16:01",
            "upload_time_iso_8601": "2024-10-30T01:16:01.690685Z",
            "url": "https://files.pythonhosted.org/packages/7d/62/cce155412c8f8a86378e510d816fcc6336cf82317aa43969f61bc79c8f16/zipline_tej-2.1.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6415b791210f47e9161dcb538011d9790c425488ad1a6ad342a05fce01f3442a",
                "md5": "95232ac95991dc0eaad3e107a30eff10",
                "sha256": "287c5221089d91a22a9ddc0d6e8be9e3f551dcb77c5eb26e8a81e92acef31072"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "95232ac95991dc0eaad3e107a30eff10",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 4135917,
            "upload_time": "2024-10-30T01:16:03",
            "upload_time_iso_8601": "2024-10-30T01:16:03.416436Z",
            "url": "https://files.pythonhosted.org/packages/64/15/b791210f47e9161dcb538011d9790c425488ad1a6ad342a05fce01f3442a/zipline_tej-2.1.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "acb14c1e5da0ae9dd2e5afe1ec19c904d1b76c614195253a8eb703d82e3d558c",
                "md5": "5cfc7fa0f2723ab1a37e9fee908dba4c",
                "sha256": "2d84d399126bcf8c714db70b4c17f9626e7a6e8fc78b0ac43de30fbd654540b5"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5cfc7fa0f2723ab1a37e9fee908dba4c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4458540,
            "upload_time": "2024-10-30T01:16:04",
            "upload_time_iso_8601": "2024-10-30T01:16:04.905773Z",
            "url": "https://files.pythonhosted.org/packages/ac/b1/4c1e5da0ae9dd2e5afe1ec19c904d1b76c614195253a8eb703d82e3d558c/zipline_tej-2.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "83d5348f27a64f1dc69cfce0bc7dfd6619601ffcc1c7c297101ec7fe94b272c1",
                "md5": "471341dc1a3f69d1c220cf2b58eb1d6d",
                "sha256": "b597dc44eed0a1e632fa270d2dbc783d30869e4ef909d1c5a98973c6033708ef"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "471341dc1a3f69d1c220cf2b58eb1d6d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4330796,
            "upload_time": "2024-10-30T01:16:06",
            "upload_time_iso_8601": "2024-10-30T01:16:06.284376Z",
            "url": "https://files.pythonhosted.org/packages/83/d5/348f27a64f1dc69cfce0bc7dfd6619601ffcc1c7c297101ec7fe94b272c1/zipline_tej-2.1.0-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "82a294c70dcd78fc5d84836183061cb0aa2e074df4c375a4afd0fd2081f7acc3",
                "md5": "73a3b50f36c1ed01dda4c37d66948dc0",
                "sha256": "c884cb4470bc17f9e71af39b8ca181c888c974c90f4b7d28f1810ea787ada08d"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "73a3b50f36c1ed01dda4c37d66948dc0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4288293,
            "upload_time": "2024-10-30T01:16:08",
            "upload_time_iso_8601": "2024-10-30T01:16:08.386794Z",
            "url": "https://files.pythonhosted.org/packages/82/a2/94c70dcd78fc5d84836183061cb0aa2e074df4c375a4afd0fd2081f7acc3/zipline_tej-2.1.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0ac68f6f0f23991c9c739804098b45ffd608284ac76c0cd035cd09524962d713",
                "md5": "b7623c3fd3378960b1e9c08c95d7f078",
                "sha256": "48fd80744f7a30cf1b52a85620ed2bc45334a2318b01017a9aa562c08cc57ef3"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp39-cp39-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b7623c3fd3378960b1e9c08c95d7f078",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 4325691,
            "upload_time": "2024-10-30T01:16:09",
            "upload_time_iso_8601": "2024-10-30T01:16:09.775138Z",
            "url": "https://files.pythonhosted.org/packages/0a/c6/8f6f0f23991c9c739804098b45ffd608284ac76c0cd035cd09524962d713/zipline_tej-2.1.0-cp39-cp39-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "579889f09ba65b2d73108e36f7b427f75d0e7c5d215df7801c0e47a0cea93ce8",
                "md5": "56f314e70c6d15ed5fdbbf506aaf532a",
                "sha256": "6cbae79a0f830c644d3b14671d1e2f045a1f56b10ea4844dea6fb31a6d32aeeb"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "56f314e70c6d15ed5fdbbf506aaf532a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 4194356,
            "upload_time": "2024-10-30T01:16:11",
            "upload_time_iso_8601": "2024-10-30T01:16:11.466711Z",
            "url": "https://files.pythonhosted.org/packages/57/98/89f09ba65b2d73108e36f7b427f75d0e7c5d215df7801c0e47a0cea93ce8/zipline_tej-2.1.0-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "51536c6dabff19307e569e1c8f9a197d5e1518191cc3124b89337fe99a7f1d26",
                "md5": "34c992b04282fba922baa47040e59c15",
                "sha256": "37d60cd80b0c1dfbe58d2dc981af87959523a762956df819ea2fd97131c8e87f"
            },
            "downloads": -1,
            "filename": "zipline_tej-2.1.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "34c992b04282fba922baa47040e59c15",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 4131888,
            "upload_time": "2024-10-30T01:16:14",
            "upload_time_iso_8601": "2024-10-30T01:16:14.885560Z",
            "url": "https://files.pythonhosted.org/packages/51/53/6c6dabff19307e569e1c8f9a197d5e1518191cc3124b89337fe99a7f1d26/zipline_tej-2.1.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-30 01:15:53",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "tejtw",
    "github_project": "zipline-tej",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "zipline-tej"
}
        
tej
Elapsed time: 1.30497s