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.0.14.tar.gz (93.4 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.0.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (317.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

sharpebench-0.0.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (317.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

sharpebench-0.0.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (321.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

sharpebench-0.0.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (321.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

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

File metadata

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

File hashes

Hashes for sharpebench-0.0.14.tar.gz
Algorithm Hash digest
SHA256 d7325a303b754b3191d70767e24a377adadda16b8ba952c67656182168dee0f9
MD5 ac62e085d085d16255d18c73fedc165f
BLAKE2b-256 344c7c6314f120224682ac9e85c45851c1f46df8dc3244ed1362e74e756d2bb8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sharpebench-0.0.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 43f871bb17af377effee673a74d060857fc5ae4ab2bf72518b775a866726c34c
MD5 c0e541055182a5bd1a0d7cb47132c938
BLAKE2b-256 2f6b8800bc2c8930961b4c4b3f7b2c1bfa95b78435e35e5d08bead75e1e398ea

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sharpebench-0.0.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1147c6911e41aafcf0a6af4f52cf155c24394515223b47b11a0e24cbe900ed78
MD5 5151f95ab422b5860b984d44211a9ca2
BLAKE2b-256 ffbc529e058438a17c52d6b81086b40a529ef5ea046ae550dd4f8fcb6aa0d026

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sharpebench-0.0.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 14d52eb5f1da01fcee66b8b7fcd82896af2eef39b7fde9fa3e32e3fb20a54e62
MD5 526974e1766661e5c588b1ab9efdb36d
BLAKE2b-256 7b2f55c778b5e87c98da4a63f49a56703801296dc1397e626bb14838678b6764

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for sharpebench-0.0.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5f838e3df808fa3506fdfa36a8960b7c252df52a61880cca582e6ae8db27fe01
MD5 1bb5b4462e328098c2aee44e37951fcc
BLAKE2b-256 a9825d946ce45073d0ded984d6642e8dba57fd86c4dbdd54f809d922a386326f

See more details on using hashes here.

Provenance

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

0.3.0

5 files

0.2.1

5 files

0.2.0

5 files

0.1.0

5 files

This release

0.0.14 This release

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