Skip to main content

Alpha Library: A high-performance rolling window calculation library implemented in Rust with Python bindings. Used for financial data analysis and factor research.

Project description

alpha-lib

High-performance quantitative finance algorithm library, implemented in Rust with Python bindings (PyO3).

Provides efficient rolling-window calculations commonly used in factor-based quantitative trading.

Performance

Benchmarked on Alpha 101, 4000 stocks x 261 trading days (1,044,000 data points per factor):

Implementation Factors Data Load Compute Total Speedup
pandas 75 31.2s 2,643s 2,675s (44min) 1x
polars_ta 81 0.3s 58s 58s 46x
alpha-lib 101 0.3s 3.6s 3.9s 729x

See COMPARISON.md for per-factor timing and correctness analysis.

Installation

pip install py-alpha-lib

Usage

Context Settings

Control computation behavior via alpha.set_ctx():

  • groups — Number of securities in the data array. Each group is processed independently and in parallel. Required for cross-sectional operations like RANK.

  • start — Starting index for calculation (default: 0).

  • end — Ending index for calculation (default: len(data)). end can be used when you want to calculate only a part of the data. for example, when back test iteratively.

  • flags — Bitwise flags:

    • FLAG_SKIP_NAN (1): Skip NaN values in rolling windows.
    • FLAG_STRICTLY_CYCLE (2): Return NaN until window is full (matches pandas rolling() default).
    • Combine with |: flags=FLAG_SKIP_NAN | FLAG_STRICTLY_CYCLE
    import alpha
    import numpy as np
    
    data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float64)
    
    # 3-period moving average (partial results during warm-up)
    result = alpha.MA(data, 3)
    # [1.  1.5 2.  3.  4.  5.  6.  7.  8.  9.]
    
    # Strict mode: NaN until window is full
    alpha.set_ctx(flags=alpha.FLAG_STRICTLY_CYCLE)
    result = alpha.MA(data, 3)
    # [nan nan 2.  3.  4.  5.  6.  7.  8.  9.]
    
    # Skip NaN values
    alpha.set_ctx(flags=alpha.FLAG_SKIP_NAN)
    data_nan = np.array([1, 2, np.nan, 4, 5, 6, 7, 8, 9, 10], dtype=np.float64)
    result = alpha.MA(data_nan, 3)
    #[1.    1.5     nan 2.333 3.667 5.    6.    7.    8.    9.   ]
    

Example 1: Plug and Play

import alpha
from alpha.context import ExecContext

# ExecContext auto-infers groups from securityid/tradetime columns
# and calls alpha.set_ctx(groups=...) automatically
data = pl.read_csv("data.csv").sort(["securityid", "tradetime"])
ctx = ExecContext(data)

# Call operators directly on numpy arrays
close = data["close"].to_numpy()
ma20 = alpha.MA(close, 20)
rank = alpha.RANK(close)       # cross-sectional rank (groups auto-configured)
corr = alpha.CORR(close, data["vol"].to_numpy().astype(float), 10)

Data layout: flat 1D array [stock1_day1, stock1_day2, ..., stockN_dayM], sorted by security then time. The groups parameter tells the library where each stock's data begins.

Example 2: Factor Expression Transpiler

Convert factor expressions to Python code, then run:

python -m alpha.lang examples/wq101/alpha101.txt
# 3. Use generated code
from alpha.context import ExecContext
from factors import alpha_001

data = pl.read_csv("data.csv").sort(["securityid", "tradetime"])
ctx = ExecContext(data)  # auto-infers groups
result = alpha_001(ctx)

Factor expression to Python code

You can convert factor expressions to Python code using the lang module. For example:

python -m alpha.lang examples/wq101/alpha101.txt

This will read the factor expressions from examples/wq101/alpha101.txt and generate corresponding Python code using alpha-lib functions.

After generating the code, you may need to adjust the code

  • Fix type conversions between float and bool.
  • Add context settings if needed.

Benchmarking and Full Examples

GTJA Alpha 191

Implementation of 190/191 factors from the GTJA (国泰君安) Alpha 191 factor set in examples/gtja191/:

Metric Value
Computable 190 / 191
Compute time ~4.5s (4000 stocks × 261 days)
Avg per factor 24ms
python -m examples.gtja191.al 143     # run specific factor
python -m examples.gtja191.al          # run all factors

WorldQuant Alpha 101

Full implementation of 101 Formulaic Alphas in examples/wq101/:

  • al/ — alpha-lib implementation (Rust backend)
  • pd_/ — pandas reference (DolphinDB port)
  • pl_/ — polars_ta reference
examples/wq101/main.py --with-al 1 2 3 4 # Run specific factors
examples/wq101/main.py --with-al -s 1 -e 102 # Run all factors
examples/wq101/main.py --with-pd --with-al -s 1 -e 15 # Compare with pandas

Benchmark scripts in benchmarks/.

Supported Algorithms

Naming Rules:

  • Function starts with CC_ means it is a cross-commodity/cross-security/cross-group operation.
  • Function without prefix means it is a rolling window operation.
Name Description
BACKFILL Forward-fill NaN values with the last valid observation
BARSLAST Calculate number of bars since last condition true
BARSSINCE Calculate number of bars since first condition true
BINS Discretize the input into n bins, the ctx.groups() is the number of groups
CC_RANK Calculate rank percentage cross group dimension, the ctx.groups() is the number of groups Same value are averaged
CC_ZSCORE Calculate cross-sectional Z-Score across groups at each time step
CORR Time Series Correlation in moving window on self
CORR2 Calculate two series correlation over a moving window
COUNT Calculate number of periods where condition is true in passed periods window
COUNT_NANS Count number of NaN values in a rolling window
COV Calculate Covariance over a moving window
CROSS For 2 arrays A and B, return true if A[i-1] < B[i-1] and A[i] >= B[i] alias: golden_cross, cross_ge
DMA Exponential Moving Average current = weight * current + (1 - weight) * previous
EMA Exponential Moving Average (variant of well-known EMA) weight = 2 / (n + 1)
ENTROPY Calculate rolling Shannon entropy over a moving window
FRET Future Return
GROUP_RANK Calculate rank percentage within each category group at each time step
GROUP_ZSCORE Calculate Z-Score within each category group at each time step
HHV Find highest value in a preceding periods window
HHVBARS The number of periods that have passed since the array reached its periods period high
INTERCEPT Linear Regression Intercept
KURTOSIS Calculate rolling sample excess Kurtosis over a moving window
LLV Find lowest value in a preceding periods window
LLVBARS The number of periods that have passed since the array reached its periods period low
LONGCROSS For 2 arrays A and B, return true if previous N periods A < B, Current A >= B
LWMA Linear Weighted Moving Average
MA Simple Moving Average, also known as arithmetic moving average
MIN_MAX_DIFF Calculate rolling min-max difference (range) over a moving window
MOMENT Calculate rolling k-th central moment over a moving window
NEUTRALIZE Neutralize the effect of a categorical variable on a numeric variable
PRODUCT Calculate product of values in preceding periods window
RANK Calculate rank in a sliding window with size periods
RCROSS For 2 arrays A and B, return true if A[i-1] > B[i-1] and A[i] <= B[i] alias: death_cross, cross_le
REF Right shift input array by periods, r[i] = input[i - periods]
REGBETA Calculate Regression Coefficient (Beta) of Y on X over a moving window
REGRESI Calculate Regression Residual of Y on X over a moving window
RLONGCROSS For 2 arrays A and B, return true if previous N periods A > B, Current A <= B
SCAN_ADD Conditional cumulative add: r[t] = r[t-1] + (cond[t] ? input[t] : 0)
SCAN_MUL Conditional cumulative multiply: r[t] = r[t-1] * (cond[t] ? input[t] : 1)
SKEWNESS Calculate rolling sample Skewness over a moving window
SLOPE Linear Regression Slope
SMA Exponential Moving Average (variant of well-known EMA) weight = m / n
STDDEV Calculate Standard Deviation over a moving window
SUM Calculate sum of values in preceding periods window
SUMBARS Calculate number of periods (bars) backwards until the sum of values is greater than or equal to amount
SUMIF Calculate sum of values in preceding periods window where condition is true
VAR Calculate Variance over a moving window
WEIGHTED_DELAY Calculate weighted delay (exponentially weighted lag)
ZSCORE Calculate rolling Z-Score over a moving window

Full function signatures: python/alpha/algo.md

Development

Requirements:

  • Rust (latest stable)
  • Python 3.11+
  • maturin
# Build and install in development mode
maturin develop --release

# Run tests
cargo test

Vibe Coding

When adding new algorithms with LLM assistance, provide the function list as context. Use the skill add_algo.md for guided implementation.

This project is a co-created by Gemini (through Antigravity) and Claude (from tic-top).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_alpha_lib-0.2.1.tar.gz (169.4 kB view details)

Uploaded Source

Built Distributions

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

py_alpha_lib-0.2.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

py_alpha_lib-0.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (904.4 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

py_alpha_lib-0.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

py_alpha_lib-0.2.1-cp314-abi3-win_amd64.whl (821.5 kB view details)

Uploaded CPython 3.14+Windows x86-64

py_alpha_lib-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

py_alpha_lib-0.2.1-cp311-abi3-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ x86-64

py_alpha_lib-0.2.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (904.0 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

py_alpha_lib-0.2.1-cp311-abi3-macosx_11_0_arm64.whl (830.7 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file py_alpha_lib-0.2.1.tar.gz.

File metadata

  • Download URL: py_alpha_lib-0.2.1.tar.gz
  • Upload date:
  • Size: 169.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for py_alpha_lib-0.2.1.tar.gz
Algorithm Hash digest
SHA256 7bf4cf301298422cbff9c2d63c389385f953060eb1e9d9af08f8680b8f55699a
MD5 ce97b70291c43d5a6fb4eb22a6c7e729
BLAKE2b-256 a7da1c3ef8f8a6897448176b0ed07918b35e3b720f10b1f1bd29386ad7b57b9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1.tar.gz:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8d2e5795206842f1283d2026896d4a562e51eea4770aa678be50324df5aaede1
MD5 706cfdc3df4aeed0a48ff1977176fe60
BLAKE2b-256 e18d99a7c0f1f9bc1477c4cae004237f7be716d8d66751cd616770d6d6513fd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1b5d2937eca0a7a916e844444c69ba43495718b1b68b545595d4441b98191aee
MD5 8a16cd3b5e975c761919ab0655138d8e
BLAKE2b-256 236d4d3bd018c99921f557a09cbbefeab207e78b55f35c51e5a6bc9507b23e24

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d6e14f7470b55bd141b36224861f53bd5385e0f7fbaa08a6393b42295e8ab7c8
MD5 c74e22d1428c10c7ff0dbd0e9d13642e
BLAKE2b-256 80120ac85597a8788285b7e1edb7e3fad4ef12a9a5d8d6c97c4f4765a04348bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-cp314-abi3-win_amd64.whl.

File metadata

  • Download URL: py_alpha_lib-0.2.1-cp314-abi3-win_amd64.whl
  • Upload date:
  • Size: 821.5 kB
  • Tags: CPython 3.14+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for py_alpha_lib-0.2.1-cp314-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a98cbddf692160d7abed85de01b57b86bfe09cc090a7a46201539e608c1ad7cc
MD5 ed07d499a870f7c529dcd791882350b5
BLAKE2b-256 420a3193199ca067f552ae8557a8e75fce54a41d7aeef0821cc1d6aae7e64c4d

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-cp314-abi3-win_amd64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 43dc1474831081673a5e3bbd2731dd2d47730bed6c603fecd02367fd43a5324d
MD5 2029853694a502093baf11fcfba5a112
BLAKE2b-256 d7f821d5e785355950fd5e5c65d9ed7287c9888c8ca97e665e119f176fef7e7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f3b617440bffda81903839ef64f3d3a264ee7e7873a08bb0e6ee047a46a23560
MD5 ce8ab4fb258ee59d923bb9b5113f1862
BLAKE2b-256 3cedb6b5beab4857a4e2e92fe9d011daa9d4bac98e976aa588fda44bd91c3200

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-cp311-abi3-musllinux_1_2_x86_64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1a579e7d47efd072e3fe555a72b2075d56d3a92b26fdb2b4ecc7920caeab0032
MD5 825673a13d7d4173e206cfc08b53141f
BLAKE2b-256 cb48f87b8f7dd85d226e330ae701f94577af7bc0dc0bb7fd8a442b093bb61abe

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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

File details

Details for the file py_alpha_lib-0.2.1-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for py_alpha_lib-0.2.1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 801c97fff94bf500d37429c41ee172b0b2717fd26de7ac7c9d9bec675e7ecfc4
MD5 d290801a8cb386ae5e6d4afabf78430d
BLAKE2b-256 2d89d4ceeb4a83ce817a67349d4d3ce4c183744d56357075383c0da66c289495

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_alpha_lib-0.2.1-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: CI.yml on msd-rs/py-alpha-lib

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