Repository Public Research preview
1# =============================================================================2# Author: Simon-Pierre Boucher3# Contact: simon-pierre.boucher@uqo.ca4# =============================================================================5# WP7 — Options-Implied Information Content6#7# make pipeline run every analysis that works from the processed parquets8# make extract raw → processed (requires the external DuckDB stores)9# make figures legacy supplementary figures (scripts/12) + manuscript figures and float fragments (scripts/33)10# make paper compile the LaTeX working paper (latexmk)11# make all pipeline + figures + paper12# make test regenerate every result into _verify/results and compare with13# the committed files (rtol 1e-9; 1e-3 for the seeded bootstrap CSVs)14# make revision Stage D (2026-11-04) analyses from the parquets (scripts 15-18, 20-23, 30, tables_*)1516PY := python31718ANALYSIS_SCRIPTS := \19 scripts/02_rq1_return_predictability.py \20 scripts/03_rq2_rv_forecasting.py \21 scripts/04_rq3_correlation_divergence.py \22 scripts/05_rq4_greeks_decay_magnets.py \23 scripts/06_rq5_ml_rv_forecast.py \24 scripts/07_descriptive_stats.py \25 scripts/08_subperiod_regime.py \26 scripts/09_portfolio_sorts.py \27 scripts/10_robustness.py \28 scripts/11_granger_var.py \29 scripts/13_extended_robustness.py \30 scripts/14_make_paper_tables.py3132.PHONY: all pipeline extract figures paper clean-paper test revision tables3334# Legacy mode: every analysis script reproduces the committed files of35# HEAD 3e1fc1c byte-for-byte (the default mode writes the *_v2 files of36# the 2026-11-04 revision next to them).37LEGACY_SCRIPTS := scripts/02_rq1_return_predictability.py scripts/03_rq2_rv_forecasting.py \38 scripts/04_rq3_correlation_divergence.py scripts/05_rq4_greeks_decay_magnets.py \39 scripts/07_descriptive_stats.py scripts/08_subperiod_regime.py scripts/09_portfolio_sorts.py \40 scripts/10_robustness.py scripts/11_granger_var.py scripts/13_extended_robustness.py41REVISION_SCRIPTS := scripts/02_rq1_return_predictability.py scripts/03_rq2_rv_forecasting.py \42 scripts/04_rq3_correlation_divergence.py scripts/05_rq4_greeks_decay_magnets.py \43 scripts/07_descriptive_stats.py scripts/08_subperiod_regime.py scripts/09_portfolio_sorts.py \44 scripts/10_robustness.py scripts/11_granger_var.py scripts/13_extended_robustness.py \45 scripts/15_factor_alphas.py scripts/16_skew_measures.py scripts/17_specification_curve.py \46 scripts/18_multiple_testing.py scripts/20_rq2_subperiod_oos.py scripts/21_coverage_reduced_model.py \47 scripts/22_quantile_bootstrap.py scripts/23_rq2_null_mc.py scripts/24_data_inventory.py \48 scripts/30_intervals_mde.py scripts/31_inline_numbers.py49TABLE_SCRIPTS := scripts/14_make_paper_tables.py scripts/tables_rq1.py scripts/tables_rq2.py \50 scripts/tables_rq3.py scripts/tables_rq4.py scripts/tables_ts.py scripts/tables_e.py51ENV := OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4 VECLIB_MAXIMUM_THREADS=45253all: pipeline figures paper5455extract:56 $(PY) scripts/01_extract_data.py5758pipeline:59 @set -e; for s in $(ANALYSIS_SCRIPTS); do \60 echo "\n=== $$s ==="; \61 $(PY) $$s || { code=$$?; \62 if [ $$code -eq 2 ]; then echo "(skipped: raw data unavailable)"; \63 else exit $$code; fi; }; \64 done6566figures:67 $(PY) scripts/12_make_figures.py68 $(PY) scripts/33_make_exhibit_figures.py6970paper:71 $(MAKE) -C paper7273clean-paper:74 $(MAKE) -C paper clean7576test:77 @rm -rf _verify/results && mkdir -p _verify/results78 @cp results/rq4_greeks_decay.csv results/rq5_model_comparison.csv results/rq5_feature_importance.csv results/descriptive_options_quality.csv _verify/results/79 @set -e; for s in $(LEGACY_SCRIPTS); do echo "\n=== $$s --legacy ==="; $(ENV) WP7_RESULTS_DIR=$$PWD/_verify/results $(PY) $$s --legacy; done80 $(PY) docs/verify/compare_results.py results _verify/results81 $(PY) tests/test_inference.py8283revision:84 @set -e; for s in $(REVISION_SCRIPTS); do echo "\n=== $$s ==="; $(ENV) $(PY) $$s; done8586tables:87 @set -e; for s in $(TABLE_SCRIPTS); do echo "\n=== $$s ==="; $(PY) $$s; done88