When someone says “let’s generate synthetic market data,” the modern reflex is to spin up a GAN, feed it a few years of returns, and wait for the magic. That reflex is almost always wrong as a first move. A neural generator is a black box with millions of parameters and a long list of ways to fool you — mode collapse, silent overfitting, and a tendency to memorize and replay your training set while looking creative. You should never reach for one until you know what you’re trying to beat.
What you’re trying to beat is a classical simulator: a small, transparent model you can write on a napkin and fully understand. Three of them carry almost all the weight in practice — geometric Brownian motion, the bootstrap (block and stationary), and regime-switching / hidden-Markov models. They are cheap, they train in milliseconds, every parameter has a meaning, and crucially they are leak-resistant: a bootstrap can only replay returns that really happened, and GBM has so few knobs it physically cannot memorize your data. They are the control group of this entire field.
So the rule for the rest of the course is simple. A learned generator (lessons 4–6) is only worth its compute, its fragility, and its leakage risk if it clears this baseline and survives the evaluation gauntlet (lesson 7). In this lesson we line up the three classical simulators and grade each one against the stylized-facts rubric from lesson 2 — fat tails, volatility clustering, slow absolute-return ACF, the leverage effect, aggregational Gaussianity, and gain/loss asymmetry. Some of these “straw men” turn out to be alarmingly hard to knock down.
Geometric Brownian motion (GBM)
Before you read — take a guess
Under geometric Brownian motion, the day-to-day log-returns of an asset are…
Analogy. GBM is the spherical cow of finance. A physicist who wants a first answer assumes the cow is a frictionless sphere — wrong in every detail, but a clean starting point you can compute by hand. GBM assumes a market with constant volatility and memoryless, perfectly Gaussian returns. Nobody believes the cow is a sphere; you use it because it gives you a number to argue against.
Definition. GBM is the model you already met in Monte-Carlo Finance. The price follows the stochastic differential equation
where is the drift, the volatility, and a Brownian increment. The closed-form solution makes log-returns i.i.d. normal:
To simulate one step you draw a standard normal and push the price forward:
Worked example. Take a start price of $100, so , with annual drift , annual volatility , and one daily step . Then:
- Drift term:
- Diffusion scale:
Suppose the random draw is (a brisk up day). The log-return is , so
i.e. a price of about $101.93.
A draw of instead gives a log-return of and a price of about $97.54. Same machinery, just a different Gaussian draw — and that sameness is the whole problem.
Grading GBM against the rubric. Here is where the spherical cow gets exposed:
| Stylized fact | GBM verdict |
|---|---|
| Aggregational Gaussianity | Pass (trivially — it’s Gaussian at every horizon, so summing days stays Gaussian) |
| Fat tails | Fail — Gaussian tails are far too thin; a true 6σ crash is “impossible” |
| Volatility clustering | Fail — constant means calm and storm are equally likely tomorrow |
| Slow absolute-return ACF | Fail — i.i.d. returns have zero autocorrelation at every lag |
| Leverage effect | Fail — returns and future volatility are independent by construction |
| Gain/loss asymmetry | Fail — the distribution is symmetric |
It passes exactly one box, and only because it cheats by being Gaussian everywhere. The picture below shows the core failure: GBM’s return distribution is a clean bell curve, while real returns pile up extra mass in the middle and in the tails.
GBM produces the thin-tailed normal curve. Real market returns are leptokurtic — taller and skinnier in the middle, with far more mass in the tails. The 'impossible' crashes live in that tail gap, which is exactly what GBM cannot generate.
The straw-man trap works both ways. GBM is so obviously wrong that people dismiss it entirely — and then ship a neural generator that, when you actually measure it, fails the same boxes GBM fails (no leverage effect, tails too thin). If your fancy model can’t beat the spherical cow on a stylized fact, you haven’t built a generator, you’ve built an expensive GBM. Always score the baseline first so you know which boxes are still empty.
When to use it
Use GBM as the null hypothesis and pricing scaffold, not as a realistic data source. It is the right tool when you need a closed-form benchmark (Black–Scholes lives here), a quick sanity path, or a deliberately honest lower bound to measure everything else against. The moment you care about tail risk, clustering, or anything path-dependent, GBM is a liability — but it is an indispensable yardstick.
Pick the right option for each blank, then check.
The single stylized fact GBM passes is , and it only passes because its returns are normal at every time horizon.
The block bootstrap
Before you read — take a guess
Why resample BLOCKS of consecutive returns instead of individual days?
Analogy. Imagine making a “new” highlight reel from old game footage. If you splice it one frame at a time, you get incoherent flicker. If you splice it in clips of a few seconds each, every clip still contains real, coherent motion — you’ve just reshuffled the order of plays. The block bootstrap splices market history in clips, not frames, so each clip carries its own little burst of volatility intact.
Definition. The bootstrap resamples with replacement from your historical returns to build new series of the same length. The naïve version draws single days, which destroys all temporal structure. The moving-block bootstrap instead picks a block length , forms every overlapping block , and samples whole blocks at random, concatenating them until the synthetic series is long enough.
- Non-overlapping blocks chop the series into fixed, disjoint windows — simpler, but fewer distinct blocks to draw from.
- Moving (overlapping) blocks slide one step at a time, giving candidate blocks and far more variety.
The block length is the one knob, and it is a genuine tradeoff:
- Too short (): you’re back to the i.i.d. bootstrap — clustering and all serial dependence vanish.
- Too long (): every “synthetic” series is just your real history with the start point shifted — no novelty at all.
Worked example. Take a tiny daily-return series of days (in percent):
Choose block length . The overlapping blocks are of them:
To build a synthetic length-8 series, draw blocks at random with replacement and concatenate, trimming to 8. Drawing , then , then gives
Notice the pair survived as a unit — the volatile cluster traveled together. A single-day bootstrap could just as easily have separated them, drowning the storm.
The stationary bootstrap (Politis–Romano). A fixed block length leaves an awkward seam: the synthetic series isn’t strictly stationary because the block boundaries land at predictable spots. The stationary bootstrap fixes this by making the block length random — each block continues with probability and ends with probability at every step, so block lengths follow a geometric distribution with mean . Averaging over random lengths smooths out the boundary artifacts and guarantees the resampled series is stationary. You trade the single parameter for the single parameter (expected length ).
Grading the bootstrap against the rubric. The bootstrap’s superpower is that it resamples real returns, so anything baked into individual days survives for free:
| Stylized fact | Block bootstrap verdict |
|---|---|
| Fat tails | Pass — it replays actual returns, so the empirical tail thickness is preserved |
| Volatility clustering (short-range) | Pass within a block; the whole point of |
| Slow absolute-return ACF (long-range) | Fail — memory only extends days; correlation snaps to zero past the block |
| Leverage effect | Partial — present inside a block, broken at every seam |
| Can exceed history’s worst day | Fail — you can only ever replay moves that happened |
Volatility clustering shows up as a slowly decaying autocorrelation in ABSOLUTE returns. The block bootstrap reproduces this decay inside each block, but the memory dies abruptly once you cross a block boundary — so the long, slow tail of the real ACF gets truncated near lag b.
The bootstrap can never imagine a crash worse than your worst day. If your sample contains a –12% day but not the –22% day that’s coming, no amount of clever resampling will produce one — the support of the synthetic distribution is exactly the support of the historical sample. For tail-risk and stress-testing work this is disqualifying: the bootstrap is structurally blind to the unprecedented, which is the one scenario stress tests exist to probe.
When to use it
Reach for the block (or stationary) bootstrap when you want realistic, leak-resistant samples and you trust your history to be representative — backtesting trading rules, sizing confidence intervals on a Sharpe ratio, bootstrapping P&L distributions. It is the strongest baseline precisely because it inherits every stylized fact your data already has, at near-zero modeling cost. Avoid it whenever the future must contain events the past did not — novel regimes, structural breaks, or stress beyond the historical maximum.
Place each item in the right group.
- Breaks the leverage effect at every block seam
- Memory snaps to zero past the block length
- Leak-resistant — only replays real returns
- Preserves empirical fat tails for free
- Keeps short-range volatility clustering inside a block
- Cannot produce a move larger than history's worst
Regime-switching / hidden-Markov models
Before you read — take a guess
In a two-state regime-switching (hidden-Markov) model of returns, what is 'hidden'?
Analogy. Think of the market as weather with two moods: sunny (low volatility, gentle drift) and stormy (high volatility, sharp moves). You never get a label that says “it is storm season now” — you only see the daily returns and have to infer the mood. And moods are sticky: a sunny day is usually followed by another sunny day, a storm tends to rage on for a while. That stickiness is the Markov transition matrix.
Definition. A hidden-Markov / regime-switching model posits a small number of latent states. State emits returns from its own distribution, typically Gaussian with mean and volatility . A transition matrix , with entries and rows summing to 1, governs the dynamics. For a two-state (calm / turbulent) model:
The expected duration of a regime follows from the self-transition probability . Each day the regime survives with probability , so its length is geometric with mean
Worked example. Calibrate a two-state model with
Expected durations:
- Calm: trading days (about 10 weeks of quiet).
- Turbulent: trading days (a two-week storm).
Long-run regime probabilities come from the stationary distribution . Solving, the calm probability is , so the market is calm about 83% of the time and turbulent about 17%. The unconditional return distribution is then a mixture of two normals:
That mixture is where the magic happens. A narrow calm bell glued to a wide turbulent bell produces a combined distribution that is peaked in the middle and fat in the tails — leptokurtic, just like real returns — even though each component is a plain Gaussian.
Grading the HMM against the rubric. For such a simple model, the scorecard is surprisingly strong:
| Stylized fact | 2-state HMM verdict |
|---|---|
| Fat tails | Pass — a mixture of a calm and a turbulent normal is leptokurtic |
| Volatility clustering | Pass — sticky states ( near 1) make high-vol days bunch together |
| Slow absolute-return ACF | Partial — persistence gives slow-ish decay, though a single switch can be too abrupt vs. real markets |
| Gain/loss asymmetry | Pass-ish — the turbulent state can carry negative drift, tilting the downside |
| Leverage effect | Fail — by default states are symmetric; returns don’t drive the next state’s volatility |
Two regimes is a model, not a law of nature. It’s tempting to keep adding states until the fit is gorgeous — but every extra regime multiplies parameters in the transition matrix ( of them) and you quickly overfit, “discovering” regimes that are just noise. Worse, with enough states an HMM starts to memorize the training path, quietly forfeiting the leak-resistance that made the baseline trustworthy. Keep small (2–4), justify each state, and validate out-of-sample.
When to use it
Use a regime-switching model when you need interpretable structure with realistic tails and clustering — scenario generation for stress tests where you want a named “crisis regime,” volatility forecasting, or any setting where stakeholders will ask why a path looks the way it does. It threads the needle between GBM (too simple) and a neural generator (too opaque): few parameters, every one nameable, yet it clears most of the rubric. Skip it when the real dynamics are genuinely continuous rather than a handful of discrete moods, or when you need the leverage effect baked in.
Kurtosis measures how much mass lives far from the mean relative to a single Gaussian of the same overall variance. When you blend a low-variance normal (calm) with a high-variance one (turbulent), the calm component over-fills the center while the turbulent component over-fills the tails — both at the expense of the “shoulders” a single Gaussian would have. The result is taller in the middle, thinner at the shoulders, and heavier in the tails: textbook leptokurtosis. No fat-tailed input distribution required — clustering of variances alone manufactures the fat tails.
Pick a term, then click its definition.
Why the baseline is so hard to beat
It would be convenient if these models were toys. They are not. The reason they survive is a combination of three properties that learned generators struggle to match all at once.
They are cheap. GBM is two parameters. A bootstrap is zero parameters plus a block length. A two-state HMM is a handful. They calibrate in milliseconds on a laptop, with no GPU, no training instability, and no hyperparameter séance.
They are interpretable. Every knob has a name and a unit. When the output looks wrong you can point at the parameter responsible — drift, volatility, block length, self-transition probability. A GAN that misbehaves offers you a loss curve and a shrug.
They are leak-resistant. This is the underrated one. The bootstrap can only emit returns that actually occurred, so it cannot accidentally regurgitate a memorized training example that the rest of your pipeline then mistakes for genuine novelty — its “leakage” is honest and bounded by construction. GBM and HMMs have so few parameters that they physically lack the capacity to memorize individual paths. A neural generator with millions of weights has exactly the opposite problem: its default failure mode is to copy the training set and pass it off as synthetic, which is catastrophic if you’re using the data to validate a model that also trained on the original.
So a learned generator has to clear a high bar: match or beat the HMM on fat tails and clustering, add the leverage effect and long-range memory the classics miss, and generate genuine novelty (moves beyond the historical sample) the bootstrap can’t — all without secretly memorizing the training data, and while surviving the full evaluation gauntlet of lesson 7. Here is the scorecard that frames the rest of the course:
| Property | GBM | Block bootstrap | 2-state HMM | Learned generators (preview, L4–6) |
|---|---|---|---|---|
| Fat tails | No | Yes (empirical) | Yes (mixture) | Yes (if trained well) |
| Volatility clustering | No | Short-range only | Yes (sticky states) | Yes, potentially long-range |
| Leverage effect | No | Partial (in-block) | No (by default) | Yes (the main prize) |
| Novelty / can exceed history | Yes (Gaussian, unbounded) | No (replays only) | Limited (within state ranges) | Yes (the other main prize) |
| Interpretability | High | High | High | Low |
| Leakage risk | None | None (replays real data) | Very low | High (can memorize) |
| Data hunger | None (assume params) | Low | Low–moderate | High |
Read that table as a job description. The two columns where the classics are weak — the leverage effect and genuine novelty — are exactly what a neural generator must deliver to justify its cost. Everything else, it merely has to not lose.
Select EVERY reason classical simulators are a demanding baseline for a neural generator to beat. (Choose all that apply.)
Recap
Before any neural generator earns a place in your pipeline, it has to beat a control group you fully understand. Geometric Brownian motion is the honest straw man: i.i.d. Gaussian log-returns that pass aggregational Gaussianity and fail everything else, but give you a closed-form yardstick. The block (and stationary) bootstrap resamples clips of real history, inheriting empirical fat tails and short-range volatility clustering for free, at the cost of long-range memory and any move bigger than history’s worst day. The two-state hidden-Markov model blends a calm and a turbulent regime into a mixture of normals that delivers both fat tails and clustering while staying interpretable, with expected regime duration . All three are cheap, transparent, and leak-resistant — which is exactly why they’re hard to beat. The learned generators of lessons 4–6 must clear this bar on the leverage effect and on genuine novelty, without memorizing the data, and then survive the evaluation gauntlet of lesson 7.
Big picture
- Classical simulators: the baseline to beat
- GBM — the honest straw man
- dS = μS dt + σS dW; i.i.d. Gaussian log-returns
- Passes: aggregational Gaussianity (only)
- Fails: fat tails, clustering, leverage, asymmetry
- Use: null hypothesis & pricing scaffold
- Block / stationary bootstrap
- Resample blocks of length b to keep clustering
- Stationary = random geometric block length (Politis–Romano)
- Passes: fat tails, short-range clustering
- Fails: long-range memory, moves beyond history
- Regime-switching / HMM
- K latent states, each μ_k/σ_k, transition matrix P
- Expected duration = 1/(1 − p_stay)
- Passes: fat tails (mixture) + clustering (sticky states)
- Fails: leverage effect by default
- Why it's hard to beat
- Cheap + interpretable + leak-resistant
- Neural prize: leverage effect + true novelty
- Must avoid memorizing data (leakage)
- GBM — the honest straw man
Classical simulators: graded
A regime-switching model has a turbulent state with self-transition probability p_stay = 0.90. What is the expected duration of a turbulent spell, in trading days?
Check your answer to continue.