--- title: Did This Stock Actually Change emoji: ๐Ÿ“‰ colorFrom: red colorTo: green sdk: gradio sdk_version: 6.19.0 app_file: app.py pinned: false license: mit short_description: Which moves were real events, which were dice. No API key. --- # ๐Ÿ“‰ Did This Stock Actually Change? Financial charts make every wiggle look like a story; most wiggles are dice. Type a ticker (free Yahoo data via `yfinance`, **no API key**) and get the honest split: - **Shock events** โ€” days or clusters that broke out of the stock's normal movement, with dates and sizes ("โˆ’12.3%, sharpest day ~11ร— normal"). Detected by the [Clutch](https://huggingface.co/spaces/Aluode/Clutch2)'s leaky-integrator gate fed daily returns normalized by *past-only local* volatility โ€” so one outsized day trips it instantly, several stressed days in a row accumulate and trip it too (which a naive threshold misses), and a permanently rougher stock doesn't spam flags. - **Volatility regime changes** โ€” "a typical day went from ยฑ1.1% to ยฑ2.7% around 2025-09-17". Non-overlapping-window vols, strongest-split ratio test, day-level refinement. At most one per window: only the strongest is claimed. - **Drift vs luck** โ€” the period's total return compared against what pure chance could produce at this stock's wobble (2ฯƒยทโˆšn). Most yearly stock moves are **not** distinguishable from luck, and this page says so, which chart commentary never will. - **Free headlines** โ€” Yahoo's keyless news feed; if a flagged event is recent, the headlines may be the *why*. (Recent items only โ€” Yahoo's free feed can't be matched to events from months back.) ## Measured calibration (synthetic GBM suites, "normal" suspicion) - pure random walk, 60 seeds โ†’ **2.8 shock events/yr** (these are the year's genuinely biggest moves, labeled with their size in ร—-normal-day units โ€” the reader can judge) - a โˆ’9% overnight gap (5ร— daily vol) โ†’ detected **52/60** - three consecutive โˆ’2.2ฯƒ days (slow bleed a threshold misses) โ†’ detected **53/60** - constant volatility โ†’ false "regime change" **3/60**; a 1.2%โ†’2.8% vol change โ†’ detected **34/40**, flagged on average 9 days from the true day - the strict setting trades detection for silence (39/60 on the gap); the eager setting the reverse. The slider is the trade-off, stated. Real returns are fatter-tailed than GBM, so real tickers will show somewhat more events than 2.8/yr โ€” that is the data being eventful, not the detector lying. Known limits: Yahoo rate-limits shared servers occasionally (the app says so and retries work); very short histories (<40 days) are refused; the luck bound uses whole-period volatility, so a mid-window regime change widens it. Nothing is stored. This describes the past, predicts nothing, and is not investment advice or a recommendation to buy or sell anything. ## Files - `stock.py` โ€” data fetch (cached, keyless), news parser, shock gate, vol-regime test, verdicts - `change.py` / `clutch.py` โ€” the shared engine from the companion Spaces - `app.py` โ€” the Gradio app Built by Antti Luode (PerceptionLab). *Do not hype. Do not lie. Just show.*