--- name: whale-hunting description: Detect institutional whale activity in options for a given underlying. Use when the user asks about unusual options activity, large block trades, whale trades, or institutional options flow for a specific symbol. dependencies: ["trading-skills"] --- # Whale Hunting Scans option chains for a given underlying to identify institutional-sized trades using a two-step approach: 1. **Crude scan** (Yahoo Finance) — finds contracts with anomalous daily investment vs the rest of the chain. 2. **Precise drill-down** (Massive API) — fetches per-second bars for each candidate and flags seconds with outlier dollar invested. ## Instructions > **Note:** If `uv` is not installed or `pyproject.toml` is not found, replace `uv run python` with `python` in all commands below. ```bash uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py SYMBOL [--months N] [--date YYYY-MM-DD] [--sigma F] [--sigma-z F] [--summary] ``` ## Arguments - `SYMBOL` — Underlying ticker (e.g. `AAPL`, `NVDA`, `SPY`) - `--months` — Max months until option expiration to consider (default: 2) - `--date` — Trading date to analyze in `YYYY-MM-DD` format (default: latest trading day) - `--sigma` — Std-deviation multiplier for crude outlier threshold (default: 3.0) - `--sigma-z` — Modified Z-Score threshold for per-second small-sample detection (default: 3.5) - `--summary` — Also compute per-ticker summary and include it in the JSON output ## Output Returns JSON with: - `underlying` — The scanned symbol - `trading_date` — Date analyzed - `source` — `"massive"` (per-second data) or `"yahoo only"` (daily chain data) - `total_whales` — Total whale events found - `total_call_invested` — Sum of invested dollars in call whale events - `total_put_invested` — Sum of invested dollars in put whale events - `call_put_ratio` — Call invested / put invested (null if no puts) - `whales` — List of whale events: - `timestamp`, `ticker`, `type`, `strike`, `expiry` - `close`, `volume`, `transactions`, `invested`, `break_even` - `summary` *(present only when `--summary` is passed)* — List of per-ticker aggregates: - `ticker`, `type`, `strike`, `expiry`, `whale_count`, `total_invested`, `break_even` ## Examples ```bash # Hunt whales for AAPL (latest trading day) uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py AAPL # Hunt whales for NVDA on a specific date uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py NVDA --date 2026-03-13 # With per-ticker summary uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py HOOD --months 3 --summary # Looser detection threshold uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py SPY --sigma 2.0 ``` ## Reporting After running the script, present the results as follows. **Header line:** > Whale activity for **{underlying}** on {trading_date} — source: {source} > Call flow: ${total_call_invested:,.0f} | Put flow: ${total_put_invested:,.0f} | C/P ratio: {call_put_ratio:.2f} **When `--summary` was requested**, render the `summary` array as a table: | Time (ET) | Ticker | Type | Strike | Expiry | # Events | Total Invested | Break Even | |-----------|--------|------|--------|--------|----------|----------------|------------| | {timestamp} | {ticker} | {type} | {strike} | {expiry} | {whale_count} | ${total_invested:,.0f} | {break_even} | Sort by `total_invested` descending. For multi-event rows use the time range of first–last event (e.g. `11:46–12:33`). **Interpretation guidance:** - `source: "massive"` — High-confidence; per-second block trade data from Massive API - `source: "yahoo only"` — Fallback; daily-level data (Massive API key missing or no intraday data) - Low C/P ratio (< 0.5) — Bearish institutional positioning - High C/P ratio (> 2.0) — Bullish institutional positioning - `transactions: 1` — Single block trade; strongest whale signal ## Requirements - `MASSIVE_API_KEY` environment variable for per-second data. Without it, falls back to Yahoo Finance daily data. ## Timezone All timestamps and time-based calculations must use the `America/New_York` timezone. All JSON output must include `generated_at` (NY time string) and `data_delay` fields.