spb/wp7_uqo Public
UQO Working Paper No. 7 — Options-implied information for cross-asset return and volatility prediction: evidence from 3.8B option contracts.
Python 66.5%
TeX 32.7%
Makefile 0.8%
1<!--2Author: Simon-Pierre Boucher3Contact: contact@spboucher.ai4-->56<div align="center">78# WP7 — The Options-Implied Information Content for Cross-Asset Return and Volatility Prediction910**Evidence from 3.8 Billion Option Contracts**1112*UQO Working Paper No. 7*1314[](mailto:contact@spboucher.ai)15[](mailto:contact@spboucher.ai)16[](https://uqo.ca)1718[](paper/main.pdf)19[](paper/main.tex)20[-8250df?style=flat-square)](paper/references.bib)21[](requirements.txt)22[-success?style=flat-square)](AUDIT.md)23[](results/)2425**Key findings**2627282930-success?style=for-the-badge)31-%2B23.3%25-success?style=for-the-badge)32-success?style=for-the-badge)33343536</div>3738---3940## About4142Five research questions on the information content of equity option markets, answered with433.83 billion option contracts (11,077 underlyings, 2010–2025) merged with 11.5 billion44intraday OHLCV observations:4546| RQ | Question | Headline result |47|---|---|---|48| **RQ1** | Do implied moments predict cross-sectional returns? | Weekly yes (R² 4.8–19.3%), daily no; kurtosis L/S Sharpe **2.33** |49| **RQ2** | IV surface vs GARCH/HAR-RV for RV forecasting? | HAR+IV improves 1-day R² by **+23.3%**, robust in all 9 subperiods |50| **RQ3** | Implied−realized correlation → market stress? | Correlation ratio predicts stress at 5–20d ($t$: 3.91–8.30) |51| **RQ4** | Greeks decay by DTE; max-OI "price magnets"? | Info rises with DTE; magnet hypothesis **rejected** (47.0% < 50%) |52| **RQ5** | ML on the SPX surface vs the VIX? | HAR-RV beats RF/GBM and VIX OOS; 2w ATM IV = 50.8% of importance |5354## Author5556**Simon-Pierre Boucher** · Département des sciences administratives, Université du Québec en57Outaouais (UQO) · 📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)5859## Repository layout6061```62wp7_uqo/63├── README.md this file64├── AUDIT.md pre-restructuring audit + reproducibility map + flags65├── CHANGES.md everything that was moved, renamed, refactored, rewritten66├── requirements.txt pinned Python dependencies67├── pyproject.toml optional `pip install -e .` of the wp7 package68├── Makefile make pipeline | figures | paper | all69├── data/70│ ├── raw/ external DuckDB stores (not shipped — see data/raw/README.md)71│ └── processed/ 5 derived parquets (authoritative surviving data)72├── src/wp7/ analysis library (config, data_io, econometrics,73│ forecasting, portfolio)74├── scripts/ numbered entry points 01–13 (see below)75├── results/ 41 CSV result tables (all paper tables derive from these)76├── figures/ supplementary figures (the paper itself is tables-only)77├── paper/ LaTeX source: main.tex + preamble.tex + sections/ +78│ appendix/ + references.bib → main.pdf (29 pp.)79├── _verify/ reproduction evidence: rerun logs + CSV comparator80└── _old/ local byte-for-byte backup of the original (untracked)81```8283## Setup8485```bash86python3 -m pip install -r requirements.txt87```8889No installation of the `wp7` package is required — every script bootstraps90`src/` onto its path. (Optional: `pip install -e .`)9192## Reproducing the results9394```bash95make pipeline # runs scripts 02–13 (skips raw-dependent steps gracefully)96make figures # supplementary figures from the result CSVs97make paper # compiles paper/main.pdf with latexmk + bibtex98```99100The pipeline entry points, in execution order:101102| Script | Question | Needs raw stores? |103|---|---|---|104| `01_extract_data.py` | raw → processed parquets | **yes (entirely)** |105| `02_rq1_return_predictability.py` | RQ1 panel + Fama-MacBeth | no |106| `03_rq2_rv_forecasting.py` | RQ2 HAR-RV vs IV surface | no |107| `04_rq3_correlation_divergence.py` | RQ3 correlation divergence | stage 1 only |108| `05_rq4_greeks_decay_magnets.py` | RQ4 Greeks decay + magnets | part A; part B has a parquet fallback |109| `06_rq5_ml_rv_forecast.py` | RQ5 ML vs VIX | **yes (entirely)** |110| `07_descriptive_stats.py` | descriptive panels A–H | panels F, H only |111| `08_subperiod_regime.py` | subperiods, regimes, rolling R² | section B only |112| `09_portfolio_sorts.py` | portfolio sorts + double sorts | no |113| `10_robustness.py` | NW / clustered SE / quantile / ticker R² | section E only |114| `11_granger_var.py` | Granger, VAR, IRF, FEVD | no |115| `12_make_figures.py` | supplementary figures | no |116| `13_extended_robustness.py` | winsorization/NW-lag sensitivity, Spearman ICs, decile sorts, leave-one-year-out, placebo | no |117118The raw DuckDB stores no longer exist on this machine (see `AUDIT.md` §6.1);119raw-dependent steps detect their absence and skip themselves. Every table in120the paper is nonetheless backed by a shipped CSV in `results/`.121122**Reproduction status (2026-08-05):** all 28 regenerable result files were re-run123and compared against the originals — 10 byte-identical, 15 equal to floating-point124noise, 1 explained deviation (collinearity-degenerate t-statistics, RQ3), and 2125files newly regenerated that were missing from the original archive. Full details126in `AUDIT.md` §7 and `CHANGES.md`.127128## Configuration129130| Environment variable | Purpose | Default |131|---|---|---|132| `WP7_RAW_DATA_DIR` | location of the raw DuckDB stores | `data/raw/` |133| `WP7_RESULTS_DIR` | where scripts write result CSVs | `results/` |134135## Paper136137`paper/main.tex` (metadata + skeleton) → `preamble.tex`, one file per section under138`sections/`, appendix under `appendix/`, BibTeX bibliography in `references.bib`139(45 entries, all cited). Revision 1.1 adds four robustness subsections (estimator140sensitivity, rank-based information coefficients, decile sorts, temporal141stability + placebo) backed by `scripts/13_extended_robustness.py`.142Build: `make paper` or `cd paper && latexmk`.143144---145146<div align="center">147<sub>© 2026 Simon-Pierre Boucher · <a href="mailto:contact@spboucher.ai">contact@spboucher.ai</a> · Université du Québec en Outaouais</sub>148</div>149