Quantitative research
Every claim we publish is attached to a number someone else could reproduce. This page is the protocol that gets us there, written down so you can hold us to it.
What we mean by quantitative
Quantitative research here means a specific discipline, not a house style. We do not publish a view on volatility without the estimator, the sample, the evaluation protocol and the loss function that produced it. A statement like "volatility mean-reverts" is not a finding; a half-life of eleven days estimated on a stated sample, with a confidence interval and an out-of-sample check, is.
Most of what circulates as volatility wisdom fails one of two tests. Either it is unfalsifiable, or it was measured on a quantity that was defined carelessly. The second failure is far more common and far more damaging, because it produces confident numbers that happen to be about the wrong thing.
The protocol
Every question goes through the same eight steps, in this order.
- State the question as a measurable quantity. Which horizon, which asset, which definition of volatility. If it cannot be written as a target variable, it is not yet a research question.
- Fix the measurement. Sampling frequency, noise correction, jump treatment, overnight returns. Decided and documented before any model is fitted.
- Establish the baseline. Usually GARCH(1,1) on daily data or HAR on realized measures. The baseline is the number every alternative has to beat, and it is chosen before the alternatives.
- Specify the candidates in advance. A written shortlist, so the comparison cannot quietly expand until something wins.
- Split before you look. Time-ordered train, validation and test, with purging and an embargo where targets overlap. The test window is touched once.
- Choose the loss before seeing the result. QLIKE by default. Changing the loss after seeing the ranking is the most common way honest people fool themselves.
- Test significance. Diebold-Mariano for a pair, the Model Confidence Set for a field. A lower average loss on its own is not a result.
- Publish either way. If the complicated model does not beat the simple one, that is the finding and it gets written up.
The rule that does the most work: decide steps two, five and six before running step three. Nearly every spectacular volatility result that later evaporates was produced by making one of those three choices after seeing how it affected the answer.
Measurement comes before modelling
Volatility is latent. Everything downstream inherits the quality of the proxy you chose for it, which is why we spend more time here than on model selection. The decisions that matter most:
- Frequency. Finer sampling reduces estimator variance and increases microstructure bias. Five-minute returns are the pragmatic compromise; realized kernels let you use more of the data honestly.
- Jumps. Bipower variation separates the continuous part from jumps. They have very different persistence, so pooling them degrades the forecast of both.
- The overnight gap. A large share of daily variance arrives while the market is shut. Dropping it, scaling it or modelling it separately are all defensible; doing it silently is not.
- Proxy error. The target is itself an estimate. Only certain loss functions preserve the true model ranking when the proxy is noisy, which constrains step six above.
How we evaluate
- QLIKE as the default loss — scale-invariant and robust to proxy noise, unlike MSE on variance, which a handful of crisis days can decide on their own.
- Horizon by horizon. One-day and twenty-two-day forecasts are different problems and a model can win one while losing the other. We report both rather than the flattering one.
- Rolling refits with a realistic schedule, respecting publication lags on any external variable.
- Diebold-Mariano for pairwise comparisons and the Model Confidence Set when several models are in play.
- Purged, embargoed splits whenever targets overlap across rows.
The stack
- Python for most work: NumPy, pandas, SciPy, statsmodels.
- arch for the GARCH family, with Student-t and skew-t innovations where the tails demand it.
- scikit-learn, XGBoost, LightGBM for tree ensembles; PyTorch for sequence models.
- R where the package is simply better — rugarch and highfrequency in particular.
- QuantLib for pricing and surface construction.
- Fixed seeds, pinned versions, and scripts that run top to bottom on a clean machine. If it does not reproduce, it is not finished.
Data
Daily OHLC and adjusted closes across equity indices, single names, rates, FX and commodities; intraday trades and quotes where we can get them; option chains for implied surfaces and the variance risk premium; and macro release calendars, so that scheduled events can be separated from the unscheduled ones rather than averaged together with them.
What gets published
Null results, in full. A note saying that gradient boosting failed to beat HAR on a given dataset is more useful than a tuned configuration that beats it on one window, and it is the kind of result the literature systematically under-reports. Where we cannot share data, we share the protocol and the code path so the work can be repeated on comparable data.
Working with us
We collaborate on applied problems, take questions on published notes, and are happy to be told we are wrong in public. If you have a dataset, a question or a disagreement, write to info@volatility-insights.com.
Further reading
- Patton, A. J. (2011). Volatility Forecast Comparison using Imperfect Volatility Proxies. Journal of Econometrics 160(1), 246–256.
- Hansen, P. R., Lunde, A. & Nason, J. M. (2011). The Model Confidence Set. Econometrica 79(2), 453–497.
- Diebold, F. X. & Mariano, R. S. (1995). Comparing Predictive Accuracy. Journal of Business & Economic Statistics 13(3), 253–263.
- Bergmeir, C. & Benitez, J. M. (2012). On the use of cross-validation for time series predictor evaluation. Information Sciences 191, 192–213.
- Andersen, T. G. & Bollerslev, T. (1998). Answering the Skeptics: Yes, Standard Volatility Models Do Provide Accurate Forecasts. International Economic Review 39(4), 885–905.
Volatility