Skip to main content

A compiler, optimizer and executor for financial expressions and factors

Project description

KunQuant

Kun

KunQuant is a optimizer, code generator and executor for financial expressions and factors, e.g. (close - open) /((high - low) + 0.001). The initial aim of it is to generate efficient implementation code for Alpha101 of WorldQuant and Alpha158 of Qlib. Some existing implementations of Alpha101 is straightforward but too simple. Hence we are developing KunQuant to provide optimizated code on a batch of general customized factors.

This project has mainly two parts: KunQuant and KunRunner. KunQuant is an optimizer & code generator written in Python. It takes a batch of financial expressions as the input and it generates highly optimized C++ code for computing these expressions. KunRunner is a supporting runtime library and Python wrapper to load and run the generated C++ code from KunQuant. Startring from version 0.1.0, KunQuant no longer depends on cmake to run the generated factor code. Users can use pure Python interfaces to build and run factors.

Experiments show that KunQuant-generated code can be more than 170x faster than naive implementation based on Pandas. We ran Alpha001~Alpha101 with Pandas-based code and our optimized code. See results below:

Datatype Pandas-based KunQuant 1-thread KunQuant 4-threads
Single precision (STs layout) 6.138s 0.083s 0.027s
Double precision (TS layout) 6.332s 0.120s 0.031s

The data was collected on 4-core Intel i7-7700HQ CPU, running synthetic data of 64 stocks with 260 rows of data. Environment:

OS=Ubuntu 22.04.3 on WSL2 on Windows 10
python=3.10.2
pandas=2.1.4
numpy=1.26.3
g++=11.4.0

We also support Nvidia GPU backend. Benchmarks show that RTX5080 can achieve ~5x performance of Intel 14900KF (8 P-cores + 16 E-cores, 32 threads in total) in single precision data. The following run-time is collected on Alpha101 (time-length=2600, num-stocks=1024):

Datatype KunQuant on 32 threads 14900KF KunQuant-MLIR on RTX5080
Single precision 1.04s 0.22s
Double precision 1.67s 2.67s

In the benckmarks above, both input and output data are on CPU, and the CPU-GPU transmission time has been taken into account. Also note that double precision FLOPs is very low on Nvidia gaming GPU by hardware design.

Supported features of KunQuant

  • Batch mode and stream mode for the input
  • Double and single precision float point data type
  • TS or STs memory layout as input/output in batch mode
  • Python/C/C++ interfaces to call the factor computation functions
  • x86 and ARM CPUs are supported. Linux, Windows and macOS are supported.
  • New in KunQuant-MLIR: Nvidia GPU support. See cuda.md.

Important node: For better performance compared with Pandas, KunQuant suggests to use a multiple of {blocking_len} as the number of stocks in inputs. For single-precision float type and AVX2 instruction set, blocking_len=8. That is, you are suggested to input 8, 16, 24, ..., etc. stocks in a batch, if your code is compiled with AVX2 (without AVX512) and float datatype. Other numbers of stocks are supported, with lower execution performance.

The support matrix of KunQuant

OS(CPU) macOS (Apple Silicon) macOS (x86) Windows (x86) Linux (Ubuntu,x86) Linux (Ubuntu,aarch64)
Install via pip install KunQuant
Tested in CI

Why KunQuant is fast

  • KunQuant parallelizes the computation for factors and uses SIMD (AVX2) to vectorize them.
  • Redundant computation among factors are eliminated: Think what we can do with sum(x), avg(x), stddev(x)? The result of sum(x) is needed by all these factors. KunQuant also automatically finds if a internal result of a factor is used by other factors and try to reuse the results.
  • Temp buffers are minimized by operator-fusion. For a factor like (a+b)/2, pandas and numpy will first compute the result of (a+b) and collect all the result in a buffer. Then, /2 opeator is applied on each element of the temp buffer of (a+b). This will result in large memory usage and bandwidth. KunQuant will generate C++ code to compute (a[i]+b[i])/2 in the same loop, to avoid the need to access and allocate temp memory.

Sponsor this project!

Sponsor the author @Menooker

Installing KunQuant

Install a released version:

pip install KunQuant

Or install the latest version on main branch

pip install -i https://testpypi.python.org/simple KunQuant

KunQuant supports Windows (MSVC needs to be installed) and Linux (g++ or clang needs to be installed). Please make sure a working C++ compiler with C++11 support is properly installed and configured in your system

On x86-64 CPUs, AVX2-FMA is used by default in the installed KunQuant core library. To run on older CPUs with AVX and without AVX2, you need to build and install KunQuant from source and set environment variable KUN_NO_AVX2=1 before building. See Build from source and developing tips below.

Example: Build & Run Alpha101

This section serves as am example for compiling an existing factor library: Alpha101 and running it. Building and running your own factors will be similar. If you are only interested in how you can run Alpha101 factors, this section is all you need.

First, import KunQuant and necessary modules

from KunQuant.jit import cfake
from KunQuant.Driver import KunCompilerConfig
from KunQuant.Op import Builder, Input, Output
from KunQuant.Stage import Function
from KunQuant.predefined import Alpha101
from KunQuant.runner import KunRunner as kr

Then build a Function object and generete predefined factor alpha001 in Alpha101:

builder = Builder()
with builder:
    vclose = Input("close")
    low = Input("low")
    high = Input("high")
    vopen = Input("open")
    amount = Input("amount")
    vol = Input("volume")
    all_data = Alpha101.AllData(low=low,high=high,close=vclose,open=vopen, amount=amount, volume=vol)
    Output(Alpha101.alpha001(all_data), "alpha001")
f = Function(builder.ops)

You can review the alpha001 expression by print(f). And you will get output

v0 = Input@{name:close}()
v2 = Div@(v0,v1)
v3 = SubConst@{value:1.0}(v2)
v4 = LessThanConst@{value:0.0}(v3)
v5 = WindowedStddev@{window:20}(v3)
v6 = Select@(v4,v5,v0)
v7 = Mul@(v6,v6)
v8 = TsArgMax@{window:5}(v7)
v9 = Rank@(v8)
v10 = Output@{name:alpha001}(v9)

Then compile it into an executable object (it may takes a few seconds to compile. If you encounter an subprocess error, please make sure MSVC or g++ is installed).

lib = cfake.compileit([("alpha101", f, KunCompilerConfig(input_layout="TS", output_layout="TS"))], "out_first_lib", cfake.CppCompilerConfig())
modu = lib.getModule("alpha101")

We will explain the function cfake.compileit in Customize.md. Let's continue to see how to use the compiled lib.

Load your stock data. In this example, load from local pandas files. We assume the open, close, high, low, volumn and amount data for different stocks are stored in different files.

import pandas as pd

# we need a multiple of 8 number of stocks
watch_list = ["000002", "000063", ...]
num_stocks = len(watch_list)
df = []

for stockid in watch_list:
    d = pd.read_hdf(f"{stockid}.hdf5")
    df.append(d)

print(df[0])

cols = df[0].columns.values
col2idx = dict(zip(cols, range(len(cols))))
print("columns to index", col2idx)
num_time = len(df[0])
print("dimension in time", num_time)

Here we printed the data frame of the first stock and the column-index mapping, it should look like:

                 open       high        low      close       volume        amount
date                                                                             
2020-01-02  32.799999  33.599998  32.509998  32.560001  101213040.0  3.342374e+09
2020-01-03  32.709999  32.810001  31.780001  32.049999   80553632.0  2.584310e+09
2020-01-06  31.750000  31.760000  31.250000  31.510000   87684056.0  2.761449e+09
...               ...        ...        ...        ...          ...           ...
2024-01-30  10.000000  10.050000   9.790000   9.790000   79792704.0  7.903654e+08
2024-01-31   9.770000   9.850000   9.560000   9.600000   67478864.0  6.527274e+08
2024-02-01   9.530000   9.660000   9.420000   9.440000   62786032.0  5.980486e+08

[993 rows x 6 columns]
columns to index {'open': 0, 'high': 1, 'low': 2, 'close': 3, 'volume': 4, 'amount': 5}
dimension in time 993

Transform your pandas data to numpy array of shape [features, stocks, time]. Feature here means the columns for open, close, high, low, volumn and amount.

import numpy as np

# [features, stocks, time]
collected = np.empty((len(col2idx), num_stocks, len(df[0])), dtype="float32")
for stockidx, data in enumerate(df):
    for colname, colidx in col2idx.items():
        mat = data[colname].to_numpy()
        collected[colidx, stockidx, :] = mat

Transpose the matrix to [features, time, stocks]

# [features, stocks, time] => [features, time, stocks]
transposed = collected.transpose((0, 2, 1))
transposed = np.ascontiguousarray(transposed)

Now fill the input data in a dict of {"open": matrix_open, "close": ...}

input_dict = dict()
for colname, colidx in col2idx.items():
    input_dict[colname] = transposed[colidx]

Create an executor and compute the factors!

# using 4 threads
executor = kr.createMultiThreadExecutor(4)
out = kr.runGraph(executor, modu, input_dict, 0, num_time)
print("Result of alpha101", out["alpha001"])
print("Shape of alpha101", out["alpha001"].shape)

Each output factors are computed in an array of shape [time, stocks]. The output of above code can be:

Result of alpha001 [[   nan    nan    nan ...    nan    nan    nan]
 [   nan    nan    nan ...    nan    nan    nan]
 [   nan    nan    nan ...    nan    nan    nan]
 ...
 [0.6875 0.1875 0.1875 ... 0.6875 0.6875 0.6875]
 [0.6875 0.1875 0.1875 ... 0.6875 0.6875 0.6875]
 [0.4375 1.     0.875  ... 0.4375 0.4375 0.4375]]
Shape of alpha001 (993, 8)

By default, runGraph will allocate an numpy array for each of the output factor. However, you can preallocate a numpy array and tell KunRunner to fill in this array instead of creating new ones.

outnames = modu.getOutputNames()
out_dict = dict()
# [Factors, Time, Stock]
sharedbuf = np.empty((len(outnames), num_time, num_stocks), dtype="float32")
for idx, name in enumerate(outnames):
    out_dict[name] = sharedbuf[idx]
out = kr.runGraph(executor, modu, input_dict, 0, num_time, out_dict)
# results are in "out" and "sharedbuf"

Note that the executors are reusable. A multithread executor is actually a thread pool inside. If you want to run on multiple batches of data, you don’t need to create new executors for each batch.

KunQuant-MLIR: Compute your factors on Nvidia GPUs

You can run your factors on Nvidia GPUs for better performance. You need to install the package KunQuant-MLIR to enable the GPU backend. The usage and the interfaces of GPU backend is very similar to the CPU backend, which has been shown above. More on CUDA GPU backend, see cuda.md.

Customized factors

KunQuant is a tool for general expressions. You can further read Customize.md for how you can compile your own customized factors. This document also provides infomation on

  • building and keeping the compilation result for later use
  • Loading existing compiled factor library
  • enabling AVX512
  • select data types (float/double)
  • Memory layout

Build from source and developing tips

This section is for developer who would like to build KunQuant from source, instead of installing via pip.

Dependency

  • nanobind, nlohmann_json (automatically cloned via git as a submodule)
  • Python (3.9+ with f-string and dataclass support)
  • cmake
  • A working C++ compiler with C++17 support (e.g. clang, g++, msvc)
  • x86-64 CPU with at least AVX instruction set (AVX2-FMA is preferred and required by default), or ARM CPU with NEON instruction set.
  • Optionally requires AVX512 on CPU for better performance

Build and install

git clone https://github.com/Menooker/KunQuant --recursive
cd KunQuant
pip install .

Build in develop mode

If you would like to install KunQuant and edit it. You can use editable mode of python library.

Linux:

# export KUN_BUILD_TYPE=Debug    # to build debug version of KunQuant Runtime
# in the root directory of KunQuant
KUN_BUILD_TESTS=1 pip install -e . 

Windows powershell:

# in the root directory of KunQuant
$env:KUN_BUILD_TESTS=1
pip install -e . 

You can also set environment variable KUN_BUILD_TYPE=Debug before pip install -e . to enable debug build of KunQuant. It will provide debug info of the KunQuant runtime but also slow down the execution.

On x86-64 CPUs, AVX2-FMA is used by default in the built KunQuant core library. To run on older CPUs with AVX and without AVX2, you need to export environment variable KUN_NO_AVX2=1 before pip install -e ..

Useful environment variables

  • KUN_DEBUG=1 Print the internal results of each compiler pass
  • KUN_DEBUG_JIT=1 Print the C++ compilation internals, including command lines, temp results and etc.

Streaming mode

KunQuant can be configured to generate factor libraries for streaming, when the data arrive one at a time. See Stream.md

Utility functions

To compute row-to-row correlation (for IC/IR calculation) and aggregrating functions (like pd.groupby(...)), please see Utility.md.

Using C-style APIs

KunQuant provides C-style APIs to call the generated factor code in shared libraries. See CAPI.md

Operator definitions

See Operators.md

A few TA-Lib indicators (TRANGE, ATR, SAR) are also implemented as composite ops; see TA-Lib compatible ops.

To add new operators, see NewOperators.md

Testing and validation

Unit tests for some of the internal IR transformations:

python tests/test.py
python tests/test2.py

Unit tests for C++ runtime:

python tests/test_runtime.py

To run the runtime UTs, you need to make sure you have built the cmake target KunTest by

cmake --build . --target KunTest

Correctness test of Alpha101

# current dir should be at the base directory of KunQuant
python tests/test_alpha101.py

The input data are randomly genereted data and the results are checked against a modified (corrected) version of Pandas-based code. Note that some of the factors like alpha013 are very sensitive to numerical changes in the intermeidate results, because rank operators are used. The result may be very different after rank even if the input is very close. Hence, the tolerance of these factors will be high to avoid false positives.

To test Alpha158, you need first download the input data and reference result files: alpha158.npz and input.npz.

Then run

# current dir should be at the base directory of KunQuant
python tests/test_alpha158.py --inputs /PATH/TO/input.npz --ref /PATH/TO/alpha158.npz 

This script runs alpha158 with double precision mode in KunQuant. It feeds the library with predefined values from input.npz and check against the result with alpha158.npz, which is computed by qlib.

To generate another Alpha158 result with another randomly generated input, you can run

# current dir should be at the base directory of KunQuant
python ./tests/gen_alpha158.py --tmp /tmp/a158 --qlib /path/to/source/of/qlib --out /tmp

It will create the random input at /tmp/input.npz and result at /tmp/alpha158.npz

Acknowledgement

The implementation and testing code for Alpha101 is based on https://github.com/yli188/WorldQuant_alpha101_code

The implementation code for Alpha158 is based on https://github.com/microsoft/qlib/blob/main/qlib/contrib/data/handler.py. Licensed under the MIT License.

The AVX vector operators at cpp/KunSIMD/cpu was developed based on x86simd as a component of GraphCompiler, a backend of oneDNN Graph API. Licensed under the Apache License, Version 2.0 (the "License").

The MSVC environment configuration was originated from cupy, Licensed under the MIT License: https://github.com/cupy/cupy/blob/main/cupy/cuda/compiler.py

Project details


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

If you're not sure about the file name format, learn more about wheel file names.

kunquant-0.1.11-cp312-abi3-win_amd64.whl (509.2 kB view details)

Uploaded CPython 3.12+Windows x86-64

kunquant-0.1.11-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (266.0 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

kunquant-0.1.11-cp312-abi3-macosx_14_0_universal2.whl (228.0 kB view details)

Uploaded CPython 3.12+macOS 14.0+ universal2 (ARM64, x86-64)

kunquant-0.1.11-cp311-cp311-win_amd64.whl (512.5 kB view details)

Uploaded CPython 3.11Windows x86-64

kunquant-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (270.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

kunquant-0.1.11-cp311-cp311-macosx_14_0_universal2.whl (229.7 kB view details)

Uploaded CPython 3.11macOS 14.0+ universal2 (ARM64, x86-64)

kunquant-0.1.11-cp310-cp310-win_amd64.whl (512.2 kB view details)

Uploaded CPython 3.10Windows x86-64

kunquant-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (270.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

kunquant-0.1.11-cp310-cp310-macosx_14_0_universal2.whl (230.1 kB view details)

Uploaded CPython 3.10macOS 14.0+ universal2 (ARM64, x86-64)

kunquant-0.1.11-cp39-cp39-win_amd64.whl (513.0 kB view details)

Uploaded CPython 3.9Windows x86-64

kunquant-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (270.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

kunquant-0.1.11-cp39-cp39-macosx_14_0_universal2.whl (230.3 kB view details)

Uploaded CPython 3.9macOS 14.0+ universal2 (ARM64, x86-64)

File details

Details for the file kunquant-0.1.11-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: kunquant-0.1.11-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 509.2 kB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for kunquant-0.1.11-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f1281819b6ac4eecb8639a722dce5faa3c130f60f39c41de0816acd2dca1fb94
MD5 33295d752276097e151bfd5d56525c49
BLAKE2b-256 81c9abbe721afdc9adb5b1d47499431cb716e83f1e445cac33cc149182a5a15c

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp312-abi3-win_amd64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7fd991d4a7148cc30d9ef72719151c52de7aea200071f2511f33a2ee2c2a70b7
MD5 27b8ba38f4280d013e0200abd81edb72
BLAKE2b-256 97ddf1aec9bd5ad69a07e515ecbe75f752d541d772502693d020c43c266833b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp312-abi3-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp312-abi3-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 9b7d85af5ffbebd011f16f4493b49b03049b51f0dc9be065532d5538b9b2c384
MD5 dc3fa4ffdb4679fb16ce2b0dbab96be6
BLAKE2b-256 229f84b43de1eeb03a9607d9a78fd713cfe3e113489f065945a6b62de6af4b03

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp312-abi3-macosx_14_0_universal2.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: kunquant-0.1.11-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 512.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for kunquant-0.1.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 02a478680bcbfaa7722374abd196ff20374902d69d7e2605fc72789348a63a2f
MD5 51d882caf13429d50fcddef6d181200d
BLAKE2b-256 2bb4de3b59adb4efec556105150e107f3110b4cfa1bc435d07daf15bb6843821

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp311-cp311-win_amd64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e91162d250dc8905e23172d1c04b23f2bc51517d062124ce6bc48d2ed0503350
MD5 5efb72107f29bb841613e090242159d3
BLAKE2b-256 f1659910e5714e50114da4cbdc1aba3335c8119cd2ad4ca434677aacc00fecc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp311-cp311-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp311-cp311-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 558aba0dc43091c00775e1d87bc7426bd83ff78b3072724d82ae14e46705d4a3
MD5 17a574a37b92ad87fd59228425034a2c
BLAKE2b-256 f6a32a420276e6c919d35ea9bbda8992cb2f02d9c77526dd69d29967d7ecf38c

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp311-cp311-macosx_14_0_universal2.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: kunquant-0.1.11-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 512.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for kunquant-0.1.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2952e82b8d89616fceb17eb914acf5c464be42b24c9c81fe9193012a85cffabd
MD5 b839a30b04031146f272b95e08670f69
BLAKE2b-256 4528ba5df8388ed8bd384487d9212ebb2a764d5d46e9b5eadb2d5b802980ada9

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp310-cp310-win_amd64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a8fa5b96c17cfb6f2cb98600eb639cb1434b40e0553ecddc9e2f4fcb53d81856
MD5 da04fbe520827266c61b4ba0f07dbb41
BLAKE2b-256 2f9bf56950ab9450617bf3c7a72e1465259b48884061e0e6409b9ad2214f11fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp310-cp310-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp310-cp310-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 6626a356a003bbc1259a5134d6489d9047e691c8bf52c9450c344ab0ad7e9261
MD5 30433ee7852a5ee63ef01b88efd34967
BLAKE2b-256 9f4a987ea7e7ed24fe7ddb177dafe1d94c3afc4e75cf10c04405499caa5e6083

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp310-cp310-macosx_14_0_universal2.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: kunquant-0.1.11-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 513.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for kunquant-0.1.11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 75e5ebfdbbe86310b90101998115eeb2aba27e64b743c46acb47a5bf5a415151
MD5 59c2751e4fe97fb03b85eaacf07574af
BLAKE2b-256 4aea4f906f5ebb6d579460f4dbe5f84d5aa71969f4b55907d099e0389f2ec37c

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp39-cp39-win_amd64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 97db4ae961cf56730803be3ed7f7734d09c2054d5fc6af77b93db732156516a2
MD5 5b35f82a1ac0bf2a7056dbbbaf616d47
BLAKE2b-256 4d1a504f72caf54566666f2507449764b1398881744a0e3ef09e0b6f928055c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kunquant-0.1.11-cp39-cp39-macosx_14_0_universal2.whl.

File metadata

File hashes

Hashes for kunquant-0.1.11-cp39-cp39-macosx_14_0_universal2.whl
Algorithm Hash digest
SHA256 b8dd4ecb79ea971c089d409b07c5fe9a4c9bf4a33969344e0a61334c85b5d954
MD5 65f3befdecbfb0c9ca2fb3315f152a49
BLAKE2b-256 ca68ac6374f4319fdbbab5883e9d6192b9af45a7fae57977fdb2fc2661765b2c

See more details on using hashes here.

Provenance

The following attestation bundles were made for kunquant-0.1.11-cp39-cp39-macosx_14_0_universal2.whl:

Publisher: publish-to-test-pypi.yml on Menooker/KunQuant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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