Bootstrap Methods for Sharpe Ratio Inference
A realized Sharpe ratio is an estimate, not a property of a strategy. Finance returns are serially dependent, heteroskedastic, and asymmetric, so a normal-theory confidence interval can be misleading. Bootstrap inference re-samples the observed return path to approximate the sampling distribution of the statistic while preserving the features that matter for the strategy.
The statistic and the resampling choice
For periodic excess returns, SR = mean(r) / std(r). Annualize only after fitting the sampling distribution at the native frequency. An iid bootstrap samples individual days with replacement; it is reasonable only when dependence is negligible. Trend, carry, illiquid marks, and overlapping holding periods require blocks.
| Method | Preserves | Best use |
|---|---|---|
| IID bootstrap | Marginal distribution | Nearly independent daily returns |
| Moving block | Local autocorrelation | Fixed block length known |
| Stationary bootstrap | Random block lengths | General dependent returns |
The stationary bootstrap starts new blocks with probability 1/L, making average block length L. Choose L from return autocorrelation, holding period, and volatility clustering—not because a textbook says 20 days.
import numpy as np
def stationary_bootstrap_sharpes(r, B=5000, mean_block=20, seed=7):
rng, r = np.random.default_rng(seed), np.asarray(r)
n, out = len(r), np.empty(B)
for b in range(B):
idx = np.empty(n, dtype=int); idx[0] = rng.integers(n)
for t in range(1, n):
idx[t] = rng.integers(n) if rng.random() < 1/mean_block else (idx[t-1]+1) % n
x = r[idx]
out[b] = x.mean() / x.std(ddof=1)
return out
A 95% percentile interval is the 2.5th to 97.5th percentile of out. Report the interval, the probability SR > 0, and sensitivity to plausible block lengths.
What the bootstrap can and cannot say
Bootstrap assumes the observed path is representative of the future conditional process. It cannot manufacture a crisis never present in the sample, correct survivorship bias, or repair an optimized strategy selected from a large search. For that problem combine it with the Deflated Sharpe Ratio and untouched out-of-sample data. Re-sampling an already selected winner only quantifies uncertainty conditional on the selection mistake.
For strategies with time-varying volatility, consider residual bootstrap: fit a volatility model, resample standardized residuals in blocks, then reconstruct returns. For cross- sectional portfolios, resample dates jointly across all assets so contemporaneous correlation survives. Never independently shuffle each asset and then claim a realistic portfolio-risk interval.
Decision use
Intervals are most useful for ranking fragility. If two strategies have Sharpe 1.1 and 0.9 but their bootstrap distributions substantially overlap, small implementation differences should dominate the allocation decision. Compare downside quantiles, not only means: a strategy whose 5th percentile Sharpe is deeply negative merits a smaller pilot.
Implementation discipline
The model is only one layer of the trade. Store input timestamps, vendor identifiers, contract specifications, FX conversion conventions, and the exact version of each risk model alongside every signal. A result that cannot be reproduced from raw inputs is not a research result; it is an anecdote. Use point-in-time constituent data, distinguish an indicative quote from an executable quote, and make the decision clock explicit. For an execution-sensitive strategy, a close price or composite midpoint is usually an unattainable benchmark rather than a fill.
Evaluate the full distribution, not just a headline Sharpe: drawdown, tail loss, turnover, capacity, exposure concentration, and degradation during the stressed periods that motivated the idea. Split design, parameter choice, and final evaluation across separate samples. If alternatives were explored, record them and account for the search using the Deflated Sharpe Ratio. Finally, run a paper or shadow phase with the same order, reconciliation, and limit logic planned for production. A backtest should establish a conditional expectation, not a promise of a tradable return.
Key takeaways
- Bootstrap the full return series to quantify Sharpe uncertainty without normality assumptions.
- Use blocks when returns overlap or exhibit autocorrelation and volatility clustering.
- Keep native-frequency returns inside the resampling procedure; annualize consistently.
- Bootstrap does not correct data snooping, bias, or missing crisis regimes.
- Report intervals and block-length sensitivity beside the point estimate.
