🧠 Does the Language of Artificial Intelligence Move Markets?
UQO Working Paper No. 0002 (FIRC-funded) — A Semantic Analysis of Russell 3000 SEC Filings and the Cross-Section of Stock Returns, 2010–2026 — Version 2.0, October 28, 2026 (Russell 3000 extension of the S&P 500 study, formerly WP 17 v1.1, archived in docs/paper_v1.1_sp500_20261026/). Research funded by the FIRC (Fonds institutionnel de recherche et de création, UQO).
TL;DR — We embed every Form 10-K, 10-Q and 8-K of ~2,500 U.S. firms (S&P 500 ∪ iShares Russell 3000 holdings, 527,548 filings, 2010–2026) with a sentence transformer, score each chunk against AI anchor concepts, and link the filing-year signal to look-ahead-free forward returns (July Y+1 → June Y+2), with S&P 500 members and the full universe reported side by side. In the broad market AI language carries a modest, persistent premium (EW Q5–Q1 +5.5 pp/yr, t = 2.4; Fama–MacBeth +3.1 pp/SD, t = 2.8; within-sector +1.5 pp/SD, t = 4.4), strongest among smaller firms before 2022. The post-ChatGPT jump replicates in the S&P 500 (+5.0 → +15.0 pp) but not in the Russell 3000 (+4.9 → +7.9, 2022 cohort negative, placebo break 2022 ranks 8/10, post-launch FF6 alpha −0.3 %/yr): it is a large-cap re-rating (largest 1,000 firms +2.9 → +12.8; event-study 1-year H−L +19.5 pp vs +9.9 for the rest). Disclosed AI projects (SPID database) carry no premium; 10-K language carries the strongest.
📌 Status
| Item | Value |
|---|---|
| Version | 2.0 (October 28, 2026) — Russell 3000 extension; à valider par les co-auteurs |
| Funding | FIRC (UQO) |
| Previous versions | v1.1 (S&P 500, 2026-10-17 review) and v1.0 (June 2026): docs/paper_v1.1_sp500_20261026/ |
| Code & data | v2.0 exhibits: produced by the committed scripts/r3k_00…07 at commit 3cf7560 from data/raw_russell3000/ (factor panel, filing-level scores, SPID counts, universe) and data/processed_r3k/ (Yahoo prices and SEC share counts of the 2026-10-28 vintage; sha256 manifest in UQO-WP-REVIEW/reproducibility/FIRC-0002/environment/inputs.sha256); these two directories are gitignored (≈ 320 MB) and must be deposited (spbgit release or M3U96b archive referenced by hash — pending author action) before the results can be called reproducible by a third party. The re-run of the committed chain reproduces results.json exactly, results2.json except the spid and double_sort_* blocks (stale at commit time) and results_event.json under the author's pandas 3.0.2 (see reproducibility/FIRC-0002/baseline_rerun_diff.txt). v2.1 review chain (scripts/r3k_10…23, scripts/run_all.sh, pinned requirements.lock, tests/test_regenerate.py): rebuilt panel (corrected market capitalization, cleaned returns, CIK-keyed), results in results/r3k_v2/. Raw filing text and embeddings come from the EDGAR Research Database (UQO WP 0001) and are not redistributed; FinData OS (FirstRate) raw closes are a licensed second price source (access documented in data/processed_r3k_v2/README.md). |
🏆 Headline results (Russell 3000 unless stated)
| Object | Estimate |
|---|---|
| Panel | 27,468 firm-years, 2,379 firms, formation years 2010–2024 (6,793 firm-years of S&P 500 members) |
| Full-sample Q5–Q1 spread (composite) | EW +5.5 pp/yr (t 2.41); VW +13.9 (t 2.59); S&P 500 members EW +7.0 (t 2.56) |
| Fama–MacBeth slope (composite) | +3.07 pp/SD (t 2.80); with sector dummies +1.46 (t 4.38); S&P 500 +2.07 (t 2.17) |
| Pre / post ChatGPT, Russell 3000 | +4.9 → +7.9 pp (post t 1.34); cohorts 2022/23/24 = −8.4 / +11.8 / +20.4; pooled post +8.2 (t 1.80), winsorized +3.0; post LS Sharpe 0.23 (pre 0.50) |
| Pre / post, S&P 500 members | +5.0 → +15.0 (t 2.21); cohorts +13.5 / −6.9 / +38.4; pooled +15.1 (t 2.22); post Sharpe 0.66 |
| Size | largest 1,000: +2.9 → +12.8 (t 2.09); remaining firms: +9.6 → +8.4; size-neutral full-sample +7.2 (t 2.73) |
| Placebo break dates | 2022 ranks 8th of 10 candidate first-post-cohorts (best: 2016) |
| Event study (IWV market, N = 2,226) | 1-year H−L +14.0 pp (Welch 3.94, CDA 2.21); 60 days +0.9; largest 1,000 +19.5 (5.09) vs rest +9.9 (1.55) |
| Sector | post-launch sector×year FE slope +0.10 (t 0.11); full-sample +0.88 (t 2.48); β_TECH 0.38 |
| Form-specific signals | 10-K only: pre +6.9 / post +16.7 (t 2.61), FM +4.66; 8-K only: +1.1 / +6.6; horse race 10-K +6.06 (1.71), 8-K +0.90 |
| SPID AI projects | tech-project quintile spread −1.9 (pre) / −1.3 (post); FM −0.22 (t −0.24) |
| Placebo factors (post) | ESG −15.9, climate −8.6, macro −16.3; cybersecurity +13.5, automation +7.8, AI disruption risk +22.8 |
🗂 Repository layout
ai-disclosure-stock-returns/
├── data/raw_russell3000/ # factor panels, filing_scores, filings, companies, universe.json, spid_firm_year_signals.csv (from the EDGAR DB)
├── data/processed_r3k/ # prices (Yahoo), SEC share history, FF factors, merged/analysis panels, LS series, event CARs
├── scripts/r3k_00..07_*.py # the v2.0 pipeline, in order (01: Yahoo prices · 01c: SEC share counts · 02: panel · 03: core · 04: extended · 05: event · 06: figures · 07: tables + macros)
├── results/r3k/ # results.json, results2.json, results_event.json, CSVs
├── figures/r3k/ # 14 figures (pdf + png)
├── paper/ # main.tex, sections/, appendix/, tables/ (generated, incl. macros.tex), figures_r3k/ → main.pdf
├── code/tex2docx/ # LaTeX → Word conversion (prep_tex.py, post_docx.py)
└── docs/ # v1.1 archive, review report, changelog🚀 Quick start (v2.1 review chain — Stage D, 2026-11-05)
uv venv .venv-review --python 3.12 && uv pip install --python .venv-review/bin/python -r requirements.lock
bash scripts/run_all.sh # 10 (prices, FF daily) → 12 (SEC shares) → 13/13b (FinData checks) → 14…18 (panel, core, extended, event, survivorship) → 19/20 (figures, tables) → latexmk
.venv-review/bin/python -I tests/test_regenerate.py --quick # schema / leakage / manifest checks; without --quick: full regeneration + diff at 1e-6🚀 Quick start (v2.0 committed chain)
python3 -m pip install -r requirements.txt
python3 scripts/r3k_00_factors.py && python3 scripts/r3k_01_download_prices.py && python3 scripts/r3k_01c_sec_shares.py
for s in 02_build_panel 03_analysis 04_extended 05_event_study 06_figures 07_tables; do python3 scripts/r3k_$s.py; done
cd paper && latexmk # → main.pdf (every number in the text is a macro from tables/macros.tex)