{"slug":"free-sql-api-stock-market-data","qid":"spy_iv_curve","label":"SPY implied volatility by days-to-expiry bucket, latest session","post_title":"Free SQL API for Stock Market Data","post_url":"/blog/free-sql-api-stock-market-data#q-spy_iv_curve","columns":["dte_bucket_days","avg_iv_pct"],"rows":[{"dte_bucket_days":0,"avg_iv_pct":22.8},{"dte_bucket_days":30,"avg_iv_pct":20.4},{"dte_bucket_days":60,"avg_iv_pct":18.5},{"dte_bucket_days":90,"avg_iv_pct":22},{"dte_bucket_days":120,"avg_iv_pct":27.1},{"dte_bucket_days":150,"avg_iv_pct":18.8},{"dte_bucket_days":210,"avg_iv_pct":21},{"dte_bucket_days":300,"avg_iv_pct":22.4},{"dte_bucket_days":360,"avg_iv_pct":21.2}],"shape":"ranking","sql":"SELECT least(floor(days_to_expiry / 30) * 30, 360) AS dte_bucket_days,\n       round(avg(implied_volatility) * 100, 1) AS avg_iv_pct\nFROM global_markets.options_greeks\nWHERE underlying_symbol = 'SPY'\n  AND date = (SELECT max(date) FROM global_markets.options_greeks)\n  AND iv_converged\n  AND days_to_expiry BETWEEN 1 AND 400\nGROUP BY dte_bucket_days\nORDER BY dte_bucket_days","computed_at":"2026-08-22T04:06:29.723443+00:00","elapsed":0.036615579}