{"slug":"what-is-the-efficient-market-hypothesis","qid":"yearly","label":"The index against the names inside it: calendar years 2021 to 2025, a 34-name large-cap basket","post_title":"What Is the Efficient Market Hypothesis?","post_url":"/blog/what-is-the-efficient-market-hypothesis#q-yearly","columns":["year","index_return_pct","median_stock_return_pct","stocks_measured","pct_beating_index"],"rows":[{"year":"2021","index_return_pct":28.7,"median_stock_return_pct":18.9,"stocks_measured":34,"pct_beating_index":38.2},{"year":"2022","index_return_pct":-20,"median_stock_return_pct":-13.3,"stocks_measured":34,"pct_beating_index":58.8},{"year":"2023","index_return_pct":24.8,"median_stock_return_pct":9.8,"stocks_measured":34,"pct_beating_index":41.2},{"year":"2024","index_return_pct":24,"median_stock_return_pct":12.7,"stocks_measured":34,"pct_beating_index":32.4},{"year":"2025","index_return_pct":16.6,"median_stock_return_pct":10.1,"stocks_measured":34,"pct_beating_index":35.3}],"shape":"table","sql":"WITH daily AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,\n           argMax(toFloat64(close), window_start) AS close_px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('SPY','AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','JPM','XOM','JNJ','WMT','PG','KO','PEP','HD','MRK','LLY','COST','CVX','ORCL','CSCO','INTC','VZ','MCD','NKE','DIS','CAT','HON','TXN','AMD','NFLX','MO','LMT','UNH')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-01-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2025-12-31')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker, dt\n),\nper_year AS (\n    SELECT ticker, toYear(dt) AS yr,\n           argMin(close_px, dt) AS first_px,\n           argMax(close_px, dt) AS last_px\n    FROM daily\n    GROUP BY ticker, yr\n),\nperf AS (\n    SELECT yr, ticker, (last_px / first_px - 1) * 100 AS ret_pct FROM per_year\n),\nbench AS (\n    SELECT yr, ret_pct AS index_pct FROM perf WHERE ticker = 'SPY'\n)\nSELECT toString(perf.yr) AS year,\n       round(any(bench.index_pct), 1) AS index_return_pct,\n       round(median(perf.ret_pct), 1) AS median_stock_return_pct,\n       countIf(perf.ticker != 'SPY') AS stocks_measured,\n       round(100 * countIf(perf.ticker != 'SPY' AND perf.ret_pct > bench.index_pct)\n             / countIf(perf.ticker != 'SPY'), 1) AS pct_beating_index\nFROM perf\nINNER JOIN bench ON perf.yr = bench.yr\nGROUP BY perf.yr\nORDER BY perf.yr","computed_at":"2026-07-31T03:10:47.953530+00:00","elapsed":0.004050315}