Does Anything Beat a Naive Forecast? Machine Learning, GARCH, and Equity Volatility¶
Anthony Le | Denison University, Department of Economics
Supervisors: Dr. Emily Marshall & Dr. Tyler Wake
Abstract¶
This paper compares eleven volatility forecasters — three GARCH models, two HAR-RV variants, a naive persistence floor, two tree-based ML models, an LSTM, and two GARCH-ML hybrids — across 18 U.S. equities using a 2010–2017/2018–2025 expanding-window walk-forward split. At the 1-day horizon, no model beats a naive persistence forecast under squared-error loss (Diebold-Mariano $p<0.001$ for every other model); a 90%-confidence Model Confidence Set retains only Persistence, HAR-RV, and HAR-X. Under QLIKE loss the ranking inverts, and XGBoost/GARCH-XGBoost become the survivors instead. Economic evaluation is more stable: Volatility-Timing and Risk-Parity underperform passive benchmarks under all eleven models, while Regime-Based and variance-risk- premium (VRP) strategies outperform under all eleven. VRP's best result (Sharpe up to 2.96) comes from GJR-GARCH(1,1) at near-zero compute cost, far cheaper than the LSTM's 24-hour walk-forward for a comparable gain. Which model "wins" statistically depends on the loss function; which model pays off economically depends on the strategy's mechanism, not on forecast accuracy.
1. Introduction¶
Volatility forecasting sits at the center of derivatives pricing, risk management, and portfolio construction, and few empirical questions in financial econometrics have been revisited as often as Hansen & Lunde's (2005) "Does anything beat a GARCH(1,1)?" Their answer, for foreign exchange data, was largely no. Two decades later, the rise of tree-based ensembles and deep sequence models has reopened the question for equities: Gu, Kelly & Xiu (2020) show large, broad-based gains from machine learning in cross-sectional asset-pricing prediction, and a growing literature on hybrid GARCH-ML architectures (e.g. Kristjanpoller & Minutolo, 2018) argues that combining a parametric conditional-variance model with a flexible learner can outperform either approach alone. Much of this literature, however, evaluates models purely on statistical loss functions (RMSE, QLIKE) without asking whether the improvement is large enough, and stable enough, to matter to an investor who has to pay transaction costs and live through drawdowns — or whether it clears the much lower bar of beating a model that does no fitting at all. Fleming, Kirby & Ostdiek (2001, 2003) and Moreira & Muir (2017) show that volatility-timing can carry real economic value — but that value depends on the quality of the volatility forecast feeding the strategy, which is exactly the open question this paper addresses.
This project runs a controlled horse race between four families of volatility forecaster — traditional econometric (GARCH(1,1), EGARCH(1,1), GJR-GARCH(1,1)), long-memory HAR-RV models (Corsi, 2009's original daily/weekly/monthly-lag specification, plus a variant augmented with lagged VIX as an exogenous regressor, HAR-X), a naive persistence floor (tomorrow's realized volatility forecast simply equals today's — included specifically to test whether the more sophisticated models are adding genuine skill or merely re-deriving the target's own autocorrelation), machine learning (Random Forest, XGBoost, and an LSTM), and hybrid (GARCH-conditional-variance features feeding a Random Forest or XGBoost) — and evaluates all eleven models on both statistical accuracy and, crucially, the economic value of the forecasts once fed into four distinct portfolio strategies. Three research questions organize the analysis:
- Statistical Accuracy. Do machine learning and hybrid models produce statistically significant reductions in out-of-sample forecast error (RMSE, QLIKE) relative to econometric benchmarks and to a naive persistence floor, once a proper multiple-comparisons correction (a Model Confidence Set) is applied across all eleven models — and does that ranking hold up under more than one loss function?
- Economic Utility. Does superior statistical accuracy — where it exists — translate into higher risk-adjusted portfolio returns net of transaction costs?
- Regime Resilience. How stable is each model's statistical and economic performance across calm and turbulent volatility regimes, across the pre- and post-2022 halves of the test window, and across a range of plausible transaction-cost and exposure assumptions?
The remainder of the paper is organized as follows. Section 2 describes the data, the walk-forward validation design, the eleven models, and the evaluation framework (both statistical and economic). Section 3 presents results for each research question in turn, plus a robustness battery that includes cross-asset validation, cost/exposure sensitivity, sub-period stability, and multi-seed/hyperparameter sensitivity checks on the models most sensitive to stochastic optimization. Section 4 discusses what the results imply for practitioners choosing between model complexity and economic value, and Section 5 concludes.
2. Data & Methodology¶
2.1 Sample¶
The sample covers 18 U.S. equities: three broad indices (SPY, QQQ, IWM) and fifteen large-cap single stocks spanning technology (AAPL, MSFT, NVDA), financials (JPM, GS, BAC), healthcare (JNJ, UNH, PFE), consumer (AMZN, WMT, HD), and energy/industrials (XOM, CVX, CAT). Daily OHLC prices run from 2010-02-03 to 2025-12-30 (SPY: 4,002 trading days). Data is split chronologically — never shuffled — into an in-sample training window (January 2010 – December 2017, 8 years) and an out-of-sample test window (January 2018 – December 2025, 8 years), with all models refit on an expanding window at each of 96 month-end dates.
2.2 Realized Volatility & Regime Classification¶
Since intraday data is unavailable at this scale, realized volatility is proxied by the 21-day rolling standard deviation of daily log returns, annualized to a percentage: $RV_{21d,t} = \sigma(\{r_{t-20}, \ldots, r_t\}) \times \sqrt{252} \times 100$. Each observation is tagged into one of three regimes — Low ($RV < 15\%$), Medium ($15$–$25\%$), or High ($> 25\%$) — a threshold scheme applied uniformly across all 18 assets. For SPY over the full 2010–2025 sample this classification splits 65.2% Low / 25.0% Medium / 9.8% High: calm periods dominate, but the tail of genuinely stressed markets (2018 Q4, March 2020, 2022) is large enough to give the regime-stratified evaluation in Section 3.4 statistical traction. Because $RV_{21d}$ is an overlapping 21-day rolling window, roughly 20 of its 21 constituent daily observations are shared with the previous day's value — the target is highly persistent by construction, a point that motivates the Persistence baseline described below.
2.3 Walk-Forward Validation¶
At each of 96 month-end refit dates from December 2017 to November 2025, every model is refit on all data available up to that date (expanding, not rolling, window) and produces forecasts at three horizons — 1-day, 5-day, and 20-day ahead — which are compared against the realized $RV_{21d}$ observed that many trading days later. The 20-day horizon is the one used to drive the monthly-rebalanced portfolio strategies in Section 2.6, since it spans the holding period until the next rebalance; the 1-day horizon is the primary statistical-accuracy metric, matching standard practice in the forecasting literature.
2.4 Models¶
Econometric (3): GARCH(1,1) (Bollerslev, 1986) as the baseline; EGARCH(1,1) (Nelson, 1991)
for asymmetric leverage effects; GJR-GARCH(1,1) for threshold asymmetry. All three are fit on
daily returns via the arch package; EGARCH's multi-step forecasts fall back to 200-path
simulation since the package has no closed-form multi-step EGARCH forecast.
Long-memory / HAR-family (2): HAR-RV (Corsi, 2009), an OLS regression on daily/weekly/monthly
realized-vol lags capturing long-memory persistence, and HAR-X, the same specification
augmented with one additional regressor — lagged VIX — to test whether the market's own
implied-volatility signal carries information beyond RV's own history. HAR-X is implemented as an
OLS extension of HAR-RV rather than a true variance-equation "GARCH-X," since the arch package's
exogenous-regressor support feeds the conditional mean equation, not the volatility recursion; a
faithful variance-equation GARCH-X would require subclassing arch's volatility process, a larger
change than this one-regressor robustness check warranted (see Limitations).
Naive baseline (1): Persistence — the forecast for tomorrow's $RV_{21d}$ is simply today's observed value, with no fitting at all. Given the overlapping-window construction noted in Section 2.2, this is a deliberately difficult floor to beat. Its inclusion tests directly whether any of the more sophisticated models add genuine skill beyond what a model with no fitting at all already captures — a check that is easy to omit when models are compared only against each other.
Machine Learning (3): Random Forest (500 trees) and XGBoost (1,000 rounds, early stopping on a 15% chronological validation split), each trained on 30 features (see 2.5); and a two-layer LSTM (128 hidden units, dropout 0.2, 30-day lookback window), trained in PyTorch with early stopping (patience 10).
Hybrid (2): GARCH-RF and GARCH-XGBoost append each GARCH(1,1) fit's conditional volatility and standardized residual as two additional features to the same 30-feature matrix before training a Random Forest or XGBoost on top — the idea being that the ML learner can pick up nonlinear structure the GARCH model's own conditional-variance equation misses, while still benefiting from GARCH's explicit variance dynamics. Both engineered features are constructed to match, in scale and information timing, exactly what the model sees at forecast time: the conditional-volatility feature is annualized identically to the one-step-ahead forecast value used at inference, and the standardized-residual feature is lagged by one day so that training never sees same-day information the forecast-time value could not have.
All ML and hybrid models are single-step forecasters: because they output one scalar prediction
per refit date rather than a full multi-horizon path (unlike GARCH's closed-form forecast(h)),
the same 1-day-ahead prediction is used as the h5 and h20 forecast. This is a real limitation —
discussed further in Section 4 — and is one reason the ML models' apparent accuracy advantage at
h1 does not persist at h20 (Section 3.2).
Methodological note. Two implementation issues identified during development are resolved in the specification above: a scale-alignment issue between the training-time and forecast-time features feeding the GARCH-hybrid models, and a column-ordering error in HAR-RV's forecast step. All results in this paper reflect the corrected implementations; see the project repository's version-control history for the underlying commits.
2.5 Feature Engineering¶
30 predictors (after correlation filtering at $|r| > 0.95$) feed the ML and hybrid models,
grouped into: historical volatility lags (rv_lag1/10/20/60, rv_ma60, rv_momentum_5_20),
return dynamics (lagged returns and absolute returns, rolling skew/kurtosis, max absolute return
over 20 days), market microstructure (high-low range and its 5-day average, volume ratio, gap
frequency), calendar dummies (day-of-week), and market-wide signals (VIX level/change, SPY's own
realized vol as a market-wide proxy for single stocks). Every feature is lagged by one day
relative to its target to prevent look-ahead bias.
The correlation filter is fit once, on the pooled panel across all 18 tickers restricted to dates on or before the training/test split (December 2017), rather than independently per ticker or refit inside every expanding window. Fitting per ticker risks a different surviving-feature set per asset (breaking every downstream consumer's assumption of a fixed feature dimensionality, most concretely the LSTM's fixed input size); refitting inside each of the 96×18 expanding windows would let the feature set drift over time for negligible robustness benefit, since the ~50 raw engineered features are lags and rolling statistics of only a handful of underlying series whose pairwise correlation structure is not expected to cross the 0.95 threshold differently across an 8-year window. Fitting on the training-only period keeps the choice of which columns exist free of any information from the 2018–2025 test period.
2.6 Evaluation Framework¶
Statistical accuracy is measured by RMSE, MAE, and QLIKE (a loss function specifically
suited to volatility forecasts, robust to imperfect volatility proxies) plus directional accuracy.
Because comparing eleven models simultaneously creates a multiple-comparisons problem — some
difference is guaranteed to look large by chance alone — two significance tests are layered on
top of the raw loss numbers, each run under both loss
functions given the two disagree on which model ranks best (Section 3.3): a pairwise
Diebold-Mariano test of each model against both the GARCH(1,1) baseline and the Persistence
floor (with Newey-West HAC variance correction), and a Model Confidence Set (Hansen, Lunde &
Nason, 2011) computed via arch.bootstrap.MCS at the 90% confidence level on pooled loss across
all 18 assets.
Residual diagnostics — a Ljung-Box test (lag 20 for the econometric/HAR-family models' full-sample residuals; lag 12 for the ML/hybrid models' monthly forecast residuals, since those series have only ~95 points) plus ACF and QQ plots — check whether each model has actually captured the predictable structure in volatility or left autocorrelation on the table.
Economic evaluation feeds each model's forecasts into performance_metrics(): annualized
return, annualized volatility, Sharpe ratio (against a 4% risk-free rate), Sortino ratio, maximum
drawdown, Calmar ratio, and annualized transaction-cost drag as its own reported line item. All
return series are log returns, and equity curves compound via $\exp(\text{cumsum}(r))$ rather
than $(1+r)^{\text{cumprod}}$ — the latter is only valid for simple returns and would silently
misstate drawdown given this project's log-return convention throughout.
2.7 Portfolio Strategies¶
Four strategies, all monthly-rebalanced with a $5-per-trade transaction cost converted to a turnover-proportional basis-point drag:
- Volatility-Timing — allocates between SPY and a bond proxy targeting a constant 15% annualized portfolio volatility, $w_{SPY} = \text{clip}(15/\hat\sigma, 0, 1.5)$.
- Risk-Parity — the 15 single-stock universe (indices excluded), weighted inversely to each stock's forecasted volatility and renormalized to sum to one.
- Regime-Based — a discrete equity/bond allocation (100/0, 60/40, 20/80) set by which volatility regime the forecast falls into.
- VRP (Variance Risk Premium) — a delta-neutral short-straddle proxy that goes long the spread between implied volatility (VIX) and the model's own forecast whenever the model thinks the options market is overpricing volatility, and flat otherwise.
These four strategies split into two economic mechanisms: Volatility-Timing and Risk-Parity depend directly on point-forecast accuracy, while Regime-Based and VRP instead exploit a structural market feature — discrete de-risking, or harvesting the variance risk premium — that persists regardless of forecast precision. This distinction turns out to matter a great deal for the results in Section 3.7.
import os
import pandas as pd
from IPython.display import Image, display
pd.set_option('display.max_columns', None)
RESULTS = '../results'
FIGDIR = '../results/figures'
def show_fig(name, width=850):
display(Image(filename=os.path.join(FIGDIR, name), width=width))
def show_table(name, **kwargs):
return pd.read_csv(os.path.join(RESULTS, name), **kwargs)
print("Manuscript helper functions loaded — all figures/tables below are read from disk, not recomputed.")
Manuscript helper functions loaded — all figures/tables below are read from disk, not recomputed.
3. Results¶
3.1 Stylized Facts¶
Before comparing models, it is worth confirming the data actually exhibits the properties that motivate GARCH-family modeling in the first place. Four statistical tests on SPY's 2010–2025 sample (Figures 1–4) establish this:
- ARCH effects. A Ljung-Box test on squared returns is overwhelmingly significant at every lag tested (lag 5: stat 2,649.7; lag 10: 3,902.5; lag 20: 4,553.0; all $p \approx 0$), confirming strong volatility clustering — the core empirical regularity GARCH models exist to capture.
- Fat tails. A Jarque-Bera test rejects normality overwhelmingly (JB = 26,258.3, $p \approx 0$), consistent with the well-documented fat tails in daily equity returns.
- Long memory in volatility. The autocorrelation function of $RV_{21d}$ decays slowly — 0.992 at lag 1, still 0.815 at lag 10, and 0.525 even at lag 20 — the long-memory signature that motivates HAR-RV's inclusion of daily/weekly/monthly lags rather than a simple AR(1). Stationarity is nonetheless confirmed by an Augmented Dickey-Fuller test (statistic -6.80, $p < 10^{-6}$), so no differencing is required.
- Cross-sectional co-movement. Pairwise realized-volatility correlations across the 18-asset universe range from 0.408 to 0.954 (median 0.664, mean 0.666) — high enough that market-wide vol signals (SPY's own RV, VIX level) are legitimately informative features for single-stock forecasts (Section 2.5), but not so uniform that regime classification is redundant across assets.
SPY's regime breakdown over the full sample is 65.2% Low, 25.0% Medium, and 9.8% High volatility — a reminder that the High-regime evaluation in Section 3.4 rests on a genuine minority of trading days, not a balanced split.
show_fig('fig1_price_returns.png')
show_fig('fig2_rv_regimes.png')
show_fig('fig3_stylized_facts.png')
show_fig('fig4_cross_sectional.png')
3.2 Statistical Accuracy (RQ1)¶
Table 1 reports cross-asset mean RMSE, MAE, QLIKE, and directional accuracy at the 1-day horizon, for all eleven models. The ranking is dominated by the models that most directly exploit $RV_{21d}$'s own persistence: HAR-X (RMSE 1.810) and HAR-RV (1.825) lead, followed closely by the naive Persistence floor itself (1.844) — three models that differ only in how they weight recent RV history, separated by RMSE differences of a few hundredths. Random Forest (2.024) and GARCH-RF (2.098) are next, still well ahead of everything else. There is then a large gap to the GARCH-family and remaining ML/hybrid models: LSTM (5.138), GARCH(1,1) (6.255), GARCH-XGBoost (6.446), XGBoost (6.555), GJR-GARCH(1,1) (6.949), and EGARCH(1,1) (7.364, the weakest model).
This ordering is the direct opposite of what a squared-error ranking alone would suggest matters: the "best" models here are not doing sophisticated forecasting so much as efficiently re-deriving the target's own short-memory autocorrelation (Section 2.2), and the harder question — addressed formally in Section 3.3 — is whether any model does something a naive persistence forecast does not already do. QLIKE tells a materially different story from RMSE: XGBoost (2.158) and GARCH-XGBoost (2.160) have the lowest QLIKE, undercutting HAR-RV (2.179), GARCH-RF (2.177), Persistence (2.180), Random Forest (2.180), and HAR-X (2.183) — all seven models sit within 0.025 QLIKE of one another despite a 6x spread in RMSE, and the two loss functions do not even agree on which single model is best. Directional accuracy separates cleanly by family instead: the three GARCH-family models sit noticeably lower (0.763–0.797) than every persistence-adjacent, ML, and hybrid model (0.877–0.929) — GARCH's conditional-variance recursion is evidently a weaker guide to the sign of tomorrow's RV move than any model that directly sees recent RV lags.
print("Table 1: Cross-asset mean forecast accuracy, all horizons")
t1 = show_table('forecast_accuracy_all_models.csv', index_col=0)
t1.sort_values('RMSE')
Table 1: Cross-asset mean forecast accuracy, all horizons
| RMSE | MAE | QLIKE | DirAcc | RMSE_h5 | RMSE_h20 | |
|---|---|---|---|---|---|---|
| HAR-X | 1.810 | 1.076 | 2.183 | 0.926 | 4.790 | 14.279 |
| HAR-RV | 1.825 | 1.036 | 2.179 | 0.928 | 4.910 | 14.451 |
| Persistence | 1.844 | 1.007 | 2.180 | 0.928 | 5.022 | 14.564 |
| Random Forest | 2.024 | 1.219 | 2.180 | 0.920 | 5.019 | 14.350 |
| GARCH-RF | 2.098 | 1.258 | 2.177 | 0.929 | 4.925 | 14.179 |
| LSTM | 5.138 | 2.375 | 2.172 | 0.877 | 6.624 | 13.347 |
| GARCH(1,1) | 6.255 | 4.072 | 2.224 | 0.797 | 6.586 | 12.185 |
| GARCH-XGBoost | 6.446 | 2.334 | 2.160 | 0.892 | 7.721 | 13.215 |
| XGBoost | 6.555 | 2.423 | 2.158 | 0.885 | 7.860 | 13.289 |
| GJR-GARCH(1,1) | 6.949 | 4.640 | 2.219 | 0.763 | 6.946 | 12.036 |
| EGARCH(1,1) | 7.364 | 4.348 | 2.226 | 0.790 | 7.887 | 12.394 |
Random Forest's advantage, however, reverses at the 20-day horizon: its RMSE_h20 of 14.327 is
worse than GARCH(1,1)'s 12.185 and GJR-GARCH(1,1)'s 12.036, even though it remains the best model
at h1 and h5. This is a direct consequence of the single-step-forecaster limitation noted in
Section 2.4 — RF, XGBoost, and LSTM all reuse their 1-day-ahead point prediction as the h20
forecast, while GARCH's forecast(horizon=20) produces a genuine 20-step-ahead path that
correctly reverts toward the unconditional variance. The ML models' accuracy advantage is real at
short horizons but is an artifact of horizon mismatch, not genuine skill, by the time one reaches
a full month ahead — a caveat directly relevant to interpreting the portfolio results in Section
3.7, since the monthly-rebalanced strategies all use the h20 forecast.
Figure 5 shows the cross-sectional mean feature importance for the Random Forest — the previous
day's own RV lag (rv_lag1) dominates at 26.8% importance, followed by the 20-day maximum
absolute return (19.9%) and the 10-day RV lag (8.5%). Calendar dummies are essentially
irrelevant (each day-of-week indicator carries under 0.03% importance), suggesting the model's
edge over GARCH comes from richer lag-structure flexibility rather than from exploiting
calendar effects GARCH cannot see. Figure 6 plots SPY forecasts against realized volatility for
the five most distinctive models, faceted by family.
show_fig('fig5_feature_importance.png')
show_fig('fig6_ml_vs_garch_spy.png')
3.3 Statistical Significance: Model Confidence Set & Diebold-Mariano¶
RMSE rankings alone do not establish that any model's edge is significant rather than sampling noise, and with eleven models being compared simultaneously, some difference is guaranteed to look large by chance alone. This section runs the same two significance tests — Model Confidence Set and Diebold-Mariano — under both squared-error and QLIKE loss, against both the GARCH(1,1) baseline and the Persistence floor, because the two loss functions turn out to disagree sharply about which models actually clear the bar.
Under squared-error loss (Tables 2–3), the naive Persistence floor is nearly unbeatable. A 90%-confidence Model Confidence Set retains only three models: HAR-X ($p=1.00$), Persistence, and HAR-RV (both $p=0.224$) — every GARCH-family model, both tree ensembles, the LSTM, and both hybrids are excluded, including Random Forest ($p=0.000$). Diebold-Mariano against Persistence is unambiguous: every model in the study except HAR-RV and HAR-X is significantly worse than Persistence (all $p<0.001$, positive DM statistic), including Random Forest (DM $=6.15$), GARCH-RF (DM $=5.11$), and every GARCH-family model. HAR-RV and HAR-X are statistically indistinguishable from Persistence (DM $=-1.06$ and $-1.63$, $p=0.29$ and $0.10$) — not significantly better, only tied. Against the GARCH(1,1) baseline, by contrast, five models — GARCH-RF, HAR-X, HAR-RV, Persistence, and Random Forest — all beat GARCH(1,1) significantly (DM around $-10.2$ in each case, $p<0.001$), with LSTM a weaker but still significant beat (DM $=-2.01$, $p=0.044$); XGBoost and GARCH-XGBoost are statistically tied with GARCH(1,1); EGARCH(1,1) and GJR-GARCH(1,1) are significantly worse than their own GARCH(1,1) sibling.
Under QLIKE loss (Tables 2b–3b), the ranking inverts. The MCS instead retains XGBoost ($p=1.00$) and GARCH-XGBoost ($p=0.285$) — the two models excluded under squared error — while HAR-X, HAR-RV, Persistence, and Random Forest are all now excluded ($p=0.000$ in every case). Diebold-Mariano against Persistence confirms the reversal: XGBoost (DM $=-4.21$) and GARCH-XGBoost (DM $=-4.10$) both beat Persistence significantly ($p<0.001$), HAR-RV and GARCH-RF beat it more weakly ($p\approx0.02$–$0.03$), while Random Forest and LSTM are statistically tied with Persistence, and HAR-X, GJR-GARCH(1,1), GARCH(1,1), and EGARCH(1,1) are all significantly worse than Persistence under QLIKE — HAR-X's squared-error win over Persistence does not survive the switch to QLIKE. Every model that fits at all (all ten non-Persistence models) beats GARCH(1,1) significantly under QLIKE except GJR-GARCH(1,1) and EGARCH(1,1), which are statistically tied with their own family baseline.
The headline methodological finding is therefore that "which model wins" is not a fact about these eleven models so much as a fact about which loss function is asked. RMSE (and squared- error DM/MCS) rewards models that track $RV_{21d}$'s own short-memory persistence as closely as possible — HAR-X, HAR-RV, and the naive floor itself. QLIKE — a loss the literature (Patton, 2011) treats as more robust to noise in the realized-volatility proxy and more sensitive to relative rather than absolute errors — instead rewards XGBoost and its GARCH-augmented hybrid. A study that ran only the squared-error test would report "Random Forest is the sole survivor and beats GARCH(1,1)," a claim that is squared-error-true but does not survive either a naive-baseline check or a change of loss function.
print("Table 2: Model Confidence Set (90% confidence, 1-day horizon, pooled across 18 assets, squared-error loss)")
display(show_table('model_confidence_set.csv', index_col=0))
print("\nTable 3: Diebold-Mariano vs. GARCH(1,1) baseline (squared-error loss, 1-day horizon, pooled)")
display(show_table('diebold_mariano_vs_garch.csv', index_col=0).sort_values('DM stat'))
print("\nTable 4: Diebold-Mariano vs. Persistence floor (squared-error loss, 1-day horizon, pooled)")
show_table('diebold_mariano_vs_persistence.csv', index_col=0).sort_values('DM stat')
Table 2: Model Confidence Set (90% confidence, 1-day horizon, pooled across 18 assets, squared-error loss)
| Pvalue | in_mcs | |
|---|---|---|
| Model name | ||
| HAR-X | 1.000 | True |
| Persistence | 0.224 | True |
| HAR-RV | 0.224 | True |
| XGBoost | 0.001 | False |
| GARCH-XGBoost | 0.001 | False |
| LSTM | 0.001 | False |
| EGARCH(1,1) | 0.000 | False |
| GJR-GARCH(1,1) | 0.000 | False |
| GARCH(1,1) | 0.000 | False |
| Random Forest | 0.000 | False |
| GARCH-RF | 0.000 | False |
Table 3: Diebold-Mariano vs. GARCH(1,1) baseline (squared-error loss, 1-day horizon, pooled)
| DM stat | p-value | Beats GARCH(1,1) | |
|---|---|---|---|
| Model | |||
| GARCH-RF | -10.2798 | 0.0000 | True |
| HAR-X | -10.2524 | 0.0000 | True |
| HAR-RV | -10.2241 | 0.0000 | True |
| Persistence | -10.1935 | 0.0000 | True |
| Random Forest | -10.1528 | 0.0000 | True |
| LSTM | -2.0101 | 0.0444 | True |
| GARCH-XGBoost | 0.4462 | 0.6554 | False |
| XGBoost | 0.5849 | 0.5586 | False |
| EGARCH(1,1) | 3.6762 | 0.0002 | False |
| GJR-GARCH(1,1) | 6.0709 | 0.0000 | False |
Table 4: Diebold-Mariano vs. Persistence floor (squared-error loss, 1-day horizon, pooled)
| DM stat | p-value | Beats Persistence | |
|---|---|---|---|
| Model | |||
| HAR-X | -1.6335 | 0.1024 | False |
| HAR-RV | -1.0603 | 0.2890 | False |
| LSTM | 3.5345 | 0.0004 | False |
| GARCH-XGBoost | 3.6455 | 0.0003 | False |
| XGBoost | 3.7735 | 0.0002 | False |
| GARCH-RF | 5.1117 | 0.0000 | False |
| Random Forest | 6.1517 | 0.0000 | False |
| EGARCH(1,1) | 7.9071 | 0.0000 | False |
| GARCH(1,1) | 10.1935 | 0.0000 | False |
| GJR-GARCH(1,1) | 10.7767 | 0.0000 | False |
print("Table 5: Model Confidence Set (90% confidence, 1-day horizon, pooled across 18 assets, QLIKE loss)")
display(show_table('model_confidence_set_qlike.csv', index_col=0))
print("\nTable 6: Diebold-Mariano vs. GARCH(1,1) baseline (QLIKE loss, 1-day horizon, pooled)")
display(show_table('diebold_mariano_vs_garch_qlike.csv', index_col=0).sort_values('DM stat'))
print("\nTable 7: Diebold-Mariano vs. Persistence floor (QLIKE loss, 1-day horizon, pooled)")
show_table('diebold_mariano_vs_persistence_qlike.csv', index_col=0).sort_values('DM stat')
Table 5: Model Confidence Set (90% confidence, 1-day horizon, pooled across 18 assets, QLIKE loss)
| Pvalue | in_mcs | |
|---|---|---|
| Model name | ||
| XGBoost | 1.000 | True |
| GARCH-XGBoost | 0.285 | True |
| LSTM | 0.003 | False |
| EGARCH(1,1) | 0.000 | False |
| GARCH(1,1) | 0.000 | False |
| Random Forest | 0.000 | False |
| GJR-GARCH(1,1) | 0.000 | False |
| HAR-X | 0.000 | False |
| GARCH-RF | 0.000 | False |
| Persistence | 0.000 | False |
| HAR-RV | 0.000 | False |
Table 6: Diebold-Mariano vs. GARCH(1,1) baseline (QLIKE loss, 1-day horizon, pooled)
| DM stat | p-value | Beats GARCH(1,1) | |
|---|---|---|---|
| Model | |||
| GARCH-XGBoost | -6.8404 | 0.000 | True |
| XGBoost | -6.7536 | 0.000 | True |
| LSTM | -5.4661 | 0.000 | True |
| GARCH-RF | -5.2600 | 0.000 | True |
| HAR-RV | -5.0398 | 0.000 | True |
| Random Forest | -4.7905 | 0.000 | True |
| Persistence | -4.7213 | 0.000 | True |
| HAR-X | -4.6152 | 0.000 | True |
| GJR-GARCH(1,1) | -1.1218 | 0.262 | False |
| EGARCH(1,1) | 0.4454 | 0.656 | False |
Table 7: Diebold-Mariano vs. Persistence floor (QLIKE loss, 1-day horizon, pooled)
| DM stat | p-value | Beats Persistence | |
|---|---|---|---|
| Model | |||
| XGBoost | -4.2100 | 0.0000 | True |
| GARCH-XGBoost | -4.0951 | 0.0000 | True |
| HAR-RV | -2.2981 | 0.0216 | True |
| GARCH-RF | -2.2281 | 0.0259 | True |
| LSTM | -1.7761 | 0.0757 | False |
| Random Forest | -0.1417 | 0.8873 | False |
| HAR-X | 3.2899 | 0.0010 | False |
| GJR-GARCH(1,1) | 3.7258 | 0.0002 | False |
| GARCH(1,1) | 4.7213 | 0.0000 | False |
| EGARCH(1,1) | 4.7875 | 0.0000 | False |
3.4 Regime-Stratified Performance¶
Splitting SPY's 1-day-ahead RMSE by volatility regime (Table 8) again shows the persistence- adjacent models dominating, and by an even wider margin in the High-volatility regime than the overall average suggested: HAR-RV's High-regime RMSE (0.664) is actually lower than its own Low-regime RMSE (0.712) — a High/Low ratio of 0.9, i.e. no degradation at all — followed by Persistence (ratio 1.3) and HAR-X (1.5). This is mechanically sensible: a persistence-style forecast tracks a slowly-evolving elevated-volatility regime just as well as it tracks a calm one, since both rely on the same one-step "yesterday predicts today" logic rather than any regime- specific structure. Random Forest (ratio 2.3) and GARCH-RF (3.9) are the next most stable. Every GARCH-family model degrades sharply from calm to stressed markets — GJR-GARCH(1,1) 4.9x, GARCH(1,1) 5.6x, EGARCH(1,1) 7.1x, EGARCH's asymmetric leverage-effect specification, in principle built to handle exactly this kind of regime shift, in practice the least regime-resilient econometric model in this sample. XGBoost (14.3x) and GARCH-XGBoost (15.4x) degrade the most severely of all eleven models despite strong Low-regime performance — a reminder that the models this paper's QLIKE-based significance test (Section 3.3) prefers are also the ones whose squared- error accuracy is most concentrated in calm markets and most fragile in stressed ones.
print("Table 8: SPY RMSE by volatility regime (1-day horizon)")
regime_table = show_table('regime_evaluation_spy.csv', index_col=0)
regime_table['High/Low ratio'] = regime_table['High'] / regime_table['Low']
regime_table.sort_values('High/Low ratio')
Table 8: SPY RMSE by volatility regime (1-day horizon)
| Low | Medium | High | High/Low ratio | |
|---|---|---|---|---|
| Model | ||||
| HAR-RV | 0.712 | 1.130 | 0.664 | 0.932584 |
| Persistence | 0.720 | 1.197 | 0.946 | 1.313889 |
| HAR-X | 0.683 | 0.981 | 0.992 | 1.452416 |
| Random Forest | 0.774 | 1.185 | 1.774 | 2.291990 |
| GARCH-RF | 0.777 | 1.151 | 3.008 | 3.871300 |
| GJR-GARCH(1,1) | 3.287 | 6.631 | 16.264 | 4.947977 |
| GARCH(1,1) | 2.451 | 4.189 | 13.808 | 5.633619 |
| EGARCH(1,1) | 2.553 | 3.500 | 18.215 | 7.134743 |
| LSTM | 1.064 | 1.546 | 11.318 | 10.637218 |
| XGBoost | 1.058 | 1.595 | 15.136 | 14.306238 |
| GARCH-XGBoost | 0.984 | 1.545 | 15.193 | 15.440041 |
3.5 Residual Diagnostics¶
A model can have a low average RMSE while still leaving predictable structure in its errors — the Ljung-Box test checks for exactly this. On the full-sample standardized residuals of the three GARCH-family models, none show significant remaining autocorrelation at lag 20 (GARCH(1,1): stat 26.58, $p = 0.148$; EGARCH(1,1): 27.16, $p = 0.131$; GJR-GARCH(1,1): 24.81, $p = 0.209$) — all three have adequately captured the conditional-variance dynamics they were built for. Among the remaining eight models' monthly forecast residuals (lag 12, since these series have only ~95 points), every model passes comfortably ($p > 0.40$ in every case: HAR-RV 0.794, HAR-X 0.967, Persistence 0.400, Random Forest 0.672, XGBoost 0.975, LSTM 0.849, GARCH-RF 0.972, GARCH-XGBoost 0.984) — no model in the study leaves detectable predictable structure in its 1-day-ahead forecast errors.
show_fig('fig7_residual_diagnostics_garch.png')
show_fig('fig8_residual_diagnostics_ml_hybrid.png')
3.6 Forecasts vs. Implied Volatility¶
A natural benchmark for any statistical forecaster is the options market itself: does the model beat VIX as a predictor of SPY's future realized volatility? Here the ranking flips back toward the original squared-error story from Section 3.2, and for the same underlying reason: this comparison is made at month-end against realized volatility over the subsequent 21 trading days — a horizon far closer to h20 than h1. The three econometric models (GJR-GARCH, GARCH(1,1), EGARCH) all beat VIX (vs.-IV RMSE differences of $-0.96$, $-0.51$, and $-0.49$ respectively), while every other model is worse than VIX at this task, and the ordering among them is the mirror image of Table 1's 1-day ranking: LSTM ($+1.04$) and GARCH-XGBoost ($+1.14$) are the least bad of the non-econometric models, followed by XGBoost ($+1.21$), GARCH-RF ($+1.90$), HAR-X ($+2.03$), Random Forest ($+2.14$), HAR-RV ($+2.26$), and Persistence worst of all ($+2.36$) — the exact three models that led Table 1's 1-day RMSE ranking (HAR-X, HAR-RV, Persistence) are now among the worst performers once the horizon extends to a month. This is the clearest illustration in the paper that "beats a persistence floor at 1-day" and "produces a useful monthly-horizon forecast" are different, and in this sample largely disjoint, properties: a forecast that is excellent at capturing tomorrow's value by construction carries essentially no information about mean reversion over the following month, which is exactly what GARCH's explicit conditional- variance recursion is built to capture. Combined with the h20 RMSE reversal already visible in Table 1, this reinforces that whatever edge the persistence-adjacent models have is concentrated at very short horizons and does not extend to the monthly horizon that both VIX and the portfolio strategies in Section 3.7 actually operate on.
print("Table 9: SPY forecasts vs. Implied Volatility (VIX) as predictors of forward 21-day RV")
show_table('iv_comparison.csv', index_col=0).round(3).sort_values('RMSE')
Table 9: SPY forecasts vs. Implied Volatility (VIX) as predictors of forward 21-day RV
| RMSE | MAE | QLIKE | DirAcc | vs_IV_RMSE_diff | |
|---|---|---|---|---|---|
| model | |||||
| GJR-GARCH(1,1) | 8.627 | 5.794 | 1.760 | 0.511 | -0.959 |
| GARCH(1,1) | 9.073 | 5.690 | 1.791 | 0.468 | -0.512 |
| EGARCH(1,1) | 9.096 | 5.480 | 1.810 | 0.426 | -0.490 |
| Implied Vol (VIX) | 9.586 | 6.776 | 2.267 | 0.532 | 0.000 |
| LSTM | 10.627 | 6.398 | 1.747 | 0.426 | 1.042 |
| GARCH-XGBoost | 10.721 | 6.393 | 1.755 | 0.404 | 1.135 |
| XGBoost | 10.793 | 6.417 | 1.753 | 0.404 | 1.208 |
| GARCH-RF | 11.482 | 6.681 | 1.762 | 0.415 | 1.896 |
| HAR-X | 11.612 | 6.629 | 1.773 | 0.415 | 2.027 |
| Random Forest | 11.724 | 6.764 | 1.764 | 0.415 | 2.139 |
| HAR-RV | 11.843 | 6.722 | 1.767 | 0.394 | 2.257 |
| Persistence | 11.944 | 6.798 | 1.766 | 0.415 | 2.359 |
3.7 Economic Evaluation (RQ2)¶
Section 3.3 established that "best model" is highly sensitive to loss function and to whether a naive floor is included at all. This section asks a different, and in this study's case more stable, question: regardless of which model supplies the forecast, does the strategy it drives add economic value? Table 10 reports Sharpe ratio, annualized return, maximum drawdown, and annualized transaction-cost drag for all 44 model × strategy combinations plus the two benchmarks (Buy & Hold SPY, Equal-Weight 15-Stock), sorted by Sharpe ratio descending. Figure 9 visualizes Sharpe by model (colored by family) faceted by strategy; Figure 10 shows VRP equity curves.
The two strategies built directly on point-forecast accuracy — Volatility-Timing and Risk-Parity — underperform their respective passive benchmarks under every one of the eleven models:
- Volatility-Timing Sharpe ranges only 0.44–0.51 across all eleven models (LSTM best at 0.506, EGARCH(1,1) worst at 0.437), versus 0.53 for simple Buy & Hold SPY. Even the best model does not close the gap. The strategy under-participates in the sustained 2021–2025 bull run precisely because it de-risks whenever forecast volatility rises, a well-documented drag on vol-targeting strategies during strong trending markets (Moreira & Muir, 2017, note the same tension).
- Risk-Parity fares even worse in absolute terms (Sharpe 0.21–0.22 across all eleven models) against an Equal-Weight benchmark of 0.64 — inverse-vol weighting among the 15 stocks systematically underweights the highest-volatility (often highest-returning, in this sample) names, and the eleven models are barely distinguishable from one another here (a 0.012 Sharpe spread top to bottom).
Two strategies, by contrast, do beat their benchmarks by a wide margin, under every model:
- Regime-Based allocation achieves Sharpe 0.58–0.71 across models — Random Forest and GARCH-RF tie for the lead (0.707 each), with HAR-RV (0.702) and HAR-X (0.693) close behind — against 0.53 for Buy & Hold SPY, while cutting maximum drawdown roughly in half. The discrete, infrequently-rebalanced regime bins evidently avoid the over-trading and bull-market under-participation that hurts continuous Volatility-Timing.
- VRP (variance risk premium) dominates every other strategy by a wide margin: Sharpe ratios from 1.20 (EGARCH(1,1), its weakest model) up to 2.96 (GJR-GARCH(1,1)), with LSTM (2.955) and HAR-X (2.860) close behind — four to six times the Sharpe of Buy & Hold SPY. This is not primarily a forecasting-skill story: VRP harvests the well-documented empirical variance risk premium (implied volatility on average exceeds subsequently realized volatility), and any reasonable forecast of realized vol is sufficient to identify when that premium is unusually rich — nine of the eleven models land within a 2.72–2.96 Sharpe band, a far tighter spread than either the squared-error or QLIKE statistical rankings would suggest. Figure 10 makes this visible directly: every model's VRP equity curve pulls sharply away from Buy & Hold SPY over the full 2018–2025 window.
No single model is best across all four strategies, and the model with the strongest 1-day statistical accuracy (HAR-X, per Table 1) is never the single best economic performer either — it places 2nd in Regime-Based and 3rd in VRP, solidly competitive but not dominant. Random Forest, by contrast, is the best (tied) Regime-Based performer despite ranking outside the squared-error MCS (Section 3.3) and near the bottom of the vs.-VIX comparison (Section 3.6) — a reminder that a model's economic usefulness in one specific strategy need not track its statistical ranking at all. The clearest generalization remains the one from Section 3.6: strategies keyed to the h20 horizon reward whichever model's forecast behaves sensibly at a month-ahead horizon, which is not necessarily the model that wins the h1 accuracy race.
print("Table 10: Portfolio performance, all 44 model x strategy combinations + benchmarks")
t6 = show_table('portfolio_performance.csv')
t6.sort_values('Sharpe', ascending=False)
Table 10: Portfolio performance, all 44 model x strategy combinations + benchmarks
| Strategy | Model | Ann. Return | Ann. Volatility | Sharpe | Sortino | Max Drawdown | Calmar | Ann. Cost Drag | |
|---|---|---|---|---|---|---|---|---|---|
| 11 | VRP | GJR-GARCH(1,1) | 0.1123 | 0.0244 | 2.9633 | 1.8404 | -0.0939 | 1.1967 | 0.0002 |
| 35 | VRP | LSTM | 0.1322 | 0.0312 | 2.9545 | 1.6043 | -0.1809 | 0.7311 | 0.0006 |
| 19 | VRP | HAR-X | 0.1269 | 0.0304 | 2.8604 | 1.5150 | -0.1761 | 0.7209 | 0.0006 |
| 39 | VRP | GARCH-RF | 0.1296 | 0.0321 | 2.7928 | 1.4411 | -0.1920 | 0.6750 | 0.0006 |
| 15 | VRP | HAR-RV | 0.1292 | 0.0320 | 2.7899 | 1.4241 | -0.1905 | 0.6782 | 0.0006 |
| 43 | VRP | GARCH-XGBoost | 0.1307 | 0.0326 | 2.7832 | 1.4233 | -0.2002 | 0.6527 | 0.0006 |
| 27 | VRP | Random Forest | 0.1295 | 0.0322 | 2.7811 | 1.4289 | -0.1926 | 0.6725 | 0.0006 |
| 23 | VRP | Persistence | 0.1292 | 0.0324 | 2.7567 | 1.3971 | -0.1946 | 0.6641 | 0.0006 |
| 31 | VRP | XGBoost | 0.1298 | 0.0330 | 2.7179 | 1.3700 | -0.2050 | 0.6329 | 0.0006 |
| 3 | VRP | GARCH(1,1) | 0.0922 | 0.0245 | 2.1304 | 1.0476 | -0.1480 | 0.6230 | 0.0003 |
| 7 | VRP | EGARCH(1,1) | 0.0768 | 0.0308 | 1.1956 | 0.4559 | -0.2166 | 0.3546 | 0.0003 |
| 38 | Regime-Based | GARCH-RF | 0.1297 | 0.1268 | 0.7071 | 0.8684 | -0.1472 | 0.8811 | 0.0008 |
| 26 | Regime-Based | Random Forest | 0.1297 | 0.1268 | 0.7071 | 0.8684 | -0.1472 | 0.8811 | 0.0008 |
| 14 | Regime-Based | HAR-RV | 0.1272 | 0.1241 | 0.7023 | 0.8608 | -0.1472 | 0.8639 | 0.0009 |
| 18 | Regime-Based | HAR-X | 0.1268 | 0.1253 | 0.6931 | 0.8479 | -0.1472 | 0.8616 | 0.0009 |
| 34 | Regime-Based | LSTM | 0.1231 | 0.1256 | 0.6621 | 0.8113 | -0.1472 | 0.8365 | 0.0010 |
| 2 | Regime-Based | GARCH(1,1) | 0.1200 | 0.1223 | 0.6544 | 0.8221 | -0.1492 | 0.8044 | 0.0009 |
| 10 | Regime-Based | GJR-GARCH(1,1) | 0.1228 | 0.1290 | 0.6424 | 0.7998 | -0.1970 | 0.6235 | 0.0011 |
| 45 | Benchmark | Equal-Weight 15-Stock | 0.1574 | 0.1831 | 0.6413 | 0.7795 | -0.3353 | 0.4694 | NaN |
| 6 | Regime-Based | EGARCH(1,1) | 0.1143 | 0.1238 | 0.5998 | 0.7041 | -0.2158 | 0.5295 | 0.0006 |
| 22 | Regime-Based | Persistence | 0.1204 | 0.1371 | 0.5868 | 0.6886 | -0.2448 | 0.4921 | 0.0008 |
| 42 | Regime-Based | GARCH-XGBoost | 0.1184 | 0.1358 | 0.5773 | 0.6723 | -0.2448 | 0.4838 | 0.0009 |
| 30 | Regime-Based | XGBoost | 0.1184 | 0.1358 | 0.5773 | 0.6723 | -0.2448 | 0.4838 | 0.0009 |
| 44 | Benchmark | Buy & Hold SPY | 0.1309 | 0.1725 | 0.5271 | 0.6337 | -0.3372 | 0.3883 | NaN |
| 32 | Vol-Timing | LSTM | 0.1294 | 0.1766 | 0.5060 | 0.6122 | -0.2659 | 0.4866 | 0.0016 |
| 36 | Vol-Timing | GARCH-RF | 0.1274 | 0.1766 | 0.4949 | 0.5967 | -0.2653 | 0.4802 | 0.0016 |
| 24 | Vol-Timing | Random Forest | 0.1264 | 0.1767 | 0.4890 | 0.5891 | -0.2660 | 0.4752 | 0.0016 |
| 40 | Vol-Timing | GARCH-XGBoost | 0.1268 | 0.1787 | 0.4856 | 0.5837 | -0.2769 | 0.4578 | 0.0016 |
| 8 | Vol-Timing | GJR-GARCH(1,1) | 0.1188 | 0.1625 | 0.4848 | 0.6045 | -0.2191 | 0.5423 | 0.0010 |
| 28 | Vol-Timing | XGBoost | 0.1265 | 0.1792 | 0.4830 | 0.5799 | -0.2798 | 0.4522 | 0.0016 |
| 12 | Vol-Timing | HAR-RV | 0.1249 | 0.1758 | 0.4827 | 0.5814 | -0.2602 | 0.4799 | 0.0016 |
| 20 | Vol-Timing | Persistence | 0.1251 | 0.1763 | 0.4826 | 0.5808 | -0.2639 | 0.4740 | 0.0016 |
| 0 | Vol-Timing | GARCH(1,1) | 0.1161 | 0.1579 | 0.4823 | 0.5965 | -0.2255 | 0.5149 | 0.0008 |
| 16 | Vol-Timing | HAR-X | 0.1239 | 0.1745 | 0.4806 | 0.5805 | -0.2512 | 0.4931 | 0.0016 |
| 4 | Vol-Timing | EGARCH(1,1) | 0.1102 | 0.1579 | 0.4445 | 0.5358 | -0.2666 | 0.4132 | 0.0006 |
| 13 | Risk-Parity | HAR-RV | 0.0692 | 0.1333 | 0.2191 | 0.1837 | -0.3221 | 0.2149 | 0.0007 |
| 17 | Risk-Parity | HAR-X | 0.0692 | 0.1333 | 0.2190 | 0.1836 | -0.3219 | 0.2150 | 0.0007 |
| 21 | Risk-Parity | Persistence | 0.0692 | 0.1334 | 0.2188 | 0.1833 | -0.3224 | 0.2146 | 0.0007 |
| 37 | Risk-Parity | GARCH-RF | 0.0689 | 0.1335 | 0.2162 | 0.1807 | -0.3226 | 0.2135 | 0.0007 |
| 9 | Risk-Parity | GJR-GARCH(1,1) | 0.0688 | 0.1335 | 0.2156 | 0.1808 | -0.3147 | 0.2186 | 0.0003 |
| 25 | Risk-Parity | Random Forest | 0.0687 | 0.1334 | 0.2152 | 0.1802 | -0.3227 | 0.2129 | 0.0007 |
| 33 | Risk-Parity | LSTM | 0.0686 | 0.1335 | 0.2144 | 0.1795 | -0.3232 | 0.2123 | 0.0007 |
| 1 | Risk-Parity | GARCH(1,1) | 0.0685 | 0.1339 | 0.2127 | 0.1782 | -0.3191 | 0.2145 | 0.0003 |
| 41 | Risk-Parity | GARCH-XGBoost | 0.0683 | 0.1337 | 0.2119 | 0.1772 | -0.3228 | 0.2116 | 0.0007 |
| 29 | Risk-Parity | XGBoost | 0.0678 | 0.1336 | 0.2083 | 0.1745 | -0.3228 | 0.2102 | 0.0007 |
| 5 | Risk-Parity | EGARCH(1,1) | 0.0677 | 0.1346 | 0.2059 | 0.1720 | -0.3235 | 0.2093 | 0.0002 |
show_fig('fig9_sharpe_by_strategy.png')
show_fig('fig10_vrp_equity_curves.png')
3.8 Model Robustness (RQ3)¶
Six additional checks probe whether the results above are artifacts of the specific cross-asset average, cost/exposure assumptions, time window chosen, random seed, or hyperparameter choice, rather than genuine findings.
Cross-asset validation. Section 3.2's cross-asset mean RMSE ranking could in principle be driven by a handful of assets pulling the average. Figure 11 shows it is not, though the picture is now split three ways rather than dominated by a single model: HAR-X has the lowest h1 RMSE on 11 of 18 individual assets, Persistence on 5 of 18, and HAR-RV on the remaining 2 — Random Forest is not the best model on any individual asset. The three-way split is itself informative: it shows the "top 3" from Table 1 (HAR-X, HAR-RV, Persistence) are genuinely competing with each other asset-by-asset, not one of them winning the cross-asset average by a few strong assets while systematically losing elsewhere.
Sensitivity to transaction costs and exposure. Figure 12 sweeps VRP's cost-per-trade ($0–$50) and exposure cap (0.5x–3x) for GJR-GARCH(1,1) and LSTM — the study's two models with the highest Sharpe ratios — to check whether GJR-GARCH(1,1)'s near-parity with LSTM on Sharpe (Table 10) survives across the whole cost/exposure grid, or only holds at the single $5/trade, 1.0x-exposure setting used everywhere else in the paper. Exposure appears to have almost no effect for either model: GJR-GARCH(1,1) is essentially flat (2.972 at 0.5x vs. 2.971 at 1.0x–3x, zero cost) and only LSTM shows a slight drop when capped at 0.5x (2.932 vs. 2.972 at 1.0x–3x, zero cost). The more consequential finding is in transaction-cost sensitivity: GJR-GARCH(1,1)'s Sharpe advantage over LSTM widens, not narrows, as costs rise. At the paper's default $5/trade the two are within 0.009 Sharpe of each other (2.963 vs. 2.955, matching Table 10), but at $50/trade GJR-GARCH(1,1) drops by only 2.8% while LSTM declines by 6.3%, stretching the gap between them to 0.104 Sharpe. So the cost-benefit case for GJR-GARCH(1,1) made below is not an artifact of the specific $5/trade assumption: it is at its weakest exactly where the rest of this paper evaluates it, and only strengthens under more realistic higher-cost assumptions.
Out-of-sample stability. Splitting the test window into pre- and post-2022 halves (2018–2021 vs. 2022–2025) and recomputing Sharpe for the two strategies that beat their benchmarks (Regime-Based, VRP) across all eleven models produces zero sign flips — every model's Sharpe stays positive in both sub-periods for both strategies (e.g. VRP under GJR-GARCH(1,1): 6.69 in 2018–2021, still 4.37 in 2022–2025; VRP under HAR-X: 5.09 in 2018–2021, 6.32 in 2022–2025). VRP's outsized Sharpe is not a 2022-vol-spike artifact concentrated in one half of the sample; if anything it holds up more strongly in the second half for most of the eleven models, including HAR-X and HAR-RV.
Cost-benefit synthesis. Table 11 ties compute cost, statistical accuracy, and each model's best economic outcome together: GJR-GARCH(1,1) delivers the single best economic outcome in the study (+0.833 Sharpe over the GARCH(1,1) baseline) in 3.6 seconds of walk-forward wall-clock, but HAR-X (+0.730, 0.6s) and HAR-RV (+0.660, 0.5s) — both still inside the squared-error Model Confidence Set (Section 3.3) — sit close behind at effectively zero marginal compute (a single OLS fit per refit date), ahead of Random Forest (+0.651, 736s), which is no longer in either MCS. LSTM's walk-forward, at roughly 24 hours of wall-clock compute (86,864s, measured directly from the walk-forward run log), delivers +0.824 — nearly matching GJR-GARCH(1,1)'s economic gain, but at a compute cost over 24,000 times larger for a model that, per Section 3.3, is only weakly distinguishable from the naive Persistence floor under squared-error loss. Measured purely by economic value delivered per unit of compute, the cheapest models in this study — GJR-GARCH(1,1), HAR-X, HAR-RV, and Persistence itself — are also among the best.
show_fig('fig11_cross_asset_rmse_heatmap.png')
show_fig('fig12_vrp_sensitivity_heatmap.png')
print("\nTable 11: Model cost-benefit synthesis")
show_table('cost_benefit_synthesis.csv')
Table 11: Model cost-benefit synthesis
| Model | Compute Cost | Wall-clock (s) | RMSE (h1) | In 90% MCS? | Best Strategy | Best Sharpe | vs. GARCH(1,1) (same strategy) | |
|---|---|---|---|---|---|---|---|---|
| 0 | GJR-GARCH(1,1) | Very Low | 3.2 | 6.949 | False | VRP | 2.963 | 0.833 |
| 1 | LSTM | Very High | 86864.0 | 5.138 | False | VRP | 2.954 | 0.824 |
| 2 | HAR-X | Very Low (OLS) | 0.6 | 1.810 | True | VRP | 2.860 | 0.730 |
| 3 | GARCH-RF | Medium | 1005.0 | 2.098 | False | VRP | 2.793 | 0.662 |
| 4 | HAR-RV | Very Low (OLS) | 0.5 | 1.825 | True | VRP | 2.790 | 0.660 |
| 5 | GARCH-XGBoost | Low | 61.0 | 6.446 | False | VRP | 2.783 | 0.653 |
| 6 | Random Forest | Medium | 736.0 | 2.024 | False | VRP | 2.781 | 0.651 |
| 7 | Persistence | Negligible | 0.0 | 1.844 | True | VRP | 2.757 | 0.626 |
| 8 | XGBoost | Low | 65.0 | 6.555 | False | VRP | 2.718 | 0.588 |
| 9 | GARCH(1,1) | Very Low | 5.3 | 6.255 | False | VRP | 2.130 | 0.000 |
| 10 | EGARCH(1,1) | Very Low | 3.6 | 7.364 | False | VRP | 1.196 | -0.935 |
Multi-seed LSTM (and RF/XGBoost) robustness. LSTM, Random Forest, and XGBoost are each refit at 24 SPY refit dates (spanning both the 2018–2021 and 2022–2025 sub-periods) under 5 random seeds. Point forecasts are seed-sensitive to different degrees: LSTM's per-seed mean h1 forecast ranges 15.95–16.24 (a 0.29 spread), XGBoost 16.42–16.62 (0.20), and Random Forest is essentially seed-invariant (16.46–16.48, a 0.02 spread) — expected, since RF's bagging averages over many trees while LSTM's gradient-based optimization is inherently more sensitive to initialization. More importantly, the Diebold-Mariano comparison against both GARCH(1,1) and Persistence on this SPY-only subset is stable across all 5 seeds for all 3 models: LSTM vs. GARCH(1,1) p-values range 0.098–0.107 (never crossing significance in either direction on this smaller subset), Random Forest vs. GARCH(1,1) is essentially seed-invariant (p $\approx$ 0.106 in every seed), and XGBoost vs. GARCH(1,1) ranges 0.111–0.130. No seed produces a qualitatively different conclusion than any other. (These SPY-only DM tests naturally carry far less statistical power than the full pooled 18-asset tests in Section 3.3 and should not be read as a replacement for them — their purpose here is solely to confirm that stochastic optimization variance is not driving the pooled result.)
Hyperparameter sensitivity. Table 12 sweeps XGBoost's max_depth ($\in\{3,4,6\}$) and Random
Forest's n_estimators ($\in\{300,500,1000\}$), holding all other settings fixed, on the same
SPY-only subset. Neither model is meaningfully sensitive to the swept parameter: XGBoost's RMSE
ranges 1.92–2.09 across depths, with the project's default (max_depth=4, RMSE 1.92) actually the
best of the three values tested, not an undertuned choice; Random Forest's RMSE ranges 1.00–1.05
across n_estimators, with no clear monotonic trend. This directly addresses the concern that
XGBoost's comparatively weaker RMSE ranking in Table 1 might reflect an undertuned configuration
relative to Random Forest's — it does not; XGBoost's default hyperparameters are, if anything,
already close to optimal within this grid, and its Table 1 ranking reflects a genuine difference
in how the two tree ensembles handle this specific persistent target, not a tuning artifact.
print("Table 12: Hyperparameter sensitivity (SPY-only subset, 24 refit dates)")
show_table('hyperparameter_sensitivity.csv')
Table 12: Hyperparameter sensitivity (SPY-only subset, 24 refit dates)
| model | param | value | RMSE_h1_SPY | |
|---|---|---|---|---|
| 0 | XGBoost | max_depth | 3 | 2.0408 |
| 1 | XGBoost | max_depth | 4 | 1.9211 |
| 2 | XGBoost | max_depth | 6 | 2.0871 |
| 3 | Random Forest | n_estimators | 300 | 1.0258 |
| 4 | Random Forest | n_estimators | 500 | 1.0452 |
| 5 | Random Forest | n_estimators | 1000 | 1.0044 |
4. Discussion¶
RQ1 — Statistical Accuracy: No single answer; it depends on the loss function and whether a naive floor is included. The single most important methodological result in this paper is not about any one model but about evaluation design itself: at the 1-day horizon, no model — not GARCH, not Random Forest, not the LSTM, not either hybrid — beats a trivial "tomorrow equals today" persistence forecast on squared-error loss (Section 3.3). Only HAR-RV and HAR-X, both of which are themselves sophisticated re-weightings of recent RV history, are even statistically tied with that floor. Under QLIKE, the picture inverts entirely: XGBoost and GARCH-XGBoost become the Model Confidence Set survivors and significantly beat Persistence, while HAR-X does not. A study that ran only a squared-error Diebold-Mariano test against GARCH(1,1), without a naive benchmark or a second loss function, would report "Random Forest is the sole survivor" — true in that narrow sense, but a claim that does not survive either check. This is a considerably more cautious conclusion than Gu, Kelly & Xiu's (2020) broad machine-learning gains, and a more nuanced one than Hansen & Lunde's (2005) "nothing beats GARCH(1,1)": at this specific horizon and with this specific target, several things beat GARCH(1,1), but the thing they have in common is exploiting the target's own persistence rather than any distinctive econometric or machine-learning insight, and the ranking among them is not robust to the choice of loss function.
RQ2 — Economic Utility: Largely governed by strategy mechanism, not by which model "wins" statistically. Despite the dramatic reordering in RQ1, the economic evaluation is comparatively stable across all eleven models (Section 3.7): Volatility-Timing and Risk-Parity — the two strategies whose logic depends directly on point-forecast accuracy at the horizon they trade — underperform simple passive benchmarks regardless of which model supplies the forecast, because the h20 accuracy that matters to a monthly rebalance is exactly where the persistence-adjacent models' 1-day edge evaporates (Sections 3.2 and 3.6). Regime-Based and VRP, whose economic logic instead rests on a structural market feature (discrete de-risking in stress; harvesting the well-documented variance risk premium), outperform their benchmarks under every model, because their edge does not primarily come from forecast precision in the first place. Statistical accuracy at 1-day, however defined, is close to irrelevant to how well a monthly-rebalanced portfolio strategy performs in this study.
RQ3 — Regime Resilience: Real for the persistence-adjacent models, and confirmed stable out-of-sample. HAR-RV, Persistence, and HAR-X are the standouts for regime resilience in the statistical sense (High/Low RMSE ratios of 0.9x, 1.3x, and 1.5x respectively, versus 5–15x for the GARCH-family and tree-based models), and this is corroborated at the portfolio level by the Regime-Based and VRP strategies both delivering consistently positive Sharpe with no sign flips across the pre/post-2022 sub-period split, for every one of the eleven models. The robustness battery (Section 3.8) — cross-asset validation, cost/exposure sensitivity, sub-period stability, and multi-seed and hyperparameter sensitivity — collectively support treating these findings as genuine rather than artifacts of a particular window, cost assumption, random seed, or lucky cross-asset average.
On the value of model complexity. Table 11's cost-benefit synthesis is the paper's most direct practical takeaway: GJR-GARCH(1,1) delivers the single best economic outcome in the study in 3.6 seconds of walk-forward compute, with HAR-X and HAR-RV close behind at essentially zero marginal compute. The LSTM's roughly 24-hour walk-forward — over 24,000× GJR-GARCH(1,1)'s wall-clock — buys an economic gain barely distinguishable from GJR-GARCH's, and per Section 3.8's sensitivity check, that gap only widens as transaction costs rise, for a model that Section 3.3 shows is only weakly different from a model that does no fitting at all. For a practitioner choosing where to invest modeling effort, this study's evidence favors getting the simplest specification that respects the target's own persistence structure right (HAR-RV/HAR-X) or getting the econometric asymmetric-threshold specification right (GJR-GARCH) before reaching for deep learning or even tree ensembles, and reserves the latter for applications — like the QLIKE-preferred XGBoost/GARCH-XGBoost combination — where a different loss function, not raw squared error, is the one that actually matters for the downstream use case.
Limitations. Four deserve explicit mention. First, the single-step-forecaster design for all
ML and hybrid models (Section 2.4) is a genuine methodological asymmetry against them at longer
horizons; a proper multi-horizon ML architecture (e.g. separate models per horizon, or a
sequence-to-sequence LSTM) might narrow or reverse the h20 gap and should be a first extension.
Second, the realized-volatility proxy (21-day rolling std of daily returns) is a coarser measure
than intraday-based realized variance, which was unavailable at this sample's scale — its
overlapping-window construction is also precisely what makes the Persistence floor so hard to
beat, and some of the accuracy differences among models could reflect proxy noise rather than
genuine forecasting skill. Third, HAR-X is implemented as an OLS extension of HAR-RV with lagged
VIX as an additional regressor, not as a true variance-equation "GARCH-X"; the arch package's
exogenous-regressor support feeds the conditional mean equation rather than the volatility
recursion, and a faithful variance-equation implementation would require subclassing arch's
volatility process — a larger change than this robustness check warranted, and a natural next
step for isolating information content from model architecture more cleanly. Fourth, the VRP
strategy's daily P&L is a simplified delta-neutral short-straddle proxy (theta decay minus
realized move), not a fully specified options-pricing simulation with transaction costs, bid-ask
spreads, or margin requirements on the option leg itself — its outsized Sharpe should be read as
evidence the mechanism is real and directionally correct, not as an implementable trading-strategy
backtest in the strict sense.
5. Conclusion¶
This paper set out to answer whether machine learning improves volatility forecasting for equities, and whether any such improvement is worth having from an investor's perspective. The answer to the first question turns out to hinge entirely on how the question is asked. Judged by squared-error loss, the models that "win" are not the machine-learning models at all, but HAR-RV, HAR-X, and — most tellingly — a naive persistence forecast that does no fitting whatsoever; every GARCH-family, tree-based, LSTM, and hybrid model is significantly worse than that floor. Judged by QLIKE instead, the ranking inverts and XGBoost and its GARCH-augmented hybrid emerge as the only models that significantly beat both GARCH(1,1) and the persistence floor. Neither ranking is more "correct" than the other; they are answers to different questions about what counts as forecast error, and a study that reports only one risks mistaking a loss-function artifact for a genuine, generalizable finding. The answer to the second question is more consistent: where portfolios depend directly on 1-day point-forecast accuracy (Volatility-Timing, Risk-Parity), every model underperforms simple passive benchmarks, because the accuracy that matters to a monthly rebalance is the 20-day horizon, and the very models that dominate at 1-day (HAR-X, HAR-RV, Persistence) are, by Section 3.6, among the worst performers at that longer horizon. Where portfolios genuinely do benefit from a volatility signal — Regime-Based and VRP — the benefit is available under any of the eleven models, and the strategy with by far the largest economic payoff (VRP, Sharpe up to 2.96) is best realized by an econometric model that costs a rounding error of compute time next to the LSTM's several hours of walk-forward training, with HAR-X and HAR-RV close behind at effectively zero marginal cost. The practical implication for a resource-constrained forecaster is threefold: match model complexity to the forecasting horizon actually in use, never report a statistical accuracy claim without checking it against a naive floor and more than one loss function, and recognize that the economic mechanism a strategy relies on can matter more than the statistical sophistication of the forecast feeding it.
Future work should prioritize a genuinely multi-horizon ML architecture (removing the single-step asymmetry flagged in Section 4), intraday-based realized-variance targets where available, a fully specified options-pricing implementation of the VRP strategy to convert its promising proxy result into an implementable trading strategy, a true variance-equation GARCH-X to more cleanly separate the information content of implied volatility from the architecture of the model consuming it, and a more realistic transaction-cost model — the fixed $5/trade bp-drag approximation used here is applied consistently across all 44 model x strategy combinations and so does not affect relative ranking, but it omits slippage and market impact that would scale with position size and the prevailing volatility regime.
Appendix A: Model Specifications¶
Formal specifications for every model summarized narratively in Section 2.4, given here for reference. Notation follows Section 2.2: $r_t$ is the daily log return, $\varepsilon_t = r_t-\mu$ the return residual, $\sigma_t^2$ the conditional variance, and $RV_{21d,t}$ the realized-volatility target defined in Section 2.2.
GARCH(1,1) (Bollerslev, 1986): $\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2$. The $h$-step forecast iterates this recursion forward from the last observed $(\varepsilon_t, \sigma_t^2)$.
EGARCH(1,1) (Nelson, 1991):
$\ln(\sigma_t^2) = \omega + \beta \ln(\sigma_{t-1}^2) + \alpha(|z_{t-1}|-E|z_{t-1}|) + \gamma z_{t-1}$,
with $z_{t-1}=\varepsilon_{t-1}/\sigma_{t-1}$. The $\gamma$ term lets negative and positive shocks of
equal size move future volatility by different amounts (the leverage effect); as noted in Section
2.4, arch has no closed-form multi-step EGARCH forecast, so $h$-step forecasts are approximated
by 200-path simulation.
GJR-GARCH(1,1) (Glosten, Jagannathan & Runkle, 1993): $\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \gamma \varepsilon_{t-1}^2 \mathbb{1}[\varepsilon_{t-1}<0] + \beta \sigma_{t-1}^2$. A threshold alternative to EGARCH's smooth asymmetry: the indicator switches on an extra $\gamma$ loading only after negative shocks, rather than scaling continuously with $z_{t-1}$.
HAR-RV (Corsi, 2009): $RV_{t+1} = \beta_0 + \beta_d RV_t + \beta_w \overline{RV}_{t-5:t} + \beta_m \overline{RV}_{t-21:t} + \varepsilon_{t+1}$, an OLS regression of next-period $RV$ on its own daily, weekly-average, and monthly-average lags — approximating long memory as a mixture of three fixed-horizon components rather than fitting a fractionally-integrated model directly.
HAR-X: the same specification with one added regressor, lagged VIX: $RV_{t+1} = \beta_0 + \beta_d RV_t + \beta_w \overline{RV}_{t-5:t} + \beta_m \overline{RV}_{t-21:t} + \beta_{vix} VIX_t + \varepsilon_{t+1}$. As Section 2.4 notes, this augments the OLS mean equation rather than a variance recursion, so it is not a true variance-equation GARCH-X.
Persistence: $\widehat{RV}_{t+h} = RV_t$ for every horizon $h\in\{1,5,20\}$ — no parameters estimated.
Random Forest (Breiman, 2001): an ensemble of $B=500$ regression trees, each fit on a bootstrap resample with a random feature subset considered at each split; the forecast is the across-tree average, $\hat y = \frac{1}{B}\sum_{b=1}^{B} T_b(x)$.
XGBoost (Chen & Guestrin, 2016): a gradient-boosted ensemble of regression trees fit sequentially, each stage trained on the squared-error gradient of the previous stage's residual; 1,000 boosting rounds with early stopping on a chronological 15% validation split.
LSTM (Hochreiter & Schmidhuber, 1997): a recurrent architecture with gated memory cells, $f_t=\sigma(W_fx_t+U_fh_{t-1}+b_f)$, $i_t=\sigma(W_ix_t+U_ih_{t-1}+b_i)$, $o_t=\sigma(W_ox_t+U_oh_{t-1}+b_o)$, $\tilde c_t=\tanh(W_cx_t+U_ch_{t-1}+b_c)$, $c_t=f_t\odot c_{t-1}+i_t\odot\tilde c_t$, $h_t=o_t\odot\tanh(c_t)$ — two stacked layers of 128 hidden units, dropout 0.2 between layers, over a 30-day lookback window of the 30-feature matrix (Section 2.5), trained with early stopping (patience 10).
GARCH-RF / GARCH-XGBoost: the same 30-feature matrix used by the standalone ML models, with the GARCH(1,1) conditional-volatility forecast and standardized residual appended as two additional features (construction and timing-alignment details in Section 2.4).
Appendix B: Statistical Significance Tests¶
Diebold-Mariano (Diebold & Mariano, 1995). For loss function $L$ (squared error or QLIKE, Section 2.6) and two competing forecast errors $e_{1,t}, e_{2,t}$, define the loss differential $d_t = L(e_{1,t}) - L(e_{2,t})$. The test statistic $DM = \bar d \big/ \sqrt{\widehat{LRV}(\bar d)/T}$ is asymptotically standard normal, where $\widehat{LRV}$ is a Newey-West (1987) HAC estimator of the long-run variance of $\bar d$, correcting for the serial correlation induced by $RV_{21d}$'s overlapping-window construction (Section 2.2). A significant negative (positive) statistic means model 1 (2) forecasts significantly more accurately. Relevance: DM is inherently pairwise — it tests one model against one baseline (here, GARCH(1,1) and Persistence) — so it says nothing about the risk of false discovery when eleven models are compared at once, which motivates the MCS below.
Model Confidence Set (Hansen, Lunde & Nason, 2011). Starting from the full candidate set
($M_0=11$ models), the procedure iteratively tests the null of equal predictive ability across
the surviving models using a range statistic, eliminates whichever model contributes most to a
rejection, and repeats until the null can no longer be rejected at the chosen confidence level
(90% here); the surviving set $\hat M^*_{1-\alpha}$ is the "superior set" that cannot be
statistically distinguished from the best model. Implemented via arch.bootstrap.MCS with
block-bootstrapped $p$-values, run separately under squared-error and QLIKE loss, pooled across
all 18 assets. Relevance: unlike a single pairwise DM test, the MCS controls the family-wise
error rate across all eleven simultaneous comparisons — it is the procedure that keeps a
loss-function-specific "sole survivor" claim (Section 4) from being an artifact of running enough
pairwise tests that one was bound to look significant.
References¶
- Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307–327.
- Breiman, L. (2001). Random forests. Machine Learning, 45(1), 5–32.
- Chen, T., & Guestrin, C. (2016). XGBoost: A scalable tree boosting system. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (pp. 785–794).
- Corsi, F. (2009). A simple approximate long-memory model of realized volatility. Journal of Financial Econometrics, 7(2), 174–196.
- Diebold, F. X., & Mariano, R. S. (1995). Comparing predictive accuracy. Journal of Business & Economic Statistics, 13(3), 253–263.
- Engle, R. F. (1982). Autoregressive conditional heteroscedasticity with estimates of the variance of United Kingdom inflation. Econometrica, 50(4), 987–1007.
- Fleming, J., Kirby, C., & Ostdiek, B. (2001). The economic value of volatility timing. Journal of Finance, 56(1), 329–352.
- Fleming, J., Kirby, C., & Ostdiek, B. (2003). The economic value of volatility timing using realized volatility. Journal of Financial Economics, 67(3), 473–509.
- Glosten, L. R., Jagannathan, R., & Runkle, D. E. (1993). On the relation between the expected value and the volatility of the nominal excess return on stocks. Journal of Finance, 48(5), 1779–1801.
- Gu, S., Kelly, B., & Xiu, D. (2020). Empirical asset pricing via machine learning. Review of Financial Studies, 33(5), 2223–2273.
- Hansen, P. R., & Lunde, A. (2005). A forecast comparison of volatility models: Does anything beat a GARCH(1,1)? Journal of Applied Econometrics, 20(7), 873–889.
- Hansen, P. R., Lunde, A., & Nason, J. M. (2011). The model confidence set. Econometrica, 79(2), 453–497.
- Hochreiter, S., & Schmidhuber, J. (1997). Long short-term memory. Neural Computation, 9(8), 1735–1780.
- Kristjanpoller, W., & Minutolo, M. C. (2018). A hybrid volatility forecasting framework integrating GARCH, artificial neural network, technical analysis and principal components models. Expert Systems with Applications, 109, 1–11.
- Moreira, A., & Muir, T. (2017). Volatility-managed portfolios. Journal of Finance, 72(4), 1611–1644.
- Nelson, D. B. (1991). Conditional heteroskedasticity in asset returns: A new approach. Econometrica, 59(2), 347–370.
- Newey, W. K., & West, K. D. (1987). A simple, positive semi-definite, heteroskedasticity and autocorrelation consistent covariance matrix. Econometrica, 55(3), 703–708.
- Patton, A. J. (2011). Volatility forecast comparison using imperfect volatility proxies. Journal of Econometrics, 160(1), 246–256.