---
title: Bootstrap SOR
format: gfm
---


this content generated by ChatGPT 5.2 Instance, 2/13/2026


# Block Bootstrap Sequence-of-Returns (SOR) Model

```
method = "bootstrap_sor"
```

## Overview

The Block Bootstrap SOR model generates retirement return paths by **resampling historical return blocks** rather than drawing from a parametric distribution.

Instead of assuming normality or AR structure, this method:

* Preserves empirical multi-year crisis shapes
* Preserves cross-asset correlation
* Preserves volatility clustering
* Preserves skew and fat tails
* Avoids distributional assumptions

This makes it particularly well suited for modeling **sequence-of-returns risk** in retirement.

---

# 1. Core Concept

Let historical data exist for years:

[
1928, \dots, 2025
]

For each year we have:

[
r_t = [\text{S&P}, \text{Baa}, \text{T Bonds}, \text{Inflation}]
]

Instead of modeling a distribution, we **resample contiguous blocks** of historical returns.



# 2. Why Blocks (Not Single Years)?

If we resampled single years independently:

[
r_t \sim \text{Uniform}(\text{historical years})
]

We would destroy:

* Multi-year crashes
* Recovery phases
* Volatility clustering
* Persistent inflation regimes

Block bootstrapping preserves **time dependence** inside each block.



# 3. Algorithm Structure

## Step 1 — Choose Block Length

Let:

[
L = \text{block_length}
]

Typical values:

| Block Length | Interpretation                           |
| ------------ | ---------------------------------------- |
| 1            | Independent resampling (not recommended) |
| 3–5          | Short market cycles                      |
| 5–10         | Crisis-length persistence                |
| 10+          | Great Depression / lost decade modeling  |



## Step 2 — Partition Historical Data

Historical data of length ( T ) yields:

[
T - L + 1
]

overlapping blocks:

[
[r_1, \dots, r_L],
[r_2, \dots, r_{L+1}],
\dots
]

Each block is a ( L \times 4 ) matrix.



## Step 3 — Sample Blocks

To generate an ( N )-year retirement horizon:

1. Randomly sample blocks with replacement
2. Concatenate them
3. Truncate to length ( N )

[
\text{Path} = \text{Block}_3 | \text{Block}_17 | \text{Block}_5 \dots
]



# 4. What This Preserves

Within each block:

* Serial correlation
* Volatility clustering
* Crisis shape
* Inflation regime persistence
* Cross-asset correlation

Across blocks:

* Independence

So dependence is **piecewise persistent**.



# 5. Model Properties

| Property              | Behavior                   |
| --------------------- | -------------------------- |
| Distribution          | Empirical (nonparametric)  |
| Fat tails             | Preserved                  |
| Skew                  | Preserved                  |
| Volatility clustering | Preserved within block     |
| Regime switching      | Preserved if block large   |
| Stationarity          | Weak (depends on sampling) |
| Mean reversion        | Emergent from data         |



# 6. Mathematical Form

Let historical data be:

[
{r_1, r_2, ..., r_T}
]

Define block starting index ( i ):

[
B_i = {r_i, r_{i+1}, ..., r_{i+L-1}}
]

Sample:

[
i_1, i_2, ..., i_k \sim \text{Uniform}(1, T-L+1)
]

Construct:

[
R = B_{i_1} | B_{i_2} | \dots
]

Truncate to ( N ).



# 7. Variants of Block Bootstrap

### 7.1 Fixed Block Bootstrap

All blocks length = L.

Simplest and most common.



### 7.2 Moving Block Bootstrap (MBB)

Same as above, but overlapping blocks allowed.

This is typically what is implemented.



### 7.3 Stationary Bootstrap (Politis & Romano)

Block lengths are random (geometric distribution).

This smooths block boundary artifacts.



### 7.4 Circular Bootstrap

Blocks wrap around end of dataset.

Useful when using full historical range cyclically.



# 8. Block Length Tradeoffs

Small L:

* More mixing
* Less persistence
* Less crisis realism

Large L:

* Strong regime persistence
* Fewer unique paths
* Risk of overfitting to specific eras

Typical retirement modeling sweet spot:

```
block_length = 5–8 years
```



# 9. Cross-Asset Structure

Because entire historical rows are sampled:

* Stock–bond correlation is preserved
* Stock–inflation correlation preserved
* Bond–inflation correlation preserved

No covariance matrix required.



# 10. Interaction with OWL Parameters

Bootstrap integrates cleanly with:

* `reverse_sequence`
* `roll_sequence`
* `rate_seed`
* `reproducible_rates`

Reverse and roll apply **after block assembly**.



# 11. Behavior in Retirement Modeling

Bootstrap tends to produce:

* More clustered crashes
* Realistic multi-year downturns
* Authentic inflation spikes
* Natural recovery sequences

It captures:

* 1930–32
* 1973–74
* 2000–02
* 2008–09
* 2022 inflation spike

without needing parametric modeling.



# 12. Comparison vs Toeplitz

| Feature               | Toeplitz    | Bootstrap             |
| --------------------- | ----------- | --------------------- |
| Distribution          | Parametric  | Empirical             |
| Crisis shape          | Approximate | Exact                 |
| Fat tails             | Optional    | Automatic             |
| Volatility clustering | Modeled     | Preserved             |
| Structural breaks     | No          | Yes (if blocks large) |
| Smoothness            | Smooth      | Piecewise             |
| Stress test control   | High        | Moderate              |
| Overfitting risk      | Low         | Moderate              |



# 13. Advantages

* No normality assumption
* Preserves true crisis dynamics
* Simple to implement
* Empirically grounded
* Strong SOR realism



# 14. Disadvantages

* Limited to available history
* Cannot generate unprecedented events
* Block boundaries introduce mild artifacts
* Long blocks reduce path diversity



# 15. Recommended Default Parameters

For retirement modeling:

```
method = "bootstrap_sor"
from = 1928
to = 2025
block_length = 6
rate_seed = 42
reproducible_rates = true
```



# 16. Interpretation in Retirement Risk Context

Bootstrap answers:

> “What if your retirement experienced something structurally like 1973–74 or 2008–09?”

Toeplitz answers:

> “What if returns exhibit realistic statistical persistence?”

Both model sequence risk differently.



# 17. Advanced Extensions (Optional)

You could extend bootstrap to:

* Regime-weighted sampling
* Crisis oversampling
* Inflation-regime conditional sampling
* Block-length randomization
* Stress-augmented bootstrap (e.g. scale returns by factor)



# 18. When to Prefer Bootstrap

Use bootstrap when:

* You prioritize historical realism
* You want authentic crisis clustering
* You distrust parametric assumptions
* You want empirically grounded SOR modeling

