← lisson.co

Alternative histories β€” the block bootstrap

Constantin Lisson

Markets hand you exactly one history. From it you may want error bars for a mean return, the distribution of a drawdown, a stress test for a portfolio rule β€” all questions about how differently things could have gone. The bootstrap answers by manufacturing alternative histories out of the one you have: resample the data, recompute the statistic, repeat.

But financial time series carry structure that naive resampling destroys. Days are correlated across assets; returns are correlated across time; volatility arrives in waves. This page builds up, method by method, to the block bootstrap β€” resampling whole stretches of time, here 30-day blocks β€” and watches what each step preserves, what it destroys, and where even the best version fails.

One history

Everything below runs on this sample: three years β€” $T = 756$ trading days β€” of daily log returns on two assets, $A$ and $B$. It is a simulated world, which buys us something no real dataset can offer: later on we can re-run the world itself and check the bootstrap's answers against the truth. The simulation has the three features that make resampling time series delicate:

asset A asset B
corr(A,B) = –  Β·  $\rho_1(r)$ = –  Β·  $\rho_1(|r|)$ = –
annualized mean A –% Β· B –%  Β·  vol A –%

The lower strips are the daily returns themselves. Note how rough patches and quiet patches come in stretches, and arrive for both assets at once β€” that is the structure a resampling method has to survive.

The plain bootstrap β€” draw days from an urn

Efron's original bootstrap (1979) treats the sample as an urn. To build an alternative history, draw $T$ days from it with replacement:

$$x^{*}_{t} = x_{J_t}, \qquad J_1,\dots,J_T \;\overset{\text{iid}}{\sim}\; \mathrm{Uniform}\{1,\dots,T\}.$$

To see what that does to order, let every day wear its date: in the strips below, each day of the original sample is shaded by when it happened β€” light for the oldest days, dark for the newest. The original is a smooth gradient. The resample is confetti.

original returns of A i.i.d. resample
sd(r): –% β†’ –%  Β·  $\rho_1(|r|)$: – β†’ –

Hover over the resampled strip to trace any day back to its origin.

What survives: the menu of values. Every resampled day is a real day from the sample, so the marginal distribution β€” mean, variance, skew, the histogram itself β€” is reproduced up to sampling noise, and that is precisely what the classical bootstrap needs. What dies: sequence. The volatility clusters visible in the original returns are pulverized into a uniform buzz, and the autocorrelation of $|r|$ drops from about 0.3 to zero. For i.i.d. data that loss is no loss at all. For a time series it is fatal β€” as we will quantify below.

Two assets β€” resample days, not numbers

First, though, the cross-section. With $N$ series the sample is a $T \times N$ matrix β€” one row per day, one column per asset. There are two ways to run the urn, and they differ in what a "draw" is:

In the strips below, $A$ wears its dates in blue and $B$ wears them in rust. Resampling whole rows keeps the two patterns identical β€” every position holds one date, for both assets β€” and the scatter of daily return pairs keeps its shape. Resampling the columns separately pairs unrelated days, and the correlation collapses.

original day-pairs resampled day-pairs
corr(A,B): – original β†’ – resample

The rule generalizes far beyond two assets: whatever you resample, resample it jointly across the cross-section. Keeping rows intact preserves the entire same-day dependence structure β€” correlations, tail co-movement, factor structure β€” exactly, because no same-day pair is ever broken apart. But rows alone still shred the time dimension: $\rho_1(|r|)$ is as dead as before. We need draws that are bigger than a day.

The block bootstrap β€” resample stretches of time

The fix, proposed for dependent data by Carlstein (1986) and in the overlapping form by KΓΌnsch (1989), is almost embarrassingly direct: if single days destroy the sequence, draw runs of consecutive days. Pick a block length $\ell$ β€” here $\ell = 30$, about six trading weeks of memory β€” draw random starting points

$$S_1, S_2, \dots \;\overset{\text{iid}}{\sim}\; \mathrm{Uniform}\{1,\dots,T-\ell+1\},$$

and lay the blocks $\bigl(x_{S_j}, x_{S_j+1}, \dots, x_{S_j+\ell-1}\bigr)$ end to end until $T$ days are filled β€” always taking whole rows, so the cross-section rides along for free. Every 30-day stretch of the resample is a verbatim quotation from history: within a block, autocorrelation, volatility clusters, lead–lag effects and same-day correlation are all preserved exactly, because the data is untouched β€” only the order of chapters changes.

asset A asset B original paths
block length Β· β„“30
corr(A,B): – β†’ –  Β·  $\rho_1(r)$: – β†’ –  Β·  $\rho_1(|r|)$: – β†’ –  Β·  seams: –

The tick marks under the strips are the seams where one block ends and the next begins. Drag β„“ down to 2 and the gradient dissolves back into confetti; drag it up to 252 and you are merely reshuffling three long chapters. Hover over a strip to trace a day home.

Two refinements are worth knowing. The circular block bootstrap (Politis & Romano) wraps the sample into a ring so late days are not under-sampled. And the stationary bootstrap (Politis & Romano, 1994) draws each block with a random, geometrically distributed length with mean $\ell$ β€” the checkbox above. Softening the block edges this way makes the resampled process stationary and the result less sensitive to the exact choice of $\ell$, at the price of some short blocks in every resample.

Why it matters β€” error bars you can trust

Does the extra machinery change any answer? Take the plainest statistic there is: the mean daily return of $A$, annualized. For dependent data its true sampling variance is not $\sigma^2/T$ but

$$\operatorname{Var}(\bar r) \;=\; \frac{\sigma^2}{T}\left(1 + 2\sum_{k=1}^{T-1}\Bigl(1-\tfrac{k}{T}\Bigr)\rho_k\right),$$

and with positive autocorrelation the sum is positive: neighboring days partly repeat each other, so $T$ correlated days carry less information than $T$ independent ones. The i.i.d. bootstrap, which by construction produces uncorrelated resamples, estimates $\sigma^2/T$ β€” Singh (1981) proved this failure β€” and its error bars come out too narrow. With $\varphi = 0.3$ the understatement is a factor of about $\sqrt{(1+\varphi)/(1-\varphi)} \approx 1.36$.

Because this world is simulated, we can watch it happen. Below are three sampling distributions of the annualized mean: one from 400 i.i.d.-day resamples, one from 400 block resamples, and β€” the luxury of a synthetic world β€” the truth, from 400 freshly simulated histories.

truth β€” fresh worlds i.i.d. bootstrap block bootstrap
block length Β· β„“  (1 = i.i.d.)30
SE of annualized mean, pp:  truth –  Β·  i.i.d. –  Β·  blocks –

Compare widths, not centers β€” a bootstrap distribution is always centered near this sample's mean, while the truth is centered at the world's. Slide β„“ to 1 and the block curve collapses onto the i.i.d. one; past the memory length (a few weeks) the width stops growing.

Notice also that even generous blocks stay a touch narrower than the truth. That is not bad luck; it is the first limitation.

Limitation I β€” the seams have no memory

A block resample contains roughly $T/\ell$ seams, and across a seam the past is forgotten: the two sides come from unrelated parts of history. Two days $k$ apart land in the same block only with probability about $(1-k/\ell)^{+}$, so the resample's autocorrelation is systematically attenuated:

$$\mathbb{E}\,\rho^{*}_{k} \;\approx\; \Bigl(1-\frac{k}{\ell}\Bigr)^{\!+} \rho_k .$$

The plot shows this bias directly, on the statistic where our world has long memory: the autocorrelation of $|r|$, the signature of volatility clustering. Gray bars are the original sample's ACF; the teal line is the average ACF over 200 block resamples; the thin dashes are the $(1-k/\ell)$ envelope.

original ACF of |r| mean resample ACF (1 βˆ’ k/β„“) envelope
block length Β· β„“30
memory kept, $\sum_{k=1}^{60}\rho_k(|r|)$: original – β†’ resamples –

Everything beyond lag β„“ is annihilated, and even lags well inside the block are shaved by the seam probability. A 30-day block keeps six-week weather but knows nothing of seasons.

Any statistic that feeds on long-range dependence inherits this bias: multi-month drawdowns, persistence estimates, the width of the mean's error bar we just saw. The bootstrap distribution is honest only about horizons shorter than the block.

Limitation II β€” the block-length dilemma

So make $\ell$ enormous? Then the other jaw of the vise closes. The sample holds only $T/\ell$ non-overlapping blocks β€” at $\ell=252$, three. Resamples become shufflings of a few long chapters: they share most of their content, the bootstrap distribution collapses toward a few points, and in the limit $\ell = T$ every "alternative history" is the original. Try it above β€” at $\ell = 252$ the provenance strips show three slabs, and the resampled paths look like the original path with its acts reordered.

The tension is fundamental: short blocks bias, long blocks starve. Theory locates the optimum for smooth statistics at $\ell^* \sim c\,T^{1/3}$ (Hall, Horowitz & Jing 1995) β€” around 9 days for our $T=756$ β€” and Politis & White (2004) give an automatic, ACF-driven choice. In practice the block length is a modelling decision about how long the memory you care about actually is: 30-day blocks for our world's six-week volatility weather, longer if the statistic genuinely needs seasons β€” provided the sample can afford them.

Limitation III β€” resample returns, never prices

The block bootstrap assumes stationarity: any block must be exchangeable with any other. Prices are not stationary β€” a block of 2019 price levels and a block of 2021 levels live at different altitudes, and gluing them produces cliffs at every seam. Returns (or residuals from a fitted model) are the stationary increments; resample those and rebuild the path by compounding. Below, the same drawn blocks, glued both ways.

same blocks, two gluing rules β€” seams ticked below each panel

The same trap generalizes: trends, unit roots, structural breaks, a pandemic-era regime β€” the block bootstrap will happily shuffle them into places they never belonged, because it believes all of history is one homogeneous fabric. Difference, detrend, or model first; resample what is plausibly stationary.

What no bootstrap can give you

One boundary is worth stating plainly: every resampled day is a day that happened. The worst crash in any alternative history is exactly the worst crash in yours; no resample contains a nine-sigma day your sample lacked. The bootstrap redistributes experience β€” it does not extrapolate beyond it. For tail questions past the sample's edge you need parametric help: extreme-value theory, or a model that can be pushed. And rare structure suffers the same way: a crisis that appears once in your sample appears in resamples at a random frequency β€” sometimes never, sometimes three times β€” so "how often do crises happen" is a question the urn cannot answer, only re-ask.

Relatives worth knowing, for when blocks pinch: the AR-sieve bootstrap fits an autoregression and resamples its residuals β€” seamless histories, at the price of believing the model; the dependent wild bootstrap multiplies the data by smoothly correlated noise; subsampling gives up on full-length histories and draws shorter ones, with inference corrected for size. Each trades the block bootstrap's model-freedom for one of its weaknesses.

Further reading

Efron's original paper is Bootstrap methods: another look at the jackknife (1979); Singh's proof that it fails for dependent data is in Annals of Statistics (1981). The block bootstrap enters with Carlstein (1986) and, in the overlapping form used here, KΓΌnsch (1989); the stationary variant is Politis & Romano (1994), and automatic block-length selection is Politis & White (2004). The book-length treatment is Lahiri, Resampling Methods for Dependent Data (Springer, 2003).