Risk-Aware Trading Agents

Home › Guides

Do news headlines predict stock returns? Ten news factors, tested point in time

We turned the 2020, 2022 and 2026 headlines behind Risk-Aware Trading Agents' research periods into ten daily news factors for 64 large US stocks, using only what was published before each close, and tested them against returns from the next open in 2020, 2022 and 2026. None of them survives, not even sentiment scored by a language model. Joined to prices by calendar date instead, the way many news backtests do it, headline sentiment looks like a real factor. The headlines are licensed and not distributed; the results are.

Get it on GitHub Backtesting with news The dataset

No news factor survives. Eight of ten are noise. Two (the number of headlines, and how many other companies they name) have a small negative one-day IC that momentum, reversal and low volatility absorb.

A language model reads headlines better, not well enough. Sentiment scored by gpt-5.6-luna has a one-day IC of 0.021 (t = 2.5), positive in all three years, but the price factors absorb it and it changes too fast to trade.

A calendar-date join makes one up. Lexicon sentiment joined by calendar date and tested close to close: rank IC 0.032 (t = 3.4), long-short 36.9 bp a day. Joined by publication time and traded from the next open: 0.005 (t = 0.6) and 7.4 bp.

Most of the gap is read early. Two-thirds of it, +0.018 of IC (t = 4.8), is news published after the close, and it shows up in each of the three years.

Joined by date, a factor appears

Take one factor, the mean lexicon score of a stock's headlines, and compute it twice. Joined by publication time, a headline counts from the first close after it was published, and the trade starts at the next open: what a trader could actually have done. Joined by calendar date, a headline published at 16:05 lands on the row of that day's 16:00 close, and a close-to-close return then starts before the headline existed.

Lexicon sentiment, one day, 2020 + 2022 + 2026Rank IC (t)Long-short a day
Publication time, from the next open (what could be traded)0.005 (0.6)7.4 bp
Publication time, close to close0.014 (1.5)7.8 bp
Calendar date, close to close (the shortcut)0.032 (3.4)36.9 bp
Calendar date, from the next open0.004 (0.4)5.6 bp

Only the shortcut reads the future. Holding the return window fixed (close to close), the calendar join adds +0.018 to the IC (t = 4.8), two-thirds of the gap to the honest replay. The calendar join with next-open returns does not leak, because the evening's news is out before the next open, and it is no better than the honest replay: the shortcut's edge is the overnight move after news that came out after the close.

Cumulative daily rank IC of headline sentiment in 2026, 2022 and 2020: the calendar-date join climbs while the publication-time join stays near zero in 2026 and falls in 2020

The gap is not one lucky year. The leak is +0.0157 (t = 1.8) in 2026, +0.0209 (t = 3.7) in 2022 and +0.0165 (t = 3.1) in 2020, and the package's verified news score shows the same pattern: 0.017 (t = 2.2) joined by date, -0.001 (t = -0.1) joined by time. So does the language model's sentiment, more strongly: 0.050 (t = 5.6) joined by date, 0.021 (t = 2.45) joined by time.

Mean one-day rank IC of lexicon sentiment, the verified news score and LLM sentiment under both joins, pooled and by year

How much moves: a calendar-date join puts 13% of the 2026 headlines and 62.5% of the 2026 SEC 8-K filings (companies report after the close) on an earlier trading day than their publication time allows, and 10% to 11% of the headlines in 2020 and 2022.

Ten news factors in three markets

Each factor is ranked across the 64 stocks every day and compared with the return from the next open to the open 1, 5 and 20 trading days later, on total-return prices. The t-statistics are Newey-West, and the price controls are 12-1 momentum, 1-week and 1-day reversal and 60-day low volatility.

Mean one-day rank IC of eleven news factors and four price factors, pooled with 95% intervals and by year
FactorVerdictIC, 1 day (t)IC, 5 days (t)After price controls (t)
LLM sentiment (gpt-5.6-luna)weak+0.021 (+2.49)+0.023 (+2.06)+1.09
Headline countweak-0.013 (-2.25)-0.010 (-1.00)-1.01
Co-mentionsweak-0.020 (-2.04)-0.018 (-1.40)-1.28
Attention anomalynoise-0.006 (-1.23)+0.004 (+0.58)-0.31
Lexicon sentimentnoise+0.005 (+0.55)+0.009 (+0.83)-0.17
Verified news scorenoise-0.001 (-0.09)-0.001 (-0.08)-1.05
Confirmed stories (2026)noise-0.005 (-0.53)+0.003 (+0.25)-0.31
Single-source storiesnoise-0.010 (-1.61)-0.008 (-0.71)-0.44
Red flagsnoise+0.008 (+0.99)+0.002 (+0.16)+0.82
Earnings 8-K (2026)noise-0.008 (-0.60)-0.010 (-0.77)+0.14
Noveltynoise+0.002 (+0.17)+0.005 (+0.41)-0.34
Momentum 12-1 (price, for reference)+0.027 (+2.26)+0.034 (+1.67)

Useful = pooled |t| at least 2 at one or five days, the same sign in every year, and still |t| at least 2 after the price controls (the Fama-MacBeth slope's t is shown). Confirmed stories and earnings 8-Ks exist in 2026 only: the 2020 and 2022 headlines come from one feed without SEC filings, so no story can be confirmed there.

Quintiles, decay and turnover

Next-day return of each quintile of six factors, against the day's mean

The top quintile of headline sentiment did a little better than the bottom one, 7.3 bp a day (t = 1.0), not enough to tell from chance. The factor replaces 85% of its top quintile every day, so that spread breaks even at 2.2 bp of cost per side, less than the package's default 5 bp slippage. Sentiment scored by the language model does a little better, 8.9 bp a day (t = 1.5), and changes just as fast (82% of its top quintile is new each day), so it breaks even at 2.7 bp. Momentum, for comparison, keeps 94% of its top quintile from one day to the next.

Rank IC of the one-day return k days after the decision, for headline sentiment, the verified news score, headline count and momentum

The decay curves of the news factors wander around zero from the first day on; momentum's stays flat and positive for a month.

The factors

Every value for a day uses only items published before that day's close (16:00 New York, 13:00 on early-close days). A test rewrites every headline published at or after a close, adds new ones, and checks that no feature up to that close changes.

Run it yourself

pip install risk-aware-trading-agents        # Python 3.10+
riskaware research factors                   # all three years, about 80 seconds
riskaware research factors --period 2022     # one year
riskaware research factors --llm             # add a sentiment factor scored by a local LLM (Ollama, free)

The run writes factors.json (every number), factors.md, the charts on this page and the daily ICs to a folder. With --llm, each headline gets a score from -1 to 1 from a model of your choice, cached so that it is scored once; the command prints the token estimate first and asks before a paid model starts. See docs/news-factors.md.

Limits

These are 64 of the largest US stocks, heavily covered and quickly priced; news may matter more for small caps. The news is headlines only, from one licensed feed, plus SEC 8-K filings in 2026. Decisions happen once a day after the close, so faster reactions to a headline are outside what daily bars can test. And a year per market is short: an IC of 0.01 needs several years to separate from zero.

Questions

Does news sentiment predict stock returns?

Not in this test. The lexicon sentiment of headlines published before the close has a one-day rank IC of 0.005 (t = 0.6) against returns from the next open, and none of the ten news factors survives the price controls.

How much does a calendar-date join inflate a news factor?

For headline sentiment, the IC goes from 0.005 to 0.032 and the long-short spread from 7.4 bp to 36.9 bp a day. Two-thirds of the difference, +0.018 of IC (t = 4.8), comes from headlines published after the close.

Can I run the news factor test myself?

With headlines, yes. The prices ship with the package; the headlines behind these results are licensed and not distributed, so riskaware research factors needs your copy of the headline files in ~/.riskaware/data/news, or headline files you build under the same rules from the free SEC 8-K filings, a news API key of your own or any CSV.

Can a language model score the headlines?

Yes. --llm scores each headline with a local model through Ollama for free, or with a paid API after showing the token estimate, and adds an LLM sentiment factor to the same tests; --llm-export and --llm-import run the scoring through any batch API instead. Scored by gpt-5.6-luna, it is the strongest news factor on this page (one-day IC 0.021, t = 2.5, positive in all three years), and the price factors still absorb it. A model trained after 2020 or 2022 may know what happened next, so its scores for those years are not blind; luna's IC is lowest in 2020, which is some comfort but no proof.

More guides

Backtest with news, without look-aheadPoint-in-time replay and a look-ahead check Point-in-time market dataPrices, VIX and news with SHA-256 hashes Test LLM trading agentsStep by step, blind, over MCP