Spaces:
Running
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'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, verdictschange.py/clutch.pyβ the shared engine from the companion Spacesapp.pyβ the Gradio app
Built by Antti Luode (PerceptionLab). Do not hype. Do not lie. Just show.