Panel: Opus, Sonnet, Grok 3, Gemini Pro 3.1 Judge: Opus (via synthesis) Date: 2026-03-25 Grade: A (strong consensus on architecture and core metrics, minor dissent on OCC and Vanna/Charm)
Use GET /v3/snapshot/options/{underlying} — one call returns full chain with pre-calculated Greeks (delta, gamma, theta, vega, IV). No need to calculate Greeks from raw prices. Fix the broken options-collector.ts first (imports non-existent options-filter.ts). Replace with direct Polygon snapshot + DB insert.
All panelists converged on the same tiering:
Add TLT, GLD, HYG (Opus) — rate vol, inflation hedge, credit stress proxies. Takes list from 13 to 16.
The sharpest anchor for Kalshi Fed rate markets. CME publishes institutional-grade probability from Fed Funds futures. Compare directly to Kalshi price — CME is institutional money, Kalshi is retail. The gap is the edge.
All panelists agree: equity GEX is the most actionable mechanical signal.
GEX(K) = OI_calls(K) * Gamma(K) * 100 * S - OI_puts(K) * Gamma(K) * 100 * SStandard d2 uses ATM IV, but the probability of S > K depends on IV at strike K:
P_skew_adjusted = N(d2) using IV(K), not IV(ATM)skew_premium = P_skew_adjusted - P_atm_ivVRP = IV_30d - RV_30dVRP_zscore = (VRP - mean(VRP_history)) / std(VRP_history)effective_IV = IV - alpha * VRP (alpha ~0.5, calibrate empirically)Futures COT already flows via existing scraper. Options-only supplement (COTR) adds <8% marginal info. Correlation with futures-only COT is >0.92. Not worth separate download.
Second-order Greeks require intraday snapshots to be useful. Daily snapshots give stale values. Defer until intraday polling exists. Master GEX first.
Opus and Sonnet argue OCC gives definitive clearinghouse OI that differs from real-time by 5-15%. The OI delta (day-over-day change) reveals whether volume opened or closed positions — this changes the signal completely. Grok and Gemini argue Polygon is "99% as good."
RULING: Include OCC, but only for SPY and QQQ (not all 16 tickers). Two CSVs per day. The open/close distinction is worth having for the two tickers that drive all macro binary markets.
Need to know when earnings are to calculate event vol isolation. Without a calendar, you can't identify earnings-adjacent expirations.
RULING: Include. One daily scrape. Required for event vol stripping.
Gemini suggests NewsAPI for "news pressure" scoring. Valid concept but adds API cost ($449/mo at scale) and complexity. We already get sentiment signals from VIX/VVIX dynamics.
RULING: Defer. Not worth the cost when VIX suite already captures fear/uncertainty.
Gemini suggests scraping issuer sites for shares outstanding changes. Valid for institutional flow detection but low ROI relative to GEX which captures the same hedging pressure.
RULING: Defer. GEX is the better signal for the same underlying flow.
Fix: src/pipeline/data/options-collector.ts — Replace broken imports with direct Polygon snapshot:
GET /v3/snapshot/options/{underlying}?limit=250&apiKey=KEYoptions_chains table: ticker, timestamp, strike, expiry, call_put, iv, oi, volume, delta, gamma, theta, vega, last_price, underlying_priceNew: src/pipeline/data/options-occ.ts — OCC daily settlement CSVs:
options_occ_oi table: ticker, date, strike, expiry, call_put, oi, volume, oi_changeNew: src/pipeline/data/options-metrics.ts — Calculated from chain data:
CME FedWatch — Add to economics.ts or new fedwatch.ts:
Earnings Calendar — Add to new earnings-calendar.ts:
| Entry | Schedule | What |
|---|---|---|
| options-chains-tier1 | 9:15AM, 12:30PM, 3:30PM, 4:15PM ET weekdays | SPY, QQQ full chain snapshot |
| options-chains-tier2 | 9:15AM, 12:30PM, 4:15PM ET weekdays | NVDA, TSLA, AAPL, META chains |
| options-chains-tier3 | 4:15PM ET weekdays | MSFT, GOOGL, AMZN, JPM, XLE, IWM, TLT, GLD, HYG, VIX |
| options-occ | 6:30PM ET weekdays | OCC settlement CSVs for SPY, QQQ |
| options-metrics | 4:30PM ET weekdays (after chains) | Calculate all 8 metrics |
| fedwatch | 9:30AM, 12PM, 3PM, 4:30PM ET weekdays | CME FedWatch probabilities |
| earnings-calendar | 6AM ET daily | 14-day lookahead |
Build AFTER Phase 1-4 are stable. Uses call spread approximation for model-free probability:
prob(S_T > K) ≈ (C(K) - C(K+dK)) / dK * (1+r)^T
ensureTable() guardgetDb() from ../../db.js — better-sqlite3, SYNC, no awaitsafeFetch() with timeout and User-Agentpino logger per module.js extensions on all importsupdateFreshness() after every collection run