Pablo Zavala · AI Safety Evaluation · Research Engineering

Reddit Headlines and Dow Volatility

A Carnegie Mellon big-data coursework notebook that asks whether words in daily Reddit news headlines predict the Dow. Across 3,183 filtered words, marginal regressions with Benjamini-Hochberg FDR control leave exactly one return-predictive word, damn, a survivor the notebook reads as minimal predictive ability rather than discovery; volatility keeps 12 words and carries genuine persistence. Adding previous-day volatility lifts the lasso from zero selected words to an in-sample R-squared of 0.262, a compact lesson in multiple testing and confounding.

Across 3,183 headline words at 10 percent FDR, returns keep one survivor (damn, p = 1.0262e-05) versus 12 words for volatility; adding previous-day volatility lifts the lasso from zero selected words to in-sample R-squared 0.262.

Public notebook repository

In-sample evidence from one executed notebook on a dataset ending July 1, 2016; the source CSVs stay outside the public repo for license reasons, so a rerun starts from the Kaggle download plus the derived word files the README documents.

Role: Solo coursework: sparse text pipeline, marginal screening with FDR, lasso and double lasso, bootstrap, and interpretation.

Evaluation Card

Primary output

Sample
One executed Jupyter notebook: 3,183 filtered words by 1,988 aligned trading days
Evaluator
Marginal OLS p-values, Benjamini-Hochberg FDR at q = 0.1, LassoCV with a time-series split, double lasso, bootstrap
Result
Returns keep a single FDR survivor while volatility keeps 12 words; previous-day volatility carries most of the predictable signal.
Limitation
In-sample fit on a single dataset that ends July 1, 2016.

Evidence level

Sample
Public repo with the executed notebook and README
Evaluator
Saved cell outputs and cell source, checkable without execution
Result
Each public number traces to a printed output or committed cell source in the notebook.
Limitation
The source CSVs stay external for license reasons; reruns need the Kaggle download plus two word files that arrive through the course rather than a public download.

Affiliation

Sample
Carnegie Mellon coursework
Evaluator
Notebook author line and file dates
Result
Spring 2025 graduate coursework; filesystem dates place the notebook at February 26, 2025 and the figure exports at March 29, 2025.
Limitation
Course handouts, prompts, and grading context stay private.

Page updated

Sample
July 2026
Evaluator
Site content ledger
Result
Entry drafted July 9, 2026 from the original executed notebook.
Limitation
Numbers reflect the notebook's saved outputs rather than a fresh rerun.
Evaluation axes with sample size, evaluator, result, and limitation.
AxisSampleEvaluatorResultLimitation
Primary outputOne executed Jupyter notebook: 3,183 filtered words by 1,988 aligned trading daysMarginal OLS p-values, Benjamini-Hochberg FDR at q = 0.1, LassoCV with a time-series split, double lasso, bootstrapReturns keep a single FDR survivor while volatility keeps 12 words; previous-day volatility carries most of the predictable signal.In-sample fit on a single dataset that ends July 1, 2016.
Evidence levelPublic repo with the executed notebook and READMESaved cell outputs and cell source, checkable without executionEach public number traces to a printed output or committed cell source in the notebook.The source CSVs stay external for license reasons; reruns need the Kaggle download plus two word files that arrive through the course rather than a public download.
AffiliationCarnegie Mellon courseworkNotebook author line and file datesSpring 2025 graduate coursework; filesystem dates place the notebook at February 26, 2025 and the figure exports at March 29, 2025.Course handouts, prompts, and grading context stay private.
Page updatedJuly 2026Site content ledgerEntry drafted July 9, 2026 from the original executed notebook.Numbers reflect the notebook's saved outputs rather than a fresh rerun.

How to Inspect This Work

Flat against spiked

Two histograms carry the core finding. Word-level p-values for returns spread evenly, the signature of noise, while the volatility panel piles up near zero; Benjamini-Hochberg turns that visual contrast into counts, one survivor against twelve.

Numbers trace to committed cells

Every number quoted on this page appears in a saved cell output or the committed cell source of the notebook, so a reader can verify each claim by opening the file before running anything.

Reader check

Open the committed notebook and check every quoted number against its saved outputs and cell source; that check runs on the file alone. A full rerun needs all four input CSVs: RedditNews.csv and DJIA.csv arrive via the README's Kaggle pointer, while WordsFinal.csv and WordFreqFinal.csv, the course-provided derived files the README describes, arrive through the course rather than a public download. One caution remains: the archived pass ran some cells out of order, so a clean rerun makes the fair test.

Case Study

Problem

Screening thousands of headline words against market outcomes guarantees apparent winners by luck alone, so the analysis has to separate discipline-surviving signal from noise that slips through the gate.

Setup

The notebook pairs 1,989 trading days of DJIA prices, newest dated July 1, 2016, with daily Reddit world-news headlines, builds a sparse day-by-word count matrix, and filters 5,271 candidate words down to 3,183.

Method

Marginal OLS regressions score each word twice, against daily returns and against log high-low volatility; Benjamini-Hochberg at q = 0.1 sets the discovery gate; LassoCV with a time-series split handles joint selection; a double lasso re-estimates volatility persistence against 1,429 selected word controls; a 30-resample bootstrap probes penalty stability.

Result

Returns behaved like noise: 121 of 3,183 words landed under p = 0.05, the p-value histogram ran flat, and the FDR gate kept exactly one word, damn, at p = 1.0262e-05. Volatility kept 12 words, led by tunisia, georgia, and terror, yet previous-day volatility beat them all: the words-only lasso zeroed every coefficient, while adding the one autoregressive term produced six selected coefficients, in-sample R-squared 0.262, and a persistence coefficient of 0.442 that the double lasso trimmed to 0.313.

Limitation

Everything stays in-sample on one dataset, the archived pass ran some cells out of order per the saved execution counts, and the notebook treats the exercise as feature-selection coursework rather than a tradable finding.

Evidence

The public repository ships the executed notebook whose saved outputs and cell source contain every quoted number, plus a README pointing to the Kaggle source data, which stays external for license reasons.

Key Outcomes

  • Exactly 1 of 3,183 words survived a 10 percent FDR for returns: damn, at p = 1.0262e-05, read as minimal predictive ability rather than discovery
  • 12 words survived the same gate for volatility at a cutoff of p = 0.00035710, led by tunisia, georgia, and terror
  • Words-only lasso zeroed every coefficient for both targets; previous-day volatility lifted in-sample R-squared from 0.0 to 0.262 with six selected coefficients
  • Double lasso trimmed volatility persistence from a naive 0.647 to 0.313 (standard error 0.0355) against 1,429 word controls
  • A 30-resample bootstrap pinned the lasso penalty at the 0.0001 grid floor with zero spread, a cautionary methods result

Methods

  • Sparse text featurization
  • Marginal screening
  • Benjamini-Hochberg FDR
  • Lasso with time-series cross-validation
  • Double lasso
  • Bootstrap resampling