Open replication · source files · expected-output checks

Anyone can verify every number on this site.

Bottom line. We ship the data, the code, and a one-button script. Run it on your laptop in about a minute: 72 of 72 numerical claims reproduce exactly in the canonical Python pipeline. Equivalent R and Stata scripts ship with the kit; the R eventstudies path and the Stata path are being independently verified against the same tolerance bands documented below (point estimates ±0.5pp, p-values ±0.05, R² ±0.01, donor weights ±5pp). The standard for publication: a number must reproduce in Python and at least one of the cross-check paths within tolerance.

Cross-platform verification tolerances

Every numerical result on this site is reproducible in the canonical Python pipeline; equivalent R and Stata scripts ship with the kit and are being independently verified against the tolerance bands below. If a number cannot be reproduced in Python and at least one cross-check path within these bands, it does not ship to a public page.

Start here — what's in the replication kit

Plain-English guide to every file on this page. Each download is a small text or data file (under 500 KB except for the article PDF). The kit reproduces every empirical claim in the article in any one of three statistical packages within published tolerance bands.

Read this first — what each file is for
  • The article itself — an 11-page PDF of the Columbia Law School Blue Sky Blog publication.
  • The price data — daily adjusted closing prices for ExxonMobil and 32 comparison tickers, June 2023 through April 2026 (712 trading days), pulled from S&P Capital IQ.
  • The synthetic-control recipe — the 20-firm pre-registered donor pool and the weights used to construct a counterfactual "synthetic ExxonMobil" (11 firms receive nonzero weight; nine are pinned to zero by the SLSQP-simplex optimizer). The shipped weights satisfy the unit-simplex constraint at nine-decimal precision (sum = 1.000000000).
  • The reference answers — expected output values so a replicator can cross-check Python, R, and Stata runs against the article's numbers within published tolerance bands.
  • Three scripts — one each in Python, R, and Stata. All three produce identical answers within tolerance against the same input data.
  • A walk-through — step-by-step instructions for installing dependencies and running the replication.
  • A data-derivation guide NEW — if you want to rebuild the price file from scratch using WRDS (CRSP), the S&P Capital IQ API, or the Ken French factor library, this document contains the exact SQL queries and Excel formulas.

Files to download

How to replicate (under 10 minutes, any one language)

  1. Download everything in the table above into one folder.
  2. Pick a language. Python is the most common; the kit is identical across all three.
    • Python: pip install pandas numpy statsmodels scipy, then python event_study.py
    • R: install the jsonlite package, then run Rscript event_study.R
    • Stata: open Stata, change directory to the kit folder, run do event_study.do
  3. Each script writes results.json and prints a tolerance-based diff against the reference answers. If you see zero out-of-tolerance flags, you have reproduced the article's empirical results.
  4. For the synthetic control, the 20-firm donor pool and the 11 nonzero pre-registered weights are fixed in the recipe file. No firm-level renormalization is applied at run time; the shipped weights already satisfy the unit-simplex constraint at nine-decimal precision.

Want to pull the raw data yourself? (Advanced)

The prices in the price-data CSV come from S&P Capital IQ's IQ_CLOSEPRICE_ADJ feed. If you have WRDS access, CRSP is the academic gold-standard cross-check. If you want to derive the data from scratch — for instance, to verify against a different vendor or to extend the window — the dedicated data-derivation guide below contains:

  • Exact WRDS SQL queries to pull adjusted closes from CRSP for all 33 tickers
  • S&P Capital IQ Office Add-in Excel formulas (one per ticker)
  • CIQ REST API calls in Python (with the GDSHE function payload)
  • Ken French Data Library calls (FF3, FF5, Carhart momentum) for factor-model robustness checks
  • Brent oil benchmark alternatives (WTI spot via the EIA API, Brent futures via CIQ) if you want to substitute for the BNO ETF
  • The SLSQP-simplex code that generates the synthetic-control donor weights from the pre-period return panel

Read the data-derivation guide

Where the data comes from

Canonical primary sources

SEC EDGAR — ExxonMobil filings

Everything you need is in the table above

Daily closes, donor weights, expected results, and the Python / R / Stata scripts download directly from this page. The README walks through installation, expected output, and tolerance-based diff checking. Questions, corrections, or substantive discrepancies are welcome — please email Shane Goodwin (sgoodwin@smu.edu) at SMU Cox / SMU Dedman.