Beta
Cov(stock daily return, SPY daily return) ÷ Var(SPY daily return) over the trailing 252 trading days. Stock closes come from a direct yfinance bulk download (yf.download with auto_adjust=True over a 3y window) — this path bypasses the project's adjusted_returns split-factor seam; the SPY benchmark closes come from stored intel_daily_bars (no live fetch at compute time) and also bypass that seam, read as a raw pct_change. The two return series are date-aligned and NaN-dropped (pd.concat axis=1, sort=True, dropna) before the regression. The denominator uses population variance (ddof=0) while the covariance uses the sample default, but the identical N cancels in the ratio so beta is unbiased.
Beta tells you how much of a stock's price noise comes from broad market swings versus company-specific events. A high beta amplifies whatever macro thesis you hold — if you expect the market to fall, high beta deepens that risk; if you expect a rally, it magnifies it. Low beta stocks add ballast when you're uncertain on the macro direction. It does not say anything about whether the company itself is cheap, overvalued, or fundamentally sound — pair it with alpha and R² to see whether the market-linked moves even dominate the story.
1.0 means the stock has historically moved in lockstep with the S&P 500. Above 1.0 it swings more than the market on most days; below 1.0 it swings less. A reading of 1.5 means the stock has historically moved ~50% more than SPY on a typical day in either direction. Near 0 means market-wide moves have almost no systematic pull on this name.
Negative (inverse movers, rare), 0 (no market correlation), 0.3–0.7 (typical defensives/staples/utilities), 0.8–1.2 (broad-market-tracking large caps), 1.2–2.0 (growth/tech/small-caps), above 2.0 (leveraged exposures, meme stocks, early-stage names). No hard mathematical ceiling.
Backward-looking over one year of returns — a stock that was low-beta during a calm period can spike dramatically once a company-specific shock arrives, and the beta won't update until the next nightly run.