Monte Carlo · Return processes

Filtered Historical Simulation (EWMA)

fhs_ewma

The bootstrap treats a quiet Tuesday in 2015 and the worst day of March 2020 as equally representative of tomorrow. Filtered historical simulation does not. It strips today's volatility out of history to leave pure shocks, resamples those shocks, and then rebuilds volatility forward starting from where it actually stands now.

The idea

Daily equity returns are not identically distributed over time. Their volatility moves, and it moves persistently: turbulent days cluster together, and a market that was volatile last week is likely to be volatile tomorrow. An unconditional bootstrap ignores this. It draws from a pool that mixes 2008 and 2017 in fixed proportion regardless of what state the market is in when you press run.

Filtered historical simulation, introduced by Barone-Adesi, Giannopoulos and Vosper (1999), separates the two components. Write each return as a conditional volatility times a standardized shock. If the volatility model is doing its job, those shocks are close to IID even though the returns are not, which means they are the part of history it is legitimate to resample freely. Volatility is then reintroduced by a forward recursion that starts from today's level.

The practical consequence: run the same portfolio in a calm market and in a turbulent one, and FHS gives you materially different near-term distributions. The bootstrap gives you the same answer both times.

The pipeline

  1. 1

    Move to log space

    Daily simple returns become log returns via log(1 + r). Everything downstream happens in log space, which is what guarantees positive gross returns at the end.

  2. 2

    Remove the per-asset sample log mean

    Estimation-side demeaning uses the historical log mean, deliberately not the user's forward drift target: the residuals must not depend on a forward assumption. The difference is a per-asset constant, negligible for variance estimation, and disclosed in the artifact.

  3. 3

    Estimate conditional volatility

    An EWMA recursion produces a conditional variance series for each asset, where each day's variance conditions only on strictly earlier observations.

  4. 4

    Standardize

    Divide each demeaned log return by its conditional volatility to get the standardized residual matrix, centered with unit variance per asset.

  5. 5

    Resample complete rows

    Draw whole cross-asset residual rows IID. Cross-sectional dependence is inherited exactly: a day when every holding was shocked together stays that way.

  6. 6

    Rebuild volatility forward

    Run the same variance recursion forward from today's one-step-ahead variance, so simulated volatility evolves rather than staying frozen.

  7. 7

    Return to simple returns

    Apply the drift normalization, then exp minus one. Gross returns are positive by construction and no clipping correction is needed.

The EWMA variance recursion

For a drift-removed log-return series , the conditional variance follows

with the decay parameter defaulting to . Note the indexing: conditions on observations strictly before , so no day is standardized using its own realization. The recursion initializes at the full-sample variance, a declared and disclosed choice whose influence decays geometrically.

EWMA is the integrated special case of the more general GJR-GARCH form, with , , and . The engine stores both models in that single form so the forward simulation recursion vectorizes identically whichever one an asset ended up with.

The 0.94 decay is the RiskMetrics benchmark value. It is a reasonable starting point, not a validated production constant for Indian equities, and it is documented as such rather than presented as tuned.

Drift normalization in log space

Simulating in log space creates a subtlety that a naive implementation gets wrong. Setting the log mean equal to the desired arithmetic mean does not produce that arithmetic mean, because of Jensen's inequality: the expectation of an exponential is not the exponential of the expectation.

The engine therefore normalizes so the conditional expected gross return matches the declared daily arithmetic target exactly. The per-asset log mean is set to

where the expectation is taken over that asset's empirical residual pool, precomputed on a volatility grid. The correction is not the textbook , because the residuals are not Gaussian. Using the empirical cumulant generating function keeps the declared drift semantics exact even under fat-tailed, skewed residuals.

This is also why the engine must not add its ordinary additive simple-return drift shift on top of an FHS run. Drift and the per-path HAC mean perturbation are already normalized in, with the perturbation folded through the same transformation so positive support survives it. See Drift and estimation risk.

History requirements and guards

Governance tierAligned observationsBehaviour
insufficient_below_3yUnder 756Rejected with MC_INSUFFICIENT_HISTORY_FOR_PROCESS. Use the block bootstrap or extend the lookback.
low_confidence_3_to_5y756 to 1,259Runs, flagged low confidence in the result.
direct_fit_5y_plus1,260 and aboveRuns without a confidence caveat.

These are operability and confidence tiers. They are not proof of long-horizon calibration, and the labels are deliberately worded so they cannot be read that way.

During simulation the conditional volatility is clamped into around the long-run level. This is a declared guard against a runaway recursion, not a modeling feature, and like every other threshold on this page it is a versioned engineering constant that changes only on validation evidence.

What you give up

No calendar window. FHS reconstructs returns instead of replaying dated rows, so there is no historical date attached to a simulated day. Two things follow. Inflation falls back to the disclosed constant model rather than calendar-aligned CPI reuse, and the 2008_repeat and covid_repeat window stresses are unavailable and reported as skipped with the reason.

Residuals are resampled IID. The volatility model carries all the temporal structure. Any dependence the filter fails to capture is discarded rather than preserved, which is the opposite of the tradeoff the block bootstrap makes.

Not validated as superior. FHS is selectable, not the default. Promotion is gated on a rolling-origin validation harness that does not exist yet, so this process is offered as a different set of assumptions to compare against, not as an upgrade.

When to choose it

Choose it when the near term matters and current conditions are not typical. If you are running a simulation during or just after a turbulent stretch, an unconditional bootstrap will understate near-horizon risk, and FHS will not.

Choose the GJR-GARCH variant instead if you have five years of history and want the asymmetry between losses and gains modeled explicitly. EWMA treats a 3% fall and a 3% rise as identical news about future volatility, which equity markets consistently show they are not.

Keep the block bootstrap for 20-year retirement questions, where the drift assumption dominates everything the volatility filter could contribute, and where you probably want calendar-aligned inflation and the window scenarios.

References

  • Barone-Adesi, G., Giannopoulos, K., & Vosper, L. (1999). VaR without Correlations for Portfolios of Derivative Securities. Journal of Futures Markets, 19(5), 583–602.
  • Hull, J., & White, A. (1998). Incorporating Volatility Updating into the Historical Simulation Method for Value at Risk. Journal of Risk, 1(1), 5–19.
  • J.P. Morgan / Reuters (1996). RiskMetrics Technical Document, 4th edition. The source of the 0.94 daily decay convention.
  • Pritsker, M. (2006). The Hidden Dangers of Historical Simulation. Journal of Banking & Finance, 30(2), 561–582.