StockCheck / README.md
Aluode's picture
Upload 6 files
3151dff verified
|
Raw
History Blame Contribute Delete
3.16 kB
metadata
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, 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.