SECCited by ExxonMobil in its DEFA14A proxy solicitation — accession 0001193125-26-219305, filed 15 days before the May 27 voteRead on EDGAR →
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 guideNEW — 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)
Download everything in the table above into one folder.
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
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.
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
Daily prices for ExxonMobil and 32 peer tickers: S&P Capital IQ IQ_CLOSEPRICE_ADJ feed, 712 trading days, June 2023 → April 2026.
Synthetic-control donor weights: pre-registered SLSQP-simplex optimization on the 250-trading-day pre-event return panel (T−260 through T−11; T−1 = March 9, 2026). Weights frozen in xom_rerun_results.json on 2026-05-16. Sum to 1.000000000 at nine-decimal precision; 11 of 20 donor firms receive nonzero weight.
Factor returns: Ken French Data Library (FF3, Carhart 4-factor, FFC6) for cross-vendor robustness; CRSP via WRDS for academic-grade replication of adjusted closes.
Oil benchmark: United States Brent Oil Fund (BNO) daily returns; the data-derivation guide includes WTI spot and Brent futures alternatives.
13F ownership snapshot: S&P Capital IQ Public Ownership Detailed, mixed latest-available position dates (4,160 of 4,869 holders dated March 31, 2026; Vanguard, BlackRock, and a handful of other large holders remain at December 31, 2025). 4,869 total 13F-family filers in the universe.
SEC filings: direct EDGAR accession URLs for every PRE 14A, DEF 14A, DEFA14A, and 8-K cited.
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.