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.
-
Windows (zipline-tej.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. Andfundamentals
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
orfundamentals
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]:
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
- For more tutorials
Suggestions
- To get TEJAPI_KEY (link)
- TEJ Official Website
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
Built Distributions
File details
Details for the file zipline_tej-2.1.0rc2-cp311-cp311-win_amd64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 792c20ee7b83eefd9ba7f9e9e22c6dcdee5e6a8e46395eeb9836f91213c0318f |
|
MD5 | 06be08a870f5e770e07a5426e129658e |
|
BLAKE2b-256 | 96f7a46aec35be046c655221a5f9c10e133d225f894f3f00706a1fb3a1e6c017 |
File details
Details for the file zipline_tej-2.1.0rc2-cp311-cp311-macosx_11_0_arm64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4896c672e2a53d668c3e3350dbe113773e45bdd0b7c091e040015dbc634637c7 |
|
MD5 | 17878ce5ab00295732ed823e1f905ad9 |
|
BLAKE2b-256 | 367be8e1a83105f1c95bff5422a5166c35169b973d62135bb2b28e07a6062bf9 |
File details
Details for the file zipline_tej-2.1.0rc2-cp311-cp311-macosx_10_15_x86_64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp311-cp311-macosx_10_15_x86_64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.11, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8898034315c9fc5f3264507c375bd6fddfdd6c989472edc8dd38bc2e43e95096 |
|
MD5 | 232a80a138606a7ca59b61f95d777923 |
|
BLAKE2b-256 | 5c1b6afbf395cd8cf093b417fac9f26758b1f941455c8aec9ed186fecf811894 |
File details
Details for the file zipline_tej-2.1.0rc2-cp310-cp310-win_amd64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8d12361bb2176b7ae161586220b40751dd0ee1b87b138dd6f53677de58a6ae00 |
|
MD5 | 9ffacc089b8906f03a5017d6b48f712c |
|
BLAKE2b-256 | 84a4c172fcfe5e13a96b6b719b44502deef903b3d7a30dc2d8718ce6b6d364f8 |
File details
Details for the file zipline_tej-2.1.0rc2-cp310-cp310-macosx_11_0_arm64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b89a0c2aa8317a96ded42100ae9cebcbcec6dd1ff4d6ab616904a84f7caaf753 |
|
MD5 | 107efc4b55464f63a7f8d7f6774f24a6 |
|
BLAKE2b-256 | 922b9973556dd9882a193571ba68d1a5d114784a4c71874cb743a8ef8dd3042d |
File details
Details for the file zipline_tej-2.1.0rc2-cp310-cp310-macosx_10_15_x86_64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp310-cp310-macosx_10_15_x86_64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.10, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b45b4ee7e8e659c08bcc94685a53fba17bacc4427be872fb7a822c30b3030407 |
|
MD5 | 3bd2291e27192a3070a510e2aefbc226 |
|
BLAKE2b-256 | 3740328c665ce163904bd1c9fa338e9ecaafb5a405f518f46a0e9d05b6c1cf9a |
File details
Details for the file zipline_tej-2.1.0rc2-cp39-cp39-win_amd64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a0b9c292eef1f4771c0095e261417f943b81f6c96fa15fed429092c2791a517d |
|
MD5 | 7acc0f36bf0c7a340c84cd43e6151fb4 |
|
BLAKE2b-256 | 7b24b35dcacf8ac3db7796d1c182bd93d6968f9082dff21d24517d1890efbc92 |
File details
Details for the file zipline_tej-2.1.0rc2-cp39-cp39-macosx_11_0_arm64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fd8da1783bcf1637c6d7e856c5d5981bdaaf457255e623e204794fd47809eb88 |
|
MD5 | 55dd8cc2aa9664281b354e8b7110a09a |
|
BLAKE2b-256 | 69cad77ea237810eb261885ffda3613ca51ee034eae38aacf544a8d8be79bb4f |
File details
Details for the file zipline_tej-2.1.0rc2-cp39-cp39-macosx_10_15_x86_64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp39-cp39-macosx_10_15_x86_64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.9, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | abdb104a9aa74b8603ef87e3ad76c4cd4229b5d172774945583e4aaffb854d42 |
|
MD5 | 133a3ef2d26d69a8fe6b8ec62ea1ac2a |
|
BLAKE2b-256 | 1148949658cd53e5dce9b602ffc82e8e9e9e8d8af9ffeacc7a08f4df8e3faa29 |
File details
Details for the file zipline_tej-2.1.0rc2-cp38-cp38-win_amd64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 066e8ea02e040f0adc8550a33bb02d4075b0ce3942b46a0a43b7786a7d3463b6 |
|
MD5 | d94fa1b27c5df60c027bb6aafc223003 |
|
BLAKE2b-256 | ca54ed6db277984c4081cd915bedae909888d71ace6c42a86253a64828b00405 |
File details
Details for the file zipline_tej-2.1.0rc2-cp38-cp38-macosx_11_0_arm64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp38-cp38-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.8, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4214f782fc0dd719f6c0171f44d399661a8d7e035d50cc9bae1d0250b9b30bfc |
|
MD5 | b4d98a2e7ad095ec9c80fe359dc4ff74 |
|
BLAKE2b-256 | 5d2d41ad2795cda092599053ed2263ef8a6f437ea682ab1ad57595a884612c2e |
File details
Details for the file zipline_tej-2.1.0rc2-cp38-cp38-macosx_10_15_x86_64.whl
.
File metadata
- Download URL: zipline_tej-2.1.0rc2-cp38-cp38-macosx_10_15_x86_64.whl
- Upload date:
- Size: 4.5 MB
- Tags: CPython 3.8, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd128e6214029be4b4ca254cc9d9ea6561d1ca13b901a4a867f0d16ebf3c9f40 |
|
MD5 | 275638d211a4fad5b98d6e3d4d76440b |
|
BLAKE2b-256 | e4771d77c1b30b080c0bcd9656208ebfca69370e9757192ea185e53296a14c56 |