# ============================================================================= # Author: Simon-Pierre Boucher # Contact: simon-pierre.boucher@uqo.ca # ============================================================================= # WP7 — Options-Implied Information Content # # make pipeline run every analysis that works from the processed parquets # make extract raw → processed (requires the external DuckDB stores) # make figures legacy supplementary figures (scripts/12) + manuscript figures and float fragments (scripts/33) # make paper compile the LaTeX working paper (latexmk) # make all pipeline + figures + paper # make test regenerate every result into _verify/results and compare with # the committed files (rtol 1e-9; 1e-3 for the seeded bootstrap CSVs) # make revision Stage D (2026-11-04) analyses from the parquets (scripts 15-18, 20-23, 30, tables_*) PY := python3 ANALYSIS_SCRIPTS := \ scripts/02_rq1_return_predictability.py \ scripts/03_rq2_rv_forecasting.py \ scripts/04_rq3_correlation_divergence.py \ scripts/05_rq4_greeks_decay_magnets.py \ scripts/06_rq5_ml_rv_forecast.py \ scripts/07_descriptive_stats.py \ scripts/08_subperiod_regime.py \ scripts/09_portfolio_sorts.py \ scripts/10_robustness.py \ scripts/11_granger_var.py \ scripts/13_extended_robustness.py \ scripts/14_make_paper_tables.py .PHONY: all pipeline extract figures paper clean-paper test revision tables # Legacy mode: every analysis script reproduces the committed files of # HEAD 3e1fc1c byte-for-byte (the default mode writes the *_v2 files of # the 2026-11-04 revision next to them). LEGACY_SCRIPTS := scripts/02_rq1_return_predictability.py scripts/03_rq2_rv_forecasting.py \ scripts/04_rq3_correlation_divergence.py scripts/05_rq4_greeks_decay_magnets.py \ scripts/07_descriptive_stats.py scripts/08_subperiod_regime.py scripts/09_portfolio_sorts.py \ scripts/10_robustness.py scripts/11_granger_var.py scripts/13_extended_robustness.py REVISION_SCRIPTS := scripts/02_rq1_return_predictability.py scripts/03_rq2_rv_forecasting.py \ scripts/04_rq3_correlation_divergence.py scripts/05_rq4_greeks_decay_magnets.py \ scripts/07_descriptive_stats.py scripts/08_subperiod_regime.py scripts/09_portfolio_sorts.py \ scripts/10_robustness.py scripts/11_granger_var.py scripts/13_extended_robustness.py \ scripts/15_factor_alphas.py scripts/16_skew_measures.py scripts/17_specification_curve.py \ scripts/18_multiple_testing.py scripts/20_rq2_subperiod_oos.py scripts/21_coverage_reduced_model.py \ scripts/22_quantile_bootstrap.py scripts/23_rq2_null_mc.py scripts/24_data_inventory.py \ scripts/30_intervals_mde.py scripts/31_inline_numbers.py TABLE_SCRIPTS := scripts/14_make_paper_tables.py scripts/tables_rq1.py scripts/tables_rq2.py \ scripts/tables_rq3.py scripts/tables_rq4.py scripts/tables_ts.py scripts/tables_e.py ENV := OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4 VECLIB_MAXIMUM_THREADS=4 all: pipeline figures paper extract: $(PY) scripts/01_extract_data.py pipeline: @set -e; for s in $(ANALYSIS_SCRIPTS); do \ echo "\n=== $$s ==="; \ $(PY) $$s || { code=$$?; \ if [ $$code -eq 2 ]; then echo "(skipped: raw data unavailable)"; \ else exit $$code; fi; }; \ done figures: $(PY) scripts/12_make_figures.py $(PY) scripts/33_make_exhibit_figures.py paper: $(MAKE) -C paper clean-paper: $(MAKE) -C paper clean test: @rm -rf _verify/results && mkdir -p _verify/results @cp results/rq4_greeks_decay.csv results/rq5_model_comparison.csv results/rq5_feature_importance.csv results/descriptive_options_quality.csv _verify/results/ @set -e; for s in $(LEGACY_SCRIPTS); do echo "\n=== $$s --legacy ==="; $(ENV) WP7_RESULTS_DIR=$$PWD/_verify/results $(PY) $$s --legacy; done $(PY) docs/verify/compare_results.py results _verify/results $(PY) tests/test_inference.py revision: @set -e; for s in $(REVISION_SCRIPTS); do echo "\n=== $$s ==="; $(ENV) $(PY) $$s; done tables: @set -e; for s in $(TABLE_SCRIPTS); do echo "\n=== $$s ==="; $(PY) $$s; done