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.10.0.tar.gz (195.9 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.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (519.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

sharpebench-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (520.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

sharpebench-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (524.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

sharpebench-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (524.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

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

File metadata

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

File hashes

Hashes for sharpebench-0.10.0.tar.gz
Algorithm Hash digest
SHA256 9d4b10bd3c8a96e8f856aeb78f6f8cb07d13b6b9312128bdd7fe82a304604187
MD5 23df6b745cb2b6fbe4bbd91da2dbd860
BLAKE2b-256 f7944f9f2b7e6e06e6eca80ec42ed23c5d1aa55d8686885ab88dcf0c5043ca46

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.10.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.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f145297347484912aab2b3be81b6f1e10d30e52978b4d08dc22e7140b7802946
MD5 6695b324c8989b37344412ad6844f614
BLAKE2b-256 833624928b291944e33e5dec3b6949240023eb258a6eafb216ad8752d4f0b8fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.10.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.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3304ef3ef7ca0cb76999543d4031fdd60d834d89cc2e0e7adc2037d9ccc61e21
MD5 29a243618d3e39bfa2796d3f51ec9289
BLAKE2b-256 59dff7bb105825d27629b2d10c3f3387369f6a2ead9c06b9641fb3863d1a8d27

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.10.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.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b06bc966fbfdf4ab40e4ab344023a48c9a3fc155407e45761c39fd53f0feee84
MD5 1ec01c865b85d5be0c9b128cc3db12ab
BLAKE2b-256 416c2d84057ec92c67e63446fbd85f2a6c67bf926c5281ebfdadf6fd46008b86

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.10.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.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sharpebench-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64fff7b06cb7058bed05a65ba2878ca17395350e9b892abe307c30064f1fcab7
MD5 3e05aa09717d164da456b371b8de6215
BLAKE2b-256 03b86a4014be27502491f164736feb1452574176243b69b3c41af29c0ac89e7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for sharpebench-0.10.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

This release

0.10.0 This release

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

0.3.0

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