96 lines
3.7 KiB
SQL
96 lines
3.7 KiB
SQL
WITH base AS (
|
|
SELECT
|
|
"Symbol" AS symbol,
|
|
"ExpirationDate"::date AS expiry,
|
|
UPPER("CallPut") AS callput,
|
|
"Strike"::float AS strike,
|
|
"Spot"::float AS spot, -- replace/join if missing
|
|
"Volume"::float AS vol,
|
|
"OI"::float AS oi
|
|
FROM public."OptionsFlow_monthly"
|
|
WHERE "ExpirationDate" BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '30 days'
|
|
),
|
|
range_filtered AS (
|
|
SELECT *
|
|
FROM base
|
|
WHERE strike BETWEEN spot * 0.9 AND spot * 1.1
|
|
),
|
|
side_calc AS (
|
|
SELECT
|
|
symbol,
|
|
SUM(CASE WHEN callput = 'CALL' THEN vol ELSE 0 END) AS call_1m_vol,
|
|
SUM(CASE WHEN callput = 'PUT' THEN vol ELSE 0 END) AS put_1m_vol,
|
|
SUM(CASE WHEN callput = 'CALL' THEN oi ELSE 0 END) AS call_1m_oi,
|
|
SUM(CASE WHEN callput = 'PUT' THEN oi ELSE 0 END) AS put_1m_oi
|
|
FROM range_filtered
|
|
GROUP BY symbol
|
|
),
|
|
meta AS (
|
|
SELECT
|
|
symbol,
|
|
call_1m_vol, put_1m_vol, call_1m_oi, put_1m_oi,
|
|
(call_1m_oi + put_1m_oi) AS tot_oi,
|
|
CASE WHEN call_1m_oi > put_1m_oi THEN 'CALL'
|
|
WHEN call_1m_oi < put_1m_oi THEN 'PUT'
|
|
ELSE 'TIE' END AS dom_oi,
|
|
CASE WHEN call_1m_vol > put_1m_vol THEN 'CALL'
|
|
WHEN call_1m_vol < put_1m_vol THEN 'PUT'
|
|
ELSE 'TIE' END AS dom_vol
|
|
FROM side_calc
|
|
),
|
|
pretty AS (
|
|
SELECT
|
|
symbol,
|
|
-- K/M/B formatting
|
|
CASE
|
|
WHEN call_1m_vol >= 1e9 THEN to_char(((call_1m_vol/1e9)::numeric), 'FM999,999,990.0') || 'B'
|
|
WHEN call_1m_vol >= 1e6 THEN to_char(((call_1m_vol/1e6)::numeric), 'FM999,999,990.0') || 'M'
|
|
WHEN call_1m_vol >= 1e3 THEN to_char(((call_1m_vol/1e3)::numeric), 'FM999,999,990.0') || 'K'
|
|
ELSE to_char((call_1m_vol::numeric), 'FM999,999,990')
|
|
END AS "Call_1M_Vol",
|
|
CASE
|
|
WHEN put_1m_vol >= 1e9 THEN to_char(((put_1m_vol/1e9)::numeric), 'FM999,999,990.0') || 'B'
|
|
WHEN put_1m_vol >= 1e6 THEN to_char(((put_1m_vol/1e6)::numeric), 'FM999,999,990.0') || 'M'
|
|
WHEN put_1m_vol >= 1e3 THEN to_char(((put_1m_vol/1e3)::numeric), 'FM999,999,990.0') || 'K'
|
|
ELSE to_char((put_1m_vol::numeric), 'FM999,999,990')
|
|
END AS "Put_1M_Vol",
|
|
CASE
|
|
WHEN call_1m_oi >= 1e9 THEN to_char(((call_1m_oi/1e9)::numeric), 'FM999,999,990.0') || 'B'
|
|
WHEN call_1m_oi >= 1e6 THEN to_char(((call_1m_oi/1e6)::numeric), 'FM999,999,990.0') || 'M'
|
|
WHEN call_1m_oi >= 1e3 THEN to_char(((call_1m_oi/1e3)::numeric), 'FM999,999,990.0') || 'K'
|
|
ELSE to_char((call_1m_oi::numeric), 'FM999,999,990')
|
|
END AS "Call_1M_OI",
|
|
CASE
|
|
WHEN put_1m_oi >= 1e9 THEN to_char(((put_1m_oi/1e9)::numeric), 'FM999,999,990.0') || 'B'
|
|
WHEN put_1m_oi >= 1e6 THEN to_char(((put_1m_oi/1e6)::numeric), 'FM999,999,990.0') || 'M'
|
|
WHEN put_1m_oi >= 1e3 THEN to_char(((put_1m_oi/1e3)::numeric), 'FM999,999,990.0') || 'K'
|
|
ELSE to_char((put_1m_oi::numeric), 'FM999,999,990')
|
|
END AS "Put_1M_OI",
|
|
|
|
-- Highlight rules (dominance + divergence)
|
|
CASE
|
|
WHEN dom_oi = 'CALL' AND dom_vol = 'PUT' THEN '⚠️ OI CALL↑ / VOL PUT↑'
|
|
WHEN dom_oi = 'PUT' AND dom_vol = 'CALL' THEN '⚠️ OI PUT↑ / VOL CALL↑'
|
|
WHEN dom_oi = 'CALL' AND call_1m_oi >= put_1m_oi * 1.3 THEN 'CALL 🚀'
|
|
WHEN dom_oi = 'PUT' AND put_1m_oi >= call_1m_oi * 1.3 THEN 'PUT 🛑'
|
|
ELSE dom_oi
|
|
END AS "Highlight",
|
|
|
|
-- sort helpers
|
|
(CASE WHEN dom_oi <> dom_vol AND dom_oi <> 'TIE' AND dom_vol <> 'TIE' THEN 1 ELSE 0 END) AS diverge,
|
|
tot_oi,
|
|
GREATEST(call_1m_oi, put_1m_oi) AS big_side_oi
|
|
FROM meta
|
|
)
|
|
SELECT
|
|
symbol,
|
|
"Call_1M_Vol",
|
|
"Put_1M_Vol",
|
|
"Call_1M_OI",
|
|
"Put_1M_OI",
|
|
"Highlight"
|
|
FROM pretty
|
|
-- put divergence first, then overall liquidity:
|
|
ORDER BY diverge DESC, tot_oi DESC, big_side_oi DESC, symbol
|
|
LIMIT 100;
|