A time-series project comparing a statistical ARIMA model with an XGBoost challenger for short-horizon market-volatility monitoring — testing whether the more flexible model actually improves the forecast enough to justify its added complexity.
Can daily Cboe Volatility Index (VIX) values provide a useful external market-stress baseline for short-term financial risk monitoring?
The forecast is designed as a supporting signal for liquidity, portfolio-risk, capital-planning, and operational reviews — not as a trading system or a substitute for an institution's internal risk measures.
flowchart LR
A[8,685 daily VIX observations] --> B[Hold out final 10 days]
B --> C[Log transform + ADF stationarity test]
C --> D["ARIMA via ACF/PACF/EACF/BIC"]
C --> E[Recursive XGBoost: lag & rolling features]
D --> F[Compare on holdout RMSE]
E --> F
- Validated and chronologically ordered 8,685 daily VIX observations from January 1990 through June 2024.
- Reserved the final 10 trading days as an untouched test set.
- Applied a log transformation and tested stationarity using the augmented Dickey-Fuller test.
- Used ACF, PACF, EACF, residual diagnostics, and BIC to select an ARIMA model.
- Built a recursive XGBoost forecast with lag, rolling-window, and calendar features.
- Compared holdout accuracy, fit time, interpretability, and prediction-interval availability.
| Model | Test RMSE | Interpretation |
|---|---|---|
| ARIMA(2,0,1) | 0.4165 | Lower error, fast fit, built-in prediction intervals |
| XGBoost | 0.4615 | Useful nonlinear challenger, but no direct prediction intervals |
ARIMA reduced holdout RMSE by approximately 9.8% relative to XGBoost on this 10-day test window. Given the small holdout, the result should be treated as a project-specific comparison rather than a universal claim about model superiority.
.
├── data/
│ └── vix_daily.csv
├── vix_volatility_forecasting.Rmd
└── vix_volatility_forecasting_report.pdf
Install the required R packages:
install.packages(c(
"TSA", "ggplot2", "dplyr", "forecast",
"tseries", "xgboost", "rmarkdown", "knitr"
))Then render from the repository root:
rmarkdown::render("vix_volatility_forecasting.Rmd")The project uses public daily VIX observations. Reference sources:
- Kaggle dataset snapshot used in this analysis (CC0: Public Domain)
- FRED: CBOE Volatility Index
- Cboe historical VIX data
- The final comparison uses only 10 held-out trading days.
- VIX is an external market indicator and does not capture institution-specific exposure.
- Forecast performance can change across market regimes and should be monitored over time.
- This project is for analytical demonstration and is not financial advice.