What Is the Deflated Sharpe Ratio?
In 2014, David Bailey and Marcos López de Prado published The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting, and Non-Normality in the Journal of Portfolio Management, volume 40(5), pages 94 to 107. It tackles a familiar research embarrassment: the strategy you report is usually the winner of a search, not a strategy chosen before looking at the data.
The deflated Sharpe ratio (DSR) is a Probabilistic Sharpe Ratio whose benchmark is raised from zero to the expected best Sharpe among independent, zero-skill trials. It then accounts for the selected strategy's track-record length, skewness and kurtosis. The output is a normal-CDF confidence measure between zero and one.
It is not an adjusted Sharpe measured in the usual units, and it is not a Bayesian probability that the strategy has a "real edge". It is the estimated confidence, under the paper's asymptotic assumptions, that the selected strategy's population Sharpe exceeds a multiple-testing hurdle. Read it beside our Sharpe ratio guide and the experiment in the Sharpe ratio of pure noise.
The Formula and Its Units
For returns sampled at their original frequency, let be the selected strategy's sample Sharpe, the number of returns, sample skewness and Pearson kurtosis. Pearson kurtosis is three for a Gaussian distribution; it is not excess kurtosis.
The Probabilistic Sharpe Ratio against benchmark is
Bailey and López de Prado derive the multiple-testing hurdle using an extreme-value approximation:
where is the Euler-Mascheroni constant and is the cross-sectional variance of Sharpe estimates across the trials. Substituting this into PSR gives DSR.
Two implementation errors are common.
First, every Sharpe in these equations must use the return series' original frequency. Bailey and López de Prado's earlier Probabilistic Sharpe Ratio paper is explicit: no annualisation is performed. If monthly , its annualised display value is , but 1.50 does not go into the formula with .
Second, scipy.stats.kurtosis defaults to Fisher excess kurtosis, where Gaussian equals zero. The equation expects Pearson kurtosis. Use fisher=False, or add three to an excess-kurtosis estimate. Mixing conventions can materially alter the confidence.
A recomputed example
Suppose the selected strategy has 60 monthly returns, an annualised Sharpe of 1.50, skewness -1 and Pearson kurtosis 6. The research log contains 100 comparable Sharpe estimates whose cross-sectional standard deviation at monthly frequency is 0.15.
Convert the reported Sharpe first:
For , the expected-maximum bracket is approximately 2.531. The selection hurdle is therefore
equivalent to an annualised display Sharpe of about 1.315. The non-normality term is
So
A headline annualised Sharpe of 1.50 now carries only about 62% confidence against the search-adjusted hurdle. At a pre-specified 95% confidence level, we fail to reject the null that population Sharpe is no better than that hurdle. That wording is less exciting than "62% chance of alpha", but it is statistically correct.
The example also shows why the number of trials alone is insufficient. DSR needs their Sharpe dispersion. Setting trial variance to an arbitrary default defeats the correction.
Python that preserves the conventions
This function takes the selected return series and the Sharpe ratios recorded for all comparable trials. Both use the same unannualised sampling frequency. effective_trials can be supplied when the research variants are dependent, but estimating it is a separate modelling problem.
import numpy as np from scipy.stats import kurtosis, norm, skew def deflated_sharpe(returns: np.ndarray, trial_sharpes: np.ndarray, effective_trials: float | None = None) -> dict[str, float]: returns = np.asarray(returns, dtype=float) trials = np.asarray(trial_sharpes, dtype=float) if len(returns) < 3 or len(trials) < 2: raise ValueError("Need at least 3 returns and 2 recorded trials") sr = returns.mean() / returns.std(ddof=1) # not annualised n_eff = float(effective_trials or len(trials)) if n_eff <= 1: raise ValueError("effective_trials must exceed 1") gamma = np.euler_gamma extreme = ((1 - gamma) * norm.ppf(1 - 1 / n_eff) + gamma * norm.ppf(1 - 1 / (n_eff * np.e))) sr_hurdle = trials.std(ddof=1) * extreme skewness = skew(returns, bias=False) pearson_kurtosis = kurtosis(returns, fisher=False, bias=False) variance_term = (1 - skewness * sr + 0.25 * (pearson_kurtosis - 1) * sr**2) if variance_term <= 0: raise ValueError("Invalid asymptotic variance estimate") z_score = ((sr - sr_hurdle) * np.sqrt(len(returns) - 1) / np.sqrt(variance_term)) return {"dsr": float(norm.cdf(z_score)), "sharpe": float(sr), "hurdle": float(sr_hurdle)}
The function assumes a zero-mean null across trials, as in the paper's DSR construction. If the trial set contains strategies with genuine and different expected Sharpes, or trial lengths differ, the cross-sectional variance and expected-maximum approximation need more care.
Where DSR Goes Wrong
The missing research log. You cannot reconstruct selection bias from the winning return series. Record abandoned features, parameter grids, universes, lag choices and label variants as they are tested. Counting only the final notebook understates .
Dependent trials. One hundred nearby moving-average windows are not 100 independent discoveries. The raw count is conservative only if the cross-trial variance is otherwise estimated appropriately and the approximation remains suitable. An effective based on strategy-return dependence can help, but it adds estimation uncertainty. Report raw and effective counts with the method used.
Serial dependence. The higher-moment expression is not a universal cure for autocorrelated P&L, stale marks or overlapping returns. Choose the highest sampling frequency for which the required assumptions are credible, and compare with a heteroskedasticity-and-autocorrelation-consistent Sharpe inference or block bootstrap. Andrew Lo's (2002) The Statistics of Sharpe Ratios explains why naive square-root annualisation fails under serial correlation.
Uncertain moments. Skewness and especially kurtosis are noisy in short, fat-tailed samples. A single crash can dominate them. Inspect sensitivity to winsorisation only as a diagnostic, never as a way to delete an inconvenient loss, and consider bootstrap uncertainty.
Repeated use of the test set. Purging controls overlapping information intervals, not researcher adaptation. Once you inspect a holdout and revise the model, it joins the search history. Nested purged cross-validation and a final untouched period address different parts of the problem.
What a defensible DSR report contains
Publish enough inputs for another researcher to reproduce the number. At minimum that means the selected return frequency, , per-period and annualised Sharpe, sample skewness, Pearson kurtosis, raw trial count, effective trial count if used, cross-trial Sharpe variance, resulting and DSR. State whether returns are gross or net and how the risk-free rate was handled.
The trial set must be comparable. Sharpe estimates from 20 years of daily data and six months of weekly data do not share one sampling distribution. Nor do gross high-frequency returns and net monthly fund returns. Group coherent research families or standardise the experiment before using their cross-sectional variance. If trial histories have unequal lengths, a simulation or hierarchical model may be more honest than forcing them into the paper's simple approximation.
Report sensitivity rather than one magic probability. Recalculate DSR using the raw , plausible effective counts and confidence bounds for skewness and kurtosis. Also show what happens if the weakest documented trials are restored to the research ledger. A result that ranges from 0.55 to 0.99 is not "significant"; it is dominated by uncertain inputs.
Be precise about the decision. A one-sided DSR of 0.96 against says the estimated population Sharpe exceeds that benchmark at the stated level under the approximation. It does not say the next year's Sharpe will exceed 0.4, that drawdown risk is small or that the strategy survives transaction costs. Those are separate forecasts.
Finally, calculate DSR on a strategy selected without using the return block being assessed. If the same out-of-sample path chose the strategy, its Sharpe is another selected maximum and the test understates adaptation. Freeze the candidate and evaluation protocol, then open the holdout once.
Costs belong upstream of the statistic. If 200 gross strategies were searched but only the winner received a detailed cost model, the trial distribution and selected Sharpe are not comparable. Apply the same conservative fee, spread, market-impact and financing rules to every candidate before calculating trial Sharpes. Preserve timestamps and parameter hashes in that ledger. Keep failed implementations too; deleting a trial because it lost money is selection on the outcome.
Use excess returns consistently. For a self-financing long-short strategy, the appropriate financing adjustment differs from subtracting the same Treasury yield from every leg. For a cash-funded portfolio, align the risk-free series to the return period without using a later revision. These choices can look small next to an annualised Sharpe, but the DSR calculation works at the original frequency and sees the difference directly.
DSR is most valuable as a record-keeping discipline. If the inputs are unavailable, the honest conclusion is not a guessed DSR. It is that selection-adjusted confidence cannot be calculated.
Frequently Asked Questions
What is the deflated Sharpe ratio?
DSR is a Probabilistic Sharpe Ratio tested against the expected best Sharpe from multiple zero-skill trials rather than against zero.
Is DSR an adjusted Sharpe ratio?
No. It is a confidence measure from zero to one. Report the ordinary Sharpe separately, with its frequency, costs and sample dates.
Should Sharpe be annualised before calculating DSR?
No. Use Sharpe ratios at the original return frequency throughout the formula. Annualise only for a separate display value.
Does the formula use excess kurtosis?
No. It uses Pearson kurtosis, where a Gaussian distribution has kurtosis three. In SciPy, call kurtosis(..., fisher=False).
What DSR threshold is statistically significant?
Choose the significance level before inspecting the result. A DSR above 0.95 corresponds to rejecting the stated hurdle at a one-sided 5% level under the approximation; it does not guarantee profitable live trading.
How should the number of trials be counted?
Count the full research search, not just published strategies. Correlated trials may justify an effective count, but disclose both the raw count and the dependence adjustment.
Skip the £25k programme - try the alternative
Master's programmes are slow and expensive. Quantt is a self-paced alternative. Start free with a real lesson and interview practice, then unlock 50+ courses and your personalised plan.
Free to start · No credit card required