# Statistics reference > What each test measures, what it does not, and how to read a result that says no. Every test below is implemented in [`quant-integrity`](https://pypi.org/project/quant-integrity/), AGPL-3.0, and can be read, audited and run without this server. What the hosted server adds is the trial count these corrections are applied against. ## Deflated Sharpe ratio ``` stats_deflated_sharpe(strategy_id="...") ``` Bailey and López de Prado's correction. A Sharpe ratio selected as the best of N attempts is biased upward even when every underlying edge is zero — the maximum of N noisy draws is large by construction. The deflated Sharpe asks: given N trials, given the skew and kurtosis of these returns, what is the probability the true Sharpe exceeds zero? There is **no `n_trials` parameter**. The server reads the ledger. See [The trial ledger](/docs/concepts/ledger). Non-normality matters here, and crypto returns are not normal. The correction accounts for skew and excess kurtosis directly, which is why a fat tailed series with a nominally attractive Sharpe can deflate to nothing. ## Probability of backtest overfitting (PBO / CSCV) ``` stats_pbo(...) ``` Combinatorially symmetric cross-validation. The data is split into equal subsets; every combination is used as in-sample with the complement as out-of-sample; the configuration that ranked best in-sample is located in the out-of-sample ranking. PBO is the frequency with which the in-sample winner lands **below the out-of-sample median**. - PBO near 0 — selection is picking up something real. - PBO near 0.5 — selection is uninformative. - **PBO above 0.5 — selection is anti-predictive.** Choosing the in-sample best is worse than choosing at random, which usually means the thing being selected on is noise plus a cost artefact. CSCV requires **equal** subsets. Unequal ones break the symmetric construction the statistic is defined on. ## Minimum backtest length ``` stats_min_backtest_length(...) ``` How many years of history N trials actually require before an observed Sharpe of a given size is distinguishable from the best of N random draws: ``` MinBTL ≈ 2 · ln(N) / E[max SR]² ``` It is denominated in **years**. This is the tool that most often ends a line of research, which is the point. Resampling to a finer timeframe does not escape it. Finer bars are autocorrelated, not new information, and they multiply cost drag. ## Stationary bootstrap confidence intervals ``` stats_bootstrap_ci(...) ``` Politis–Romano stationary bootstrap on Sharpe and expectancy. Blocks of geometrically distributed length preserve the autocorrelation structure that an i.i.d. bootstrap would destroy. **On a marginal strategy the interval will straddle zero. That is the tool working.** An interval that straddles zero is not a failure to be re-run with different settings; it is the answer. Bootstrap p-values use `(1 + count) / (B + 1)`, so a finite number of replications can never report exactly zero. ## Reality check and SPA ``` stats_reality_check(...) ``` White's Reality Check and Hansen's Superior Predictive Ability test: is the *best* strategy in a set better than a benchmark, accounting for the fact that you looked at the whole set? Romano–Wolf stepdown reports the full rejection count alongside the truncated display, so a truncated view cannot be mistaken for the complete result. ## Effective number of tests ``` stats_effective_tests(universe="...") ``` M_eff from the correlation eigenspectrum. See [Effective breadth](/docs/concepts/breadth) — the short version is that 22 liquid Coinbase pairs are about 3 independent tests by participation ratio and 7 by entropy, and which of those two you should use depends on whether you are raising a hurdle or widening an interval. ## Triple-barrier labelling ``` stats_triple_barrier(...) ``` Labels candidate entries by which barrier is hit first — profit target, stop, or time limit. This lets you label many candidate entries **without increasing trading frequency**, which matters because frequency is what costs money. Reports a breakeven hit rate. When barriers are tighter than the round-trip fee this exceeds 1.0, meaning no achievable hit rate suffices. ## Alternative bar sampling ``` data_resample(kind="dollar"|"volume", ...) ``` Dollar and volume bars sample on activity rather than clock time, which usually improves the normality of returns. The tool reports a **before/after normality comparison** rather than assuming resampling helped, because sometimes it does not. ## Purged combinatorial cross-validation CPCV improves the reliability of an estimate and enables PBO. It is **not extra sample**: it reuses the same data and never reduces N. Purging covers both edges of each test block, and an embargo separates folds. See [Splits and the holdout](/docs/concepts/splits). ## How to read a result that says no A confidence interval straddling zero, a PBO above 0.5, a deflated Sharpe with a p-value of 0.4, a MinBTL of 40 years — these are not malfunctions and they are not invitations to adjust parameters until they change. They are the tool doing the only thing that makes the other numbers worth anything. A backtest suite that never says no is a backtest suite whose yes means nothing.