STRASMORE/EXPLORE 2,173 QUERIES 22Y EQUITIES · 12Y OPTIONS

2,173 answered market questions

every one with its exact SQL, its result and the date it was computed · free, no signup

Kelly Criterion Position Sizing, Measured
Kelly inputs from daily closes, 2016 through 2025: win rate, average gain, average loss, and the fraction the formula returnstable · 2026-07-31 · 6×5 The same Kelly calculation on the S&P 500 tracker, year by year, 2016 through 2025table · 2026-07-31 · 10×5 One decade of S&P 500 daily returns compounded at eight fixed bet sizes: ending wealth and worst drawdownranking · 2026-07-31 · 8×3Preview: 8 ranked values, smallest first.
Kelly inputs from daily closes, 2016 through 2025: win rate, average gain, average loss, and the fraction the formula returns

Kelly inputs from daily closes, 2016 through 2025: win rate, average gain, average loss, and the fraction the formula returns

most recentas of table 6×5read in context →
Kelly inputs from daily closes, 2016 through 2025: win rate, average gain, average loss, and the fraction the formula returns — 6 rows by 5 columns, computed from US exchange, SIP and OPRA data.
tickerwin_rate_pctavg_gain_pctavg_loss_pctfull_kelly_x
SPY55.30.710.7610.1
MSFT54.11.171.167.4
JNJ51.80.790.775.8
KO530.760.84.4
NVDA54.62.282.33.8
TSLA522.712.642
the exact SQL behind every number
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'NVDA', 'TSLA')
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
steps AS (
    SELECT ticker, dt, c,
           lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt
                               ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT ticker, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0 AND c != prev
)
SELECT ticker,
       round(100 * countIf(ret > 0) / count(), 1) AS win_rate_pct,
       round(100 * avgIf(ret, ret > 0), 2) AS avg_gain_pct,
       round(100 * abs(avgIf(ret, ret < 0)), 2) AS avg_loss_pct,
       round(countIf(ret > 0) / count() / abs(avgIf(ret, ret < 0))
             - countIf(ret < 0) / count() / avgIf(ret, ret > 0), 1) AS full_kelly_x
FROM rets
GROUP BY ticker
HAVING countIf(ret > 0) > 0 AND countIf(ret < 0) > 0
ORDER BY full_kelly_x DESC
$