fix: stop boosting names because a headline already reported the move

Three independent tests over 2026-08-01+, all negative:

  premarket news, any window      7.9% vs 8.6%  ran >=50%
  ...controlling for PM range    11.3% vs 21.0% ran >=50%
  intraday arrival, hour-matched 16.8% vs 24.6% ran >=10% forward

The feed explains it. Of 1,621 headlines delivered for screened names during
sessions: 61.7% reactive roundups ("Why X Shares Are Trading Higher", "20
Stocks Moving In..."), 2.7% law-firm spam, and 0.9% genuine catalyst PRs. The
wire reports the move after it happens, so a boost on "has a headline" buys the
late stage of a run. 11 of the 14 biggest runners (up to +912%) had no coverage
at all.

Set NEWS_RANK_BOOST to 1.0 (neutral). This also neutralises the binary fallback
restored in 9b4c8e5 -- correct in intent (a dead enrichment must not silently
disable news ranking) but it handed a flat 2x to any unclassified headline, and
62% of them are lagging roundups.

Deliberately unchanged:
  - the LLM path. catalyst_score = conviction * max(0, sentiment), so a roundup
    (type none, sentiment <= 0) scores 0 and earns nothing, while a real bullish
    catalyst still lifts. It targets the 0.9% correctly.
  - the dilution veto, which sinks confirmed offerings and is a separate,
    sound mechanism.
  - the enrichment-down alarm from 9b4c8e5.

Also evaluated and NOT shipped: halt-resumption as a catalyst feature. It is by
far the best signal in this universe -- a >=3min bar gap resuming >=2% up ran
>=25% afterwards 40-47% of the time vs ~11-20% baseline, holding in every hour
of the session. But a time-aware A/B of the armed set moved mean forward run
only 27.09% -> 27.84% and 165 -> 173 runners per 725 slots, because gap x rvol
already encodes it (a halting stock has high relative volume by definition).
Same collapse premarket range showed: strong univariate, near-zero marginal.
The ranking is saturated; selection is not where the remaining edge is.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A2LepdJfPCfK5Q8uznjFBM
This commit is contained in:
momentum devandClaude Opus 5 committed 2026-09-14 07:31:37 -05:00
1 parent 45b0386347
commit 4e0559501a
1 file changed
+12 -1
+12 -1
View File
@@ -15,7 +15,18 @@ NEWS_ENRICH_INTERVAL_SECONDS=120
NEWS_ENRICH_LOOKBACK_HOURS=12
NEWS_FEEDS=prnewswire=https://www.prnewswire.com/rss/news-releases-list.rss,businesswire=https://feed.businesswire.com/rss/home/?rss=G1QFDERJXkJeGVtRWQ==,globenewswire=https://www.globenewswire.com/RssFeed/orgclass/1/feedTitle/GlobeNewswire%20-%20News%20about%20Public%20Companies
NEWS_LOOKBACK_HOURS=8
NEWS_RANK_BOOST=2.0
# BLIND HEADLINE BOOST DISABLED (1.0 = neutral), 2026-09-14. Measured three ways
# over 2026-08-01+: premarket news 7.9% vs 8.6% ran >=50%; controlling for premarket
# range 11.3% vs 21.0%; and an hour-matched event study of intraday arrivals, 16.8%
# vs 24.6% ran >=10% forward. News arrival predicts LOWER forward returns, every time.
# The cause is the feed: of 1,621 headlines it delivered for screened names during
# sessions, 61.7% were reactive roundups ("Why X Shares Are Trading Higher") and 0.9%
# were genuine catalyst PRs. It reports the move after it happens, so boosting on it
# buys the late stage. The LLM path is UNAFFECTED and stays on: catalyst_score is
# conviction * max(0, sentiment), so a roundup scores 0 and earns no boost, while the
# dilution veto still sinks confirmed offerings. Only the blind "has a headline" 2x
# is removed. Restore by setting this to 2.0.
NEWS_RANK_BOOST=1.0
# Ollama lives on 11434 (the standard port). The stack pointed at 30068/4000 with
# a model that was never pulled, so catalyst enrichment produced nothing from
# 2026-08-03 to 2026-09-13 — silently, because enrich_recent_news reports failure