Skip to main content

sharpebench (Python)

Is my Sharpe real, or an artifact of luck and multiple testing?

Python distribution of SharpeBench's honest-backtest statistics, a pyo3 binding over the same deterministic Rust kernel the SharpeBench CLI and the @general-liquidity/sharpebench npm package use. Bring your own return series; everything takes plain numeric sequences (lists, tuples, numpy arrays, df["ret"].to_numpy()) and returns plain floats, lists and dicts.

import numpy as np
from sharpebench import is_my_sharpe_real, bootstrap_dsr_ci

returns = df["strategy_ret"].to_numpy()          # per-period, NOT annualized

# n_trials is the honest one: how many variants did you try before keeping this?
v = is_my_sharpe_real(returns, n_trials=200)
print(v["sharpe"], v["deflated_sharpe"], v["verdict"], v["explanation"])

ci = bootstrap_dsr_ci(returns, n_trials=200)
print(ci["lower"], ci["point"], ci["upper"])

Surface

Function Answers
sharpe_ratio(returns) observed per-period Sharpe
moments(returns, target=0.0) mean / std / skew / kurtosis / downside deviation / Sortino
probabilistic_sharpe_ratio(returns, sr_benchmark=0.0) P(true Sharpe > benchmark) (PSR)
deflated_sharpe_ratio(returns, n_trials, trials_sr_std=0.5) PSR deflated for the size of the search (DSR)
expected_max_sharpe(trials_sr_std, n_trials) the Sharpe the best of n_trials shows with zero skill
min_track_record_length(returns, ...) periods needed before the Sharpe is believable
bootstrap_dsr_ci(returns, n_trials, ...) {point, se, lower, upper} on the DSR itself
bootstrap_pvalue(excess, ...) stationary-bootstrap p-value for one series
is_my_sharpe_real(returns, n_trials=1, ...) LITE verdict dict: pass | borderline | fail + explanation
is_my_sharpe_real_full(field, ...) FULL verdict over a whole candidate field (LITE + snooping family + PBO + HLZ)
reality_check_pvalue(field, ...) White's Reality Check over the field
spa_pvalue / spa_consistent_pvalue(field, ...) Hansen's SPA (liberal / consistent)
step_down_significant(field, ..., alpha=0.05) Romano-Wolf step-down, per candidate, FWER-controlled
probability_of_backtest_overfitting(perf_matrix, s=16) CSCV PBO
benjamini_hochberg(p_values, q=0.05) / fdr_verdict(...) BH-FDR rejections and the operator summary
hlz_gate(t_stat, t_threshold=None) the Harvey-Liu-Zhu |t| >= 3.0 factor bar
selection_robustness(candidates, n_trials, ...) best vs median DSR: is the headline a lucky pick?
runs_for_power(effect, alpha, power) how many runs to detect an effect
pass_k(passed_per_run, mode="all", n=None) pass^k reliability: won on every run, not on average

Matrix orientation

Two conventions, deliberately unchanged from the papers they come from:

  • the data-snooping family (reality_check_pvalue, spa_*, step_down_significant, is_my_sharpe_real_full) takes a field: N rows (strategies) x T cols (time);
  • probability_of_backtest_overfitting takes the transpose: T rows (time) x N cols (strategies).

Determinism

No I/O, no clock, no ambient randomness. The bootstraps take an explicit seed (defaulted to a fixed constant, so a result is reproducible unless you ask for otherwise). The same input yields byte-identical output on any platform.

Relationship to sharpearena

sharpearena is the environment: a leak-free, point-in-time arena where a trading agent produces a track, scored end-to-end by score_run. sharpebench is the judge for a track you already have: your own backtest, live P&L, or a field of candidate strategies. They share one Rust statistics kernel, so the verdict is identical either way; this package simply does not, and will not, duplicate arena run-scoring.

Building from source

python -m pip install maturin
python -m maturin develop --manifest-path crates/sharpebench-py/Cargo.toml
python -m pytest crates/sharpebench-py/tests

MIT OR Apache-2.0.

Download files

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

Source Distribution

sharpebench-0.3.0.tar.gz (150.6 kB view details)

Uploaded Source

Built Distributions

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

sharpebench-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (318.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

sharpebench-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (319.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

sharpebench-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (322.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

sharpebench-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (322.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

Details for the file sharpebench-0.3.0.tar.gz.

File metadata

  • Download URL: sharpebench-0.3.0.tar.gz
  • Upload date:
  • Size: 150.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sharpebench-0.3.0.tar.gz
Algorithm Hash digest
SHA256 b6375074f22a2733cfb1ffb48322a463bd9b76a7a399eeec2e76cc9b410aabc9
MD5 9c987f165bf2846ece3a74333c56ad79
BLAKE2b-256 44f0f6bd213cfffa127509236c4ce7b084d33d7a4481d6740fa783f0e4fa350f

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.3.0.tar.gz:

Publisher: release.yml on general-liquidity/sharpebench

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

File details

Details for the file sharpebench-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 17efdb3197cc8b998c76a0a3f0925b1615849ac7ff5679841125e726d09f7c04
MD5 a0feb624ef27e96ac4b4e01b25cba33a
BLAKE2b-256 b21b44b69116c22bb090e31a2a85065f0163de8a91b1b08a8d45a0c4e991c4cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on general-liquidity/sharpebench

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

File details

Details for the file sharpebench-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5dc07aa6e742d6f5fe084dfcfad75743a4753ea5637034bbba78cc9732edd9a8
MD5 3ad692614c352d0b1e08015d2e348e03
BLAKE2b-256 8f2c173fb551f9af8a86fd1d06342cc898cc4a1c5cd489dadf031e79206b2a3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on general-liquidity/sharpebench

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

File details

Details for the file sharpebench-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7e8f21d6752232fdeeb33b04319d39dfa399f00db489c37e481cc65dd25a339f
MD5 bf560e41d1d464bf80c6e1de5bae417b
BLAKE2b-256 dc471d46a85238032f54f9d22dce14ae59a770954dc17c474b35e5894d4c19e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on general-liquidity/sharpebench

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

File details

Details for the file sharpebench-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 86cfed8f518baa646630dd6715e147324c0a6e2948d1264a9307a73efdb6564c
MD5 3ed272feded83f6e90eb15ba6b875d77
BLAKE2b-256 a23e526e17256f3b8411aec3750f41ae81d780cbde6ca2838daeabc35106e252

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on general-liquidity/sharpebench

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

Release history Release notifications | RSS feed

0.16.0

5 files

0.15.0

5 files

0.14.1

5 files

0.14.0

5 files

0.13.0

5 files

0.12.0

5 files

0.11.0

5 files

0.10.0

5 files

0.9.0

5 files

0.8.0

5 files

0.7.0

5 files

0.6.0

5 files

0.5.0

5 files

0.4.0

5 files

This release

0.3.0 This release

5 files

0.2.1

5 files

0.2.0

5 files

0.1.0

5 files

0.0.14

5 files

0.0.13

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page