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.
Verification scope
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.